ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-09 03:09:47  阅读:171  来源: 互联网

标签:json nginx ruby passenger net-http


我在NginX / Phusion Passenger服务器下使用Ruby Net :: HTTP,试图将JSON字符串发送到服务器.看来我的POST只在作为’application / json’发送时,过早地关闭了到服务器的会话.即:

在服务器端:

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)

客户端调试会话是:

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的新手,也是这种网络编程的新手.

上面的代码片段使用send_request方法,但我也尝试过post和post2,结果相同.

我真的很怀疑,只要在我的initheader中使用’application / json’,一切都会中断.当我删除它,一切正常.

解决方法:

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

标签:json,nginx,ruby,passenger,net-http
来源: https://codeday.me/bug/20190709/1408309.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有