Skip to content

Instantly share code, notes, and snippets.

@HotelCalifornia
Created May 9, 2016 04:10
Show Gist options
  • Save HotelCalifornia/6b3a47b4da97555d9781e8116e3fd909 to your computer and use it in GitHub Desktop.
Save HotelCalifornia/6b3a47b4da97555d9781e8116e3fd909 to your computer and use it in GitHub Desktop.
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