An open API service indexing awesome lists of open source software.

https://github.com/humankernel/http-server

HTTP Server from Scratch
https://github.com/humankernel/http-server

Last synced: 16 days ago
JSON representation

HTTP Server from Scratch

Awesome Lists containing this project

README

          

# βš™οΈ 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](https://app.codecrafters.io/courses/http-server) 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/` β€” Responds with the given text.
* `/user-agent` β€” Returns the client’s `User-Agent` header.
* `/files/` β€”
β€’ `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

```bash
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:

```bash
go run app/main.go ./tmp
```

### 3. Try some requests

```bash
# 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)

```bash
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