为什么Net :: HTTP在服务器返回503时返回500?

问题描述 投票:1回答:1

(此问题替换为this one,希望能提供更好的信息。)

我有三台服务器,我将它们分别称为Alice,Charlie和Harry(Harry是服务器的实际昵称,以免混淆自己)。他们彼此交谈以执行非常复杂的身份验证流程:

  • 一个客户通过爱丽丝对哈利的三个请求序列。
  • [第三个,哈利打电话给查理。
  • 查理在交通繁忙时容易超时。如果是这样,Harry将带有503标头的Retry-After返回给爱丽丝。
  • Harry 返回503,我已经在其自己的日志中确认了这一点。
  • Alice没有收到503,而是500,并且没有标题。
  • [Alice的其他客户端(我无法控制)将500与其他错误相同,这是我最终要解决的问题。

一些额外的信息,例如我已经确定的内容:

  • [爱丽丝使用RestClient代理给哈利的电话,后者在幕后使用Net::HTTP
  • 直接使用Net::HTTP会得到相同的结果。
  • 不是特定于环境;我在生产和开发中都遇到了这个问题。
  • 我一直在尝试使用Postman模拟Alice,但还没有运气;查理的交通目前比较安静,我无法强制或模拟超时,因此到目前为止,我仅获得了哈利200的成功回复。
  • 解决查理的超时问题显然是理想的,但我也不控制查理的硬件。

关于爱丽丝,我是否可以更改某些内容,以便它可以正确检测到哈利的503

或者,可能是关于Harry的某些东西在返回并登录后将其503更改为500

如果有帮助的话,这是爱丽丝(Alice)的第三个电话的代码,但对我而言丝毫不受影响;我一直在想RestClientNet::HTTP是否具有我不知道的某些配置。

http_verb = :post
args = [ # actually constructed differently, but this is a reasonable mock up
  'https://api.harry/path?sso_token=token',
  '',
  {
    'content_type' => 'application/json',
    'accept' => '*/*',
    # some other app-specific headers
  }
]

RestClient.send(http_verb, *args) do |response, request, result, &block|
  # `result` is present and has a 500 code at the start of this block if Harry returns a 503.
  @status_code = result.present? ? result.code : :internal_server_error
  cors.merge!( response.headers.slice(:access_control_allow_origin, :access_control_request_method) )
  @body = response.body
end
ruby-on-rails http-error net-http http-status-code-503
1个回答
0
投票

结果证明它比任何人所想都更简单,更明显。在负责返回503的中间件中引发了A

separate

错误。与其他任何异常一样,它被渲染为500导致它的原因是该行应该告诉客户端等待五秒钟,然后重试:

response.headers['Retry-After'] = 5

...某个中间件组件抱怨undefined method 'each' on 5:Fixnum,并且当我们将5更改为字符串时开始工作。
© www.soinside.com 2019 - 2024. All rights reserved.