gpt4 book ai didi

Ruby Web 服务器在尝试解析 HTTP 请求时挂起

转载 作者:可可西里 更新时间:2023-11-01 16:41:45 25 4
gpt4 key购买 nike

我正在做一项作业,要求我在不使用任何库的情况下用 Ruby 实现一个网络服务器。我有一个基本的服务器设置来返回 “Hello World” 响应,我准备好进入下一步。

下一步是根据 HTTP 请求生成 HTTP 响应。这是我遇到问题的地方,似乎我程序中的 while 循环导致服务器挂起。

Web 服务器的代码:

require 'socket'

server = TCPServer.new('localhost', 2345)

http_request = ""

loop do

socket = server.accept
request = socket.gets

while line = socket.gets
puts line
http_request << line
end

response = "Hello World!\n"

socket.print "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/plain\r\n" +
"Content-Length: #{response.bytesize}\r\n" +
"Connection: close\r\n"

socket.print "\r\n"

socket.print response

puts "DONE with while loop!"

socket.close
end

在上面的代码中,我试图将 HTTP 请求放入字符串 http_request 中并解析它以确定我想要生成哪个 HTTP 响应。我已经在没有 while 循环的情况下测试了我的代码,并且能够使用 localhost:2345/test 在我的浏览器中访问 Hello World 页面。但是,随着 while 循环的添加,我无法再加载页面,并且字符串 "DONE with while loop!" 永远不会打印到控制台中。

有谁知道我的网络服务器挂起的原因?我是不是完全错误地处理了这个问题?

最佳答案

在发送所有请求后,您对 socket.gets 的调用将继续等待更多数据,从而阻止任何进一步的进展。它无法知道这是一个 HTTP 调用并且请求已经完成。

A HTTP request由标题和指示标题结尾的空行组成。您的代码需要注意这个空行。您可以通过将循环更改为这样的方式来做到这一点:

while (line = socket.gets).chomp != ''

这将适用于没有正文的请求,例如 GET,但是当处理带有正文的请求时,事情会变得更加困难。在这种情况下,您将需要解析 Content-Length 的 header ,以便了解要从套接字读取多少数据。 chunked 更复杂请求,你可能不需要在你的任务中走那么远。

关于Ruby Web 服务器在尝试解析 HTTP 请求时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32665884/

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