我们有一个用 Delphi 编写的应用程序,它使用 Delphi On Rails并充当服务器并使用 HTTP、JSON 和 websockets 与客户端通信。我们最近遇到了一些问题,很难调试它们并找到问题的根源。
使用 Wireshark 进行流量分析,我们可以看到以下行为:有来自客户端的请求(HTTP GET 文件)。通常,我们处理该请求并发送 HTTP 状态代码、文件(如果未缓存)等。但是,我们有一个可重现的问题,其中只有 来自客户端的请求,来自服务器的 TCP SYN,但之后,服务器发送 RST 数据包,TCP 通信停止。
奇怪的是,我们可以很好地重现问题(尽管 RST 数据包中断通信的文件不同)并且在以下情况之一中它神秘地消失了:
由于我们在使用 Delphi On Rails 时遇到了一些问题并且不得不对其进行一些小的修改以避免访问冲突和调试异常,我怀疑 DOR 是罪魁祸首,一些奇怪的内存损坏或未捕获的异常是错误,但它是仍然令人困惑,尤其是如果我们改变焦点,问题就会消失。
我的主要问题不是如何解决这个问题,而是如何调试它以及在哪里寻找问题。 TCP 重置的来源也让我感到困惑,因为我们没有遇到 the usual procedures that process requests在那种情况下,似乎 DOR 或其他东西(应用程序、Winsock、操作系统)错误地重置了连接。
为了完整起见,因为它可能是相关的,这里是我在 Delphi On Rails 项目中报告的问题以及我向 madExcept 作者询问该问题的论坛主题:Issue #6 , Issue #7 , Issue #8 , forum entry .
最佳答案
作为测试,我们从版本控制中检查了一些没有连接问题的旧 DOR 源,并且它没有显示任何上述问题。
因此我们决定反过来解决问题:将 DOR 特定的源代码(大约 20 个文件)回滚到上一个稳定版本并逐个“重新更新”它,直到再次出现错误。如果发生这种情况,我们可以
编辑:我们现在可以将除一个文件以外的所有文件更新回旧状态,而不会出现连接问题。产生问题的文件是 dorSynchronizer.pas,更准确地说是 r179导致问题的文件的一部分——线程已从 Windows API 更改为 Delphi TThread。我们将对此进行进一步调查,并可能在未来几天向 DOR 项目添加一个问题。
EDIT2:事实证明,DOR 使用了已弃用的过程 TThread.Suspend 和 TThread.Resume,这可能会导致未定义的行为。我举报了an issue到 DOR 项目。
关于delphi - 某些 HTTP 请求上的奇怪 TCP 重置 (RST),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9691604/
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba