Added heap-allocation to allow long-lived websocket connections.
This commit is contained in:
parent
de96a4a45b
commit
eb43a1be78
|
@ -49,6 +49,10 @@ class TaskPoolHttp1Transport : Http1Transport {
|
||||||
}
|
}
|
||||||
|
|
||||||
unittest {
|
unittest {
|
||||||
|
import slf4d.default_provider;
|
||||||
|
auto logProvider = DefaultProvider.builder().withRootLoggingLevel(Levels.DEBUG).build();
|
||||||
|
configureLoggingProvider(logProvider);
|
||||||
|
|
||||||
HttpRequestHandler handler = HttpRequestHandler.of(
|
HttpRequestHandler handler = HttpRequestHandler.of(
|
||||||
(ref ServerHttpRequest request, ref ServerHttpResponse response) {
|
(ref ServerHttpRequest request, ref ServerHttpResponse response) {
|
||||||
response.status = HttpStatus.OK;
|
response.status = HttpStatus.OK;
|
||||||
|
|
|
@ -33,6 +33,7 @@ abstract class Http1Transport : HttpTransport {
|
||||||
}
|
}
|
||||||
|
|
||||||
void start() {
|
void start() {
|
||||||
|
infoF!"Starting Http1Transport server on port %d."(port);
|
||||||
atomicStore(running, true);
|
atomicStore(running, true);
|
||||||
runServer();
|
runServer();
|
||||||
}
|
}
|
||||||
|
@ -40,6 +41,7 @@ abstract class Http1Transport : HttpTransport {
|
||||||
protected abstract void runServer();
|
protected abstract void runServer();
|
||||||
|
|
||||||
void stop() {
|
void stop() {
|
||||||
|
infoF!"Stopping Http1Transport server on port %d."(port);
|
||||||
atomicStore(running, false);
|
atomicStore(running, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,7 +57,6 @@ version(unittest) {
|
||||||
* transport = The transport implementation to test.
|
* transport = The transport implementation to test.
|
||||||
*/
|
*/
|
||||||
void testHttp1Transport(Http1Transport transport) {
|
void testHttp1Transport(Http1Transport transport) {
|
||||||
import slf4d;
|
|
||||||
import core.thread;
|
import core.thread;
|
||||||
import std.string;
|
import std.string;
|
||||||
infoF!"Testing Http1Transport implementation: %s"(transport);
|
infoF!"Testing Http1Transport implementation: %s"(transport);
|
||||||
|
@ -111,31 +112,32 @@ version(unittest) {
|
||||||
* requestHandler = The request handler that will handle the received HTTP request.
|
* requestHandler = The request handler that will handle the received HTTP request.
|
||||||
*/
|
*/
|
||||||
void handleClient(Socket clientSocket, HttpRequestHandler requestHandler) {
|
void handleClient(Socket clientSocket, HttpRequestHandler requestHandler) {
|
||||||
auto inputStream = SocketInputStream(clientSocket);
|
SocketInputStream* inputStream = new SocketInputStream(clientSocket);
|
||||||
auto bufferedInput = bufferedInputStreamFor!(8192)(inputStream);
|
BufferedInputStream!(SocketInputStream*, 8192)* bufferedInput
|
||||||
|
= new BufferedInputStream!(SocketInputStream*, 8192)(inputStream);
|
||||||
// Get remote address from the socket.
|
// Get remote address from the socket.
|
||||||
import handy_http_primitives.address;
|
import handy_http_primitives.address;
|
||||||
ClientAddress addr = getAddress(clientSocket);
|
ClientAddress addr = getAddress(clientSocket);
|
||||||
debugF!"Handling client request from %s."(addr.toString());
|
traceF!"Got request from client: %s"(addr.toString());
|
||||||
auto result = readHttpRequest(&bufferedInput, addr);
|
auto result = readHttpRequest(bufferedInput, addr);
|
||||||
debug_("Finished reading HTTP request from client.");
|
|
||||||
if (result.hasError) {
|
if (result.hasError) {
|
||||||
if (result.error.code != -1) {
|
if (result.error.code != -1) {
|
||||||
// Only warn if we didn't read an empty request.
|
// Only warn if we didn't read an empty request.
|
||||||
warnF!"Failed to read HTTP request: %s"(result.error.message);
|
warnF!"Failed to read request: %s"(result.error.message);
|
||||||
}
|
}
|
||||||
inputStream.closeStream();
|
inputStream.closeStream();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
scope ServerHttpRequest request = result.request;
|
scope ServerHttpRequest request = result.request;
|
||||||
scope ServerHttpResponse response;
|
scope ServerHttpResponse response;
|
||||||
SocketOutputStream outputStream = SocketOutputStream(clientSocket);
|
SocketOutputStream* outputStream = new SocketOutputStream(clientSocket);
|
||||||
response.outputStream = outputStreamObjectFor(HttpResponseOutputStream!(SocketOutputStream*)(
|
response.outputStream = outputStreamObjectFor(HttpResponseOutputStream!(SocketOutputStream*)(
|
||||||
&outputStream,
|
outputStream,
|
||||||
&response
|
&response
|
||||||
));
|
));
|
||||||
try {
|
try {
|
||||||
requestHandler.handle(request, response);
|
requestHandler.handle(request, response);
|
||||||
|
debugF!"%s %s -> %d %s"(request.method, request.url, response.status.code, response.status.text);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
error("Exception thrown while handling request.", e);
|
error("Exception thrown while handling request.", e);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
|
Loading…
Reference in New Issue