(此问题代替了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
答案 0 :(得分:0)
结果证明,这比任何人想象的都更简单,更明显。
在负责返回503
的中间件中引发了 separate 错误。与其他任何异常一样,它被渲染为500
。
引起此问题的原因是,该行应该告诉客户端等待五秒钟,然后重试:
response.headers['Retry-After'] = 5
...某个中间件组件抱怨undefined method 'each' on 5:Fixnum
,并且在我们将5
更改为字符串时开始工作。