Created
May 9, 2016 04:10
-
-
Save HotelCalifornia/6b3a47b4da97555d9781e8116e3fd909 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use v6; | |
my constant CRLF = "\r\n"; | |
my $listen = IO::Socket::INET.new(:listen, :localport(8080)); | |
loop { | |
my $conn = $listen.accept; | |
say $conn.recv(1024); | |
$conn.print("HTTP/1.1 200 OK{CRLF}{CRLF}"); | |
$conn.print('<h1>Hello World!</h1>'); | |
$conn.close; | |
} | |
class LocalServer { | |
has Int $.request-queue-size = 1; | |
has Supplier $.input-supplier = Supplier.new; | |
has Supply $.input-supply = $.input-supplier.Supply; | |
has Supplier $.error-supplier = Supplier.new; | |
has IO::Socket::INET $.sock; | |
has IO::Socket::INET $.client-connection; | |
has Str $.request-data; | |
# environment info from request | |
has Str $.request-method; | |
has Str $.request-uri; | |
has Str $.request-version; | |
has Int $.server-port = 8080; | |
submethod BUILD(:$server-port) { | |
$.sock = IO::Socket::INET.new(:listen, :localport($.server-port)); | |
} | |
method !handle-one-request { | |
$.request-data = $.client-connection.recv(1024); | |
my $request-data = $.request-data; | |
say $request-data; | |
self!parse-request($request-data); | |
my %env = self!get-env; | |
} | |
method !finish-response { | |
{ | |
my $status, my $response-headers Z= @.headers-set; | |
my $response = "HTTP/1.1 $response-headers{CRLF}"; | |
$response = join CRLF, @a.map({ "$_.key():$_.value()" }); | |
LEAVE $.client-connection.close; | |
} | |
} | |
method !parse-request($text) { | |
my $request-line = chomp (split "{CRLF}", $text)[0]; | |
$.request-method, $.request-uri, $.request-version Z= split " ", $request-line; | |
} | |
method serve-forever { | |
my $sock = $.sock; | |
loop { | |
$.client-connection = $sock.accept; | |
self!handle-one-request; | |
} | |
} | |
method !get-env { | |
%env = {}; | |
%env<REQUEST_METHOD> = $.request-method; | |
%env<REQUEST_URI> = $.request-uri; | |
%env<SERVER_PROTOCOL> = $.request-version; | |
%env<SERVER_PORT> = $.server-port.Str; | |
%env<p6w.version> = Version.new('v0.7.Draft'); | |
%env<p6w.url-scheme> = 'http'; | |
%env<p6w.input> = $.input-supply; | |
%env<p6w.errors> = $.error-supplier; | |
%env<p6w.multithread> = False; | |
%env<p6w.multiprocess> = False; | |
%env<p6w.run-once> = False; | |
%env; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment