(此问题替换为this one,希望能提供更好的信息。)
我有三台服务器,我将它们分别称为Alice,Charlie和Harry(Harry是服务器的实际昵称,以免混淆自己)。他们彼此交谈以执行非常复杂的身份验证流程:
503
标头的Retry-After
返回给爱丽丝。503
,我已经在其自己的日志中确认了这一点。503
,而是500
,,并且没有标题。500
与其他错误相同,这是我最终要解决的问题。一些额外的信息,例如我已经确定的内容:
RestClient
代理给哈利的电话,后者在幕后使用Net::HTTP
。Net::HTTP
会得到相同的结果。200
的成功回复。关于爱丽丝,我是否可以更改某些内容,以便它可以正确检测到哈利的503
?
或者,可能是关于Harry的某些东西在返回并登录后将其503
更改为500
?
如果有帮助的话,这是爱丽丝(Alice)的第三个电话的代码,但对我而言丝毫不受影响;我一直在想RestClient
或Net::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
结果证明它比任何人所想都更简单,更明显。在负责返回 separate503
的中间件中引发了A 500
。导致它的原因是该行应该告诉客户端等待五秒钟,然后重试:
response.headers['Retry-After'] = 5
...某个中间件组件抱怨undefined method 'each' on 5:Fixnum
,并且当我们将5
更改为字符串时开始工作。