gpt4 book ai didi

ruby - 我做错了吗还是net/http中的错误?

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:00 25 4
gpt4 key购买 nike

我在 NginX/Phusion Passenger 服务器下使用 Ruby Net::HTTP,试图将 JSON 字符串发布到服务器。看来我的 POST 仅在作为“application/json”发送时过早地关闭了与服务器的 session 。即:

在服务器端:

127.0.0.1 - - [03/Sep/2013 07:47:14] "POST /path/to/submit " 200 45 0.0013
pid=12893 thr=47197563169088 file=ext/nginx/HelperAgent.cpp:933 time=2013-09-03 07:47:14.830 ]: Uncaught exception in PassengerServer client thread:
exception: Cannot read response from backend process: Connection reset by peer (104)
backtrace:
in 'void Client::forwardResponse(Passenger::SessionPtr&, Passenger::FileDescriptor&, const Passenger::AnalyticsLogPtr&)' (HelperAgent.cpp:698)
in 'void Client::handleRequest(Passenger::FileDescriptor&)' (HelperAgent.cpp:859)
in 'void Client::threadMain()' (HelperAgent.cpp:952)

客户端调试 session 是:

opening connection to hostname.com...
opened
<- "POST /path/to/submit HTTP/1.1\r\nContent-Type: application/json\r\nAccept: application/json\r\nUser-Agent: agent+test\r\nConnection: close\r\nHost: hostname.com\r\nContent-Length: 660\r\n\r\n"
<- "[{json string}]"
-> "HTTP/1.1 301 Moved Permanently\r\n"
-> "Server: nginx/1.2.6\r\n"
-> "Date: Tue, 03 Sep 2013 14:47:15 GMT\r\n"
-> "Content-Type: text/html\r\n"
-> "Content-Length: 184\r\n"
-> "Connection: close\r\n"
-> "Location: https://hostname.com/path/to/submit\r\n"
-> "\r\n"
reading 184 bytes...
-> "<html>\r\n<head><title>301 Moved Permanently</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>301 Moved Permanently</h1></center>\r\n<hr><center>nginx/1.2.6</center>\r\n</body>\r\n</html>\r\n"
read 184 bytes
Conn close
opening connection to hostname.com...
opened
<- "POST /path/to/submit HTTP/1.1\r\nContent-Type: application/json\r\nAccept: application/json\r\nUser-Agent: agent+test\r\nConnection: close\r\nHost: hostname.com\r\nContent-Length: 660\r\n\r\n"
<- "[{json string}]"
-> "HTTP/1.1 200 OK\r\n"
-> "Content-Type: text/html;charset=utf-8\r\n"
-> "Content-Length: 45\r\n"
-> "Connection: close\r\n"
-> "Status: 200\r\n"
-> "X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 3.0.17\r\n"
-> "X-Frame-Options: SAMEORIGIN\r\n"
-> "X-XSS-Protection: 1; mode=block\r\n"
-> "X-Content-Type-Options: nosniff\r\n"
-> "Server: nginx/1.2.6 + Phusion Passenger 3.0.17 (mod_rails/mod_rack)\r\n"
-> "Strict-Transport-Security: max-age=31536000\r\n"
-> "X-Frame-Options: DENY\r\n"
-> "\r\n"
reading 45 bytes...
-> "some url string" <-- this is suspicous to me.
read 45 bytes
Conn close

我用来提交数据的代码是:

private
def _http_client(method = 'get', location = nil, limit = 10)
raise ArgumentError, 'FATAL: too many HTTP redirects attempted...' if limit == 0
response = nil

if location.nil?
if @uri.nil?
raise ArgumentError 'FATAL: no location specified. Quitting.'
end
else
@uri = URI.parse(location)
end

client = Net::HTTP.new(@uri.host,@uri.port)
client.open_timeout = 15 # in seconds
client.read_timeout = 15 # in seconds
initheader = {'content-type' => 'application/json',
'accept' => 'application/json',
'user-agent' => UA ,}
client.set_debug_output $stderr # XXX TEMPORARY

if @uri.scheme == 'https'
client.use_ssl = true
client.verify_mode = 0
end

if method == 'post'
serialized = JSON.generate(@payload)
response = client.send_request('POST',@uri.path,serialized,initheader = initheader)
puts serialized
end

# Only intended for pings. In order to do
# full GETs (including query_params) this
# will need to be refactored a little.
if method == 'get'
response = client.get(@uri.path)
end

case response
when Net::HTTPSuccess
@status = true
when Net::HTTPMovedPermanently
@status = false
limit = limit - 1
_http_client(method,response['location'],limit)
when Net::HTTPClientError
$stderr.puts 'Client error.'
@status = false
when Net::HTTPServerError
$stderr.puts 'Server error.'
@status = false
else
$stderr.puts 'No idea what the server returned.'
@status = false
end

unless response.nil?
@response = {:code => response.code, :body => (response.body || 'OK')}
@code = @response[:code].to_s
@http_body = @response[:body].to_s
else
$stderr.puts 'response from server was empty. :('
end

_send_status
end

我正在使用:

  • ruby 版本:1.9.3p448
  • Nginx 1.2.6
  • 乘客 3.0.17

我很确定我可能做错了什么,但我是 Ruby 的新手,对这种 Web 编程还是半新的。

上面的代码片段使用了 send_request 方法,但我也尝试了 postpost2,结果相同。

我真的很怀疑,一旦我在我的 initheader 中使用“application/json”,一切都会崩溃。当我删除它时,一切正常。

最佳答案

尝试升级到 Phusion Passenger 4。它可以更好地处理 I/O 异步,并且在许多情况下可以避免过早的连接关闭问题。

关于ruby - 我做错了吗还是net/http中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18595233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com