使用 ruby 获取浏览器 cookie 列表

Getting list of browser cookies with ruby

我正在尝试使用 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 的浏览器响应 headers,但我不太清楚该怎么做。

要获取 cookie,您需要 gets 来自套接字的所有 header:

headers = []
while (line = @socket.gets) != "\r\n"
  headers << line
end

这将 gets 一行文本,直到您遇到空白行。

这样,headers 变量将包含请求中所有未解析的 header。您可以在前缀为 Cookie:.

的 header 中找到浏览器 cookie

我完成了一个玩具项目,我用纯 ruby 实现了一个 Web 服务器,你可以查看我的 http parser here