Added more logging, and use parseAddress to create server socket addr.
Build and Test Module / build-and-test (push) Successful in 10s Details
Build and Test Module / integration-tests (push) Successful in 16s Details

This commit is contained in:
Andrew Lalis 2025-08-09 10:42:44 -04:00
parent 22e8fa9b70
commit febce5eb8d
3 changed files with 15 additions and 2 deletions

View File

@ -20,8 +20,10 @@ class TaskPoolHttp1Transport : Http1Transport {
override void runServer() {
Socket serverSocket = new TcpSocket();
serverSocket.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, 1);
serverSocket.bind(new InternetAddress("127.0.0.1", port));
serverSocket.bind(parseAddress("127.0.0.1", port));
debugF!"Bound the server socket to %s"(serverSocket.localAddress);
serverSocket.listen(1024);
debug_("Server is now listening.");
while (super.isRunning) {
try {

View File

@ -93,7 +93,10 @@ version(unittest) {
string statusLine = headerLines[0];
string[] statusLineParts = statusLine.split(" ");
assert(statusLineParts[0] == "HTTP/1.1");
assert(statusLineParts[1] == "200");
assert(
statusLineParts[1] == "200",
format!"Expected status line's HTTP code to be 200, but it was \"%s\"."(statusLineParts[1])
);
assert(statusLineParts[2] == "OK");
info("Testing is complete. Stopping the server.");
@ -142,6 +145,7 @@ void handleClient(Socket clientSocket, HttpRequestHandler requestHandler) {
debugF!"%s %s -> %d %s"(request.method, request.url, response.status.code, response.status.text);
// If the response's headers aren't flushed yet, write them now.
if (!responseOutputStream.areHeadersFlushed()) {
trace("Flushing response headers because they weren't flushed by the request handler.");
auto writeResult = responseOutputStream.writeHeaders();
if (writeResult.hasError) {
errorF!"Failed to write response headers: %s"(writeResult.error.message);

View File

@ -3,6 +3,7 @@ module handy_http_transport.response_output_stream;
import handy_http_transport.helpers : writeUIntToBuffer;
import handy_http_primitives : ServerHttpResponse;
import streams;
import slf4d;
/**
* A wrapper around a byte output stream that's used for writing HTTP response
@ -61,6 +62,7 @@ struct HttpResponseOutputStream(S) if (isByteOutputStream!S) {
if (headersFlushed) {
return StreamResult(0); // No need to write again.
}
debug_("Flushing HTTP status and headers to the output stream.");
headersFlushed = true;
size_t idx = 0;
char[6] statusCodeBuffer; // Normal HTTP codes are 3 digits, but this leaves room for extensions.
@ -69,9 +71,11 @@ struct HttpResponseOutputStream(S) if (isByteOutputStream!S) {
StreamResult r = outputStream.writeToStream(cast(ubyte[]) "HTTP/1.1 ");
if (r.hasError) return r;
size_t writeCount = r.count;
traceF!"Wrote HTTP version. Bytes written: %d."(writeCount);
r = outputStream.writeToStream(cast(ubyte[]) statusCodeBuffer[0..idx]);
if (r.hasError) return r;
writeCount += r.count;
traceF!"Wrote status code. Bytes written: %d."(writeCount);
r = outputStream.writeToStream([' ']);
if (r.hasError) return r;
writeCount += r.count;
@ -81,9 +85,11 @@ struct HttpResponseOutputStream(S) if (isByteOutputStream!S) {
r = outputStream.writeToStream(['\r', '\n']);
if (r.hasError) return r;
writeCount += r.count;
traceF!"Wrote HTTP status line. Bytes written: %d."(writeCount);
foreach (headerName; response.headers.keys) {
// Write the header name.
traceF!"Writing header name: %s"(headerName);
r = outputStream.writeToStream(cast(ubyte[]) headerName);
if (r.hasError) return r;
writeCount += r.count;
@ -105,6 +111,7 @@ struct HttpResponseOutputStream(S) if (isByteOutputStream!S) {
r = outputStream.writeToStream(['\r', '\n']);
if (r.hasError) return r;
writeCount += r.count;
traceF!"Wrote header %s: %s"(headerName, headerValues);
}
r = outputStream.writeToStream(['\r', '\n']); // Trailing CLRF before the body.
if (r.hasError) return r;