A minimal yet fully functional HTTP/1.1 server built from scratch in Go, without using net/http for handling requests or responses.
This project was inspired by the Codecrafters HTTP Server Challenge and rebuilt from the ground up to deepen understanding of low-level networking and the HTTP protocol.
β
Manual TCP Handling β Uses Goβs net package directly (net.Listen, net.Conn) to accept and manage client connections.
β HTTP/1.1 Parsing β Parses request lines, headers, and bodies manually via buffered I/O.
β
Persistent Connections β Supports Connection: keep-alive and Connection: close.
β Custom Routing β Handles multiple routes without using frameworks:
/β Simple health check./echo/<text>β Responds with the given text./user-agentβ Returns the clientβsUser-Agentheader./files/<filename>β β’GET: Serves static files from a provided directory. β’POST: Writes file contents to disk.
β
Gzip Compression β Compresses responses when the client includes Accept-Encoding: gzip.
β File I/O Handling β Secure path resolution and support for reading/writing binary files.
β
Proper Status Codes β Returns 200 OK, 201 Created, 404 Not Found, 500 Internal Server Error, etc.
β Concurrent Connections β Handles multiple clients via goroutines.
β Verbose Logging β Logs request lifecycle and connection details.
git clone https://github.com/humankernel/http-server.git
cd http-serverYou must provide a file directory path for /files route:
go run app/main.go ./tmp# Echo
curl -v http://localhost:4221/echo/hello
# User-Agent
curl -v http://localhost:4221/user-agent
# Upload a file
curl -v -X POST --data-binary @example.txt http://localhost:4221/files/example.txt
# Download a file
curl -v http://localhost:4221/files/example.txtsudo tcpdump -i any -n host localhost> GET /echo/hi HTTP/1.1
> Host: localhost:4221
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Content-Length: 2
hi
http-server/
βββ app/
β βββ main.go # Core server implementation
βββ tmp/ # Example directory for /files route
βββ README.md
- Add proper routing abstraction (similar to
http.ServeMux) - Implement chunked transfer encoding and streaming responses
- Improve security and header handling