我尝试使用TCPServer编写一个小型ruby服务器,但无法从浏览器的响应中获取cookie列表。下面是服务器的代码 - 它将为除js以外的所有连接提供相同的html。
require 'socket'
server = TCPServer.new('localhost', 2000)
class Serveit
def initialize(socket, content)
@socket = socket
@content = content
end
def content
# @content
@content = File.read('./partials/header.html.erb')
end
def socket
@socket
end
def url
@url = @socket.gets.split(' ')[1]
end
def request
@socket.gets
end
end
loop do
s = Serveit.new(server.accept, rand(1..100000000).to_s)
if s.url == "/js"
content = File.read('app.js').to_s
s.socket.print "HTTP/1.1 200 OK\r\n" + "Content-Type: application/javascript\r\n" + "Content-Length: #{content.bytesize}\r\n" + "Connection: close\r\n"
s.socket.print "\r\n"
s.socket.print content
s.socket.close
else
s.socket.print "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n" + "Content-Length: #{s.content.bytesize}\r\n" + "Connection: close\r\n"
s.socket.print "\r\n"
s.socket.print s.content
s.socket.close
end
end
.js文件内容是一个简单的document.cookie来设置cookie。我尝试使用CGI获取列表,但我可以管理的是在终端上提示手动插入cookie。
我的理解是你应该捕获包含cookie的浏览器响应标题,但我无法弄清楚如何做到这一点。
答案 0 :(得分:1)
要获取所需的cookie,headers = []
while (line = @socket.gets) != "\r\n"
headers << line
end
来自套接字的所有标头:
gets
这将是headers
一行文字,直到你输入一个空行。
这样,Cookie:
变量将包含请求中所有未解析的标头。您可以在前缀为https://maps.googleapis.com/maps/api/js
的标头中找到浏览器Cookie。
我完成了一个玩具项目,我用纯红宝石实现了一个Web服务器,你可以查看我的http parser here。