2016-08-05 30 views
1

Ich versuche, einen winzigen Ruby-Server mit TCPServer zu programmieren, aber ich bekomme nicht den Hang, die Liste der Cookies aus der Antwort des Browsers zu bekommen. Im Folgenden ist der Code für den Server - es wird das gleiche HTML für alle Verbindungen außer js dienen.Liste der Browser-Cookies mit Ruby

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 

Der Inhalt der .js-Datei ist ein einfaches Dokument.cookie, um einen Cookie zu setzen. Ich habe versucht, die Liste mit CGI zu bekommen, aber alles, was ich verwalten kann, ist eine Aufforderung auf dem Terminal, manuell Cookies einzufügen.

Mein Verständnis ist, dass Sie die Browserantwortheader erfassen sollen, die die Plätzchen einschließen, aber ich kann nicht recht herausfinden, wie man das macht.

+0

Siehe auch die integrierte [webrick-Bibliothek] (http://ruby-doc.org/stdlib-2.3.1/libdoc/webrick/rdoc/WEBrick.html), eine einfachere Möglichkeit, einen winzigen HTTP-Server zu erstellen . Aber wenn Sie lernen möchten, wie HTTP-Server funktionieren, dann machen Sie weiter. –

+0

könnten Sie eine andere Bibliothek wie [diese Bibliothek] (http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html) benötigen, um das meiste davon für Sie zu tun? –

Antwort

1

Um die Cookies erhalten Sie die Header aus der Steckdose zu gets alle brauchen:

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

Dies wird eine Textzeile gets, bis Sie eine leere Zeile getroffen.

Damit wird die headers Variable alle nicht geparsten Header aus der Anfrage enthalten. Sie finden die Browser-Cookies in einer Kopfzeile mit dem Präfix Cookie:.

Ich beendete ein Spielzeugprojekt einmal, wo ich einen Webserver in purem Rubin implementierte, können Sie meine http parser here überprüfen.