Skip to content

Latest commit

Β 

History

History
101 lines (67 loc) Β· 2.73 KB

File metadata and controls

101 lines (67 loc) Β· 2.73 KB

βš™οΈ Simple HTTP Server from Scratch (Go)

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.

πŸš€ Features

βœ… 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’s User-Agent header.
  • /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.

🧩 Getting Started

1. Clone the repo

git clone https://github.com/humankernel/http-server.git
cd http-server

2. Run the server

You must provide a file directory path for /files route:

go run app/main.go ./tmp

3. Try some requests

# 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.txt

4. Observe raw traffic (optional)

sudo tcpdump -i any -n host localhost

πŸ“‚ Example Response

> GET /echo/hi HTTP/1.1
> Host: localhost:4221

< HTTP/1.1 200 OK
< Content-Type: text/plain
< Content-Length: 2

hi

🧭 Project Structure

http-server/
β”œβ”€β”€ app/
β”‚   └── main.go        # Core server implementation
β”œβ”€β”€ tmp/               # Example directory for /files route
└── README.md

πŸ’‘ Future Improvements

  • Add proper routing abstraction (similar to http.ServeMux)
  • Implement chunked transfer encoding and streaming responses
  • Improve security and header handling