Skip to content

Commit

Permalink
Go back to libasync
Browse files Browse the repository at this point in the history
  • Loading branch information
Kripth committed Jan 1, 2019
1 parent 64b073e commit 90109cf
Show file tree
Hide file tree
Showing 7 changed files with 272 additions and 378 deletions.
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
MIT License

Copyright (c) 2018 Kripth
Copyright (c) 2018-2019 Kripth

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
3 changes: 2 additions & 1 deletion dub.sdl
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ name "lighttp"
description "Lightweight asynchronous HTTP/WS server"
authors "Kripth"
license "MIT"
dependency "kiss" version="~>0.4"
dependency "libasync" version="~>0.8"
dependency "urld" version="~>2.1"
dependency "xbuffer" version="~>1.0"
2 changes: 1 addition & 1 deletion src/lighttp/package.d
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ public import std.socket : Address;
public import lighttp.resource : Resource, CachedResource, TemplatedResource;
public import lighttp.router : CustomMethod, Get, Post, Put, Delete, Multipart;
public import lighttp.server : Server, WebSocket = WebSocketConnection;
public import lighttp.util : StatusCodes, MimeTypes, Request, Response;
public import lighttp.util : StatusCodes, MimeTypes, ClientRequest, ClientResponse, ServerRequest, ServerResponse;
8 changes: 4 additions & 4 deletions src/lighttp/resource.d
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import std.digest.crc : crc32Of;
import std.string : indexOf, strip;
import std.zlib : HeaderFormat, Compress;

import lighttp.util;
import lighttp.util : StatusCodes, Http;

class Resource {

Expand Down Expand Up @@ -41,14 +41,14 @@ class Resource {
this.compressed = data;
}

public void apply(Request req, Response res) {
public void apply(Http req, Http res) {
if(this.compressed !is null && req.headers.get("accept-encoding", "").indexOf("gzip") != -1) {
res.headers["Content-Encoding"] = "gzip";
res.body_ = cast(string)this.compressed;
} else {
res.body_ = cast(string)this.uncompressed;
}
res.headers["Content-Type"] = this.mime;
res.contentType = this.mime;
}

}
Expand All @@ -70,7 +70,7 @@ class CachedResource : Resource {
return super.data(data);
}

public override void apply(Request req, Response res) {
public override void apply(Http req, Http res) {
if(req.headers.get("if-none-match", "") == this.etag) {
res.status = StatusCodes.notModified;
} else {
Expand Down
61 changes: 24 additions & 37 deletions src/lighttp/router.d
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import std.socket : Address;
import std.string : startsWith, join;
import std.traits : Parameters, hasUDA;

import kiss.net : TcpStream;
import libasync : AsyncTCPConnection;

import lighttp.resource;
import lighttp.server : Connection, MultipartConnection, WebSocketConnection;
Expand Down Expand Up @@ -37,7 +37,7 @@ class Router {

private Route[][string] routes;

private void delegate(Request, Response) _errorHandler;
private void delegate(ServerRequest, ServerResponse) _errorHandler;

this() {
this.add("GET", "", indexPage);
Expand All @@ -47,8 +47,8 @@ class Router {
/*
* Handles a connection.
*/
void handle(ref HandleResult result, TcpStream client, Request req, Response res) {
if(!req.path.startsWith("/")) {
void handle(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res) {
if(!req.url.path.startsWith("/")) {
res.status = StatusCodes.badRequest;
} else {
auto routes = req.method in this.routes;
Expand All @@ -66,11 +66,11 @@ class Router {
* Handles a client or server error and displays an error
* page to the client.
*/
void handleError(Request req, Response res) {
void handleError(ServerRequest req, ServerResponse res) {
_errorHandler(req, res);
}

private void defaultErrorHandler(Request req, Response res) {
private void defaultErrorHandler(ServerRequest req, ServerResponse res) {
errorPage.apply(["message": res.status.message, "error": res.status.toString(), "server": res.headers.get("Server", "lighttp")]).apply(req, res);
}

Expand Down Expand Up @@ -110,7 +110,7 @@ class Router {
}

void add(T)(RouteInfo!T info, Resource resource) {
this.add(info, (Request req, Response res){ resource.apply(req, res); });
this.add(info, (ServerRequest req, ServerResponse res){ resource.apply(req, res); });
}

void add(T, E...)(string method, T path, void delegate(E) del) {
Expand Down Expand Up @@ -142,7 +142,7 @@ class Router {

class Route {

abstract void handle(ref HandleResult result, TcpStream client, Request req, Response res);
abstract void handle(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res);

}

Expand All @@ -151,35 +151,23 @@ class RouteImpl(T, E...) if(is(T == string) || isRegexFor!(T, string)) : Route {
private T path;

static if(E.length) {
static if(is(E[0] == Address)) {
enum __address = 0;
static if(E.length > 1) {
static if(is(E[1] == Request)) {
enum __request = 1;
static if(E.length > 2 && is(E[2] == Response)) {
enum __response = 2;
}
} else static if(is(E[1] == Response)) {
enum __response = 1;
}
}
} else static if(is(E[0] == Request)) {
static if(is(E[0] == ServerRequest)) {
enum __request = 0;
static if(E.length > 1 && is(E[1] == Response)) enum __response = 1;
} else static if(is(E[0] == Response)) {
static if(E.length > 1 && is(E[1] == ServerResponse)) enum __response = 1;
} else static if(is(E[0] == ServerResponse)) {
enum __response = 0;
static if(E.length > 1 && is(E[1] == ServerRequest)) enum __request = 1;
}
}

static if(!is(typeof(__address))) enum __address = -1;

static if(!is(typeof(__request))) enum __request = -1;
static if(!is(typeof(__response))) enum __response = -1;

static if(__address == -1 && __request == -1 && __response == -1) {
static if(__request == -1 && __response == -1) {
alias Args = E[0..0];
alias Match = E[0..$];
} else {
enum _ = max(__address, __request, __response) + 1;
enum _ = max(__request, __response) + 1;
alias Args = E[0.._];
alias Match = E[_..$];
}
Expand All @@ -190,24 +178,23 @@ class RouteImpl(T, E...) if(is(T == string) || isRegexFor!(T, string)) : Route {
this.path = path;
}

void callImpl(void delegate(E) del, TcpStream client, Request req, Response res, Match match) {
void callImpl(void delegate(E) del, AsyncTCPConnection client, ServerRequest req, ServerResponse res, Match match) {
Args args;
static if(__address != -1) args[__address] = client.remoteAddress;
static if(__request != -1) args[__request] = req;
static if(__response != -1) args[__response] = res;
del(args, match);
}

abstract void call(ref HandleResult result, TcpStream client, Request req, Response res, Match match);
abstract void call(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res, Match match);

override void handle(ref HandleResult result, TcpStream client, Request req, Response res) {
override void handle(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res) {
static if(is(T == string)) {
if(req.path[1..$] == this.path) {
if(req.url.path[1..$] == this.path) {
this.call(result, client, req, res);
result.success = true;
}
} else {
auto match = req.path[1..$].matchAll(this.path);
auto match = req.url.path[1..$].matchAll(this.path);
if(match && match.post.length == 0) {
string[] matches;
foreach(m ; match.front) matches ~= m;
Expand Down Expand Up @@ -237,7 +224,7 @@ class RouteOf(T, E...) : RouteImpl!(T, E) {
this.del = del;
}

override void call(ref HandleResult result, TcpStream client, Request req, Response res, Match match) {
override void call(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res, Match match) {
this.callImpl(this.del, client, req, res, match);
}

Expand All @@ -249,7 +236,7 @@ class MultipartRouteOf(T, E...) : RouteOf!(T, E) {
super(path, del);
}

override void call(ref HandleResult result, TcpStream client, Request req, Response res, Match match) {
override void call(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res, Match match) {
auto lstr = "content-length" in req.headers;
if(lstr) {
try {
Expand Down Expand Up @@ -278,7 +265,7 @@ class WebSocketRouteOf(WebSocket, T, E...) : RouteImpl!(T, E) {
this.createWebSocket = createWebSocket;
}

override void call(ref HandleResult result, TcpStream client, Request req, Response res, Match match) {
override void call(ref HandleResult result, AsyncTCPConnection client, ServerRequest req, ServerResponse res, Match match) {
auto key = "sec-websocket-key" in req.headers;
if(key) {
res.status = StatusCodes.switchingProtocols;
Expand All @@ -287,7 +274,7 @@ class WebSocketRouteOf(WebSocket, T, E...) : RouteImpl!(T, E) {
res.headers["Upgrade"] = "websocket";
// create web socket and set callback for onConnect
WebSocket webSocket = this.createWebSocket();
webSocket.client = client;
webSocket.conn = client;
result.connection = webSocket;
static if(__traits(hasMember, WebSocket, "onConnect")) webSocket.onStartImpl = { this.callImpl(&webSocket.onConnect, client, req, res, match); };
} else {
Expand Down
Loading

0 comments on commit 90109cf

Please sign in to comment.