Ruby自制Web服务器中字符串比较不匹配问题求助
问题分析与解决方案
核心问题出在words变量的类型上:
words = IO.readlines("requests.txt").last(1)
IO.readlines返回的是字符串数组,last(1)方法会返回一个包含最后一行的数组(比如["Username=test&Password=1234"]),你用它和字符串"Username=test&Password=1234"直接对比,数组与字符串永远不可能相等,因此if分支始终不会执行。
快速修复
把last(1)改成last,直接获取最后一行的字符串:
words = IO.readlines("requests.txt").last
如果坚持使用last(1),则取数组的第一个元素:
words = IO.readlines("requests.txt").last(1).first
优化建议(避免不必要的文件操作)
当前写入文件再读取的操作完全冗余,直接从req参数提取表单数据更高效,还能规避文件读写的潜在问题:
class Parser def parse(req, clients) # 从HTTP请求中提取POST表单数据(假设为POST请求) form_data = req.split("\r\n\r\n").last if form_data == "Username=test&Password=1234" success(clients) else # 处理不匹配的情况,避免重复发送响应 response(clients) end end end
额外注意事项
- 当前代码不管if分支是否执行,都会调用
response(client),这会向客户端发送两次HTTP响应,导致浏览器解析异常。建议将response(client)移至Parser的parse方法中,用else分支处理不匹配场景。 - HTTP响应头需补充必要字段,比如
Content-Type和Content-Length,否则浏览器可能无法正确渲染页面:
def success(succ_client) success_file = File.read("templates/success.html") headers = [ "HTTP/1.1 200 OK", "Content-Type: text/html; charset=UTF-8", "Content-Length: #{success_file.bytesize}", "\r\n" ].join("\r\n") succ_client.puts(headers + success_file) end
内容的提问来源于stack exchange,提问作者DammDamm
相关产品推荐
相关产品推荐

