Ruby中的简单HTTP服务器

时间:2015-06-27 13:03:57

标签: ruby http server

我正在构建一个简单的HTTP服务器,并且在处理POST请求时遇到一些问题。以下是创建它的方法:

def make_post_request
    puts "Enter the name: "
    name = gets.chomp
    puts "Enter the email: "
    email = gets.chomp

    data = { person: { name: name, email: email } }
    puts data.to_json

    request = "POST /thanks.html HTTP/1.0\nContent-Length: #{data.to_s.length}\r\n\r\n#{data.to_json}"

    return request
end

这是服务器代码(未完整):

    request = ""

    while line = client.gets
        request << line.chomp
    end

问题是服务器没有收到&#34; \ r \ n \ r \ n \ n&#34;之后的部分,我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

从您的代码中确切地知道您正在做什么,但我怀疑您的问题是您依赖于gets,它将尝试从IO对象返回一个完整的行。这意味着它将继续阻塞等待套接字中的换行符(或者它被关闭)。

由于您的数据不以换行符结束,并且客户端可能正在等待响应(因此不会关闭连接),服务器正在等待从未到来的换行符。

您可以在请求的末尾添加\n,这可能会使您的代码在此工作,但通常使用正文解析HTTP消息比这更棘手。基本方法是解析标题并提取内容长度,然后您可以从正文中读取那么多字节,并且您将知道已到达消息的末尾。当然,如果你开始考虑像分块传输编码这样的事情,这会变得更加复杂。