# krishna4a6av/httpformtcp architecture

> Architecture diagram of the GitHub repository krishna4a6av/httpformtcp, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/krishna4a6av/httpformtcp
- Repository: https://github.com/krishna4a6av/httpformtcp

## Overview

HTTP from TCP is a minimal HTTP/1.1 server implemented on raw TCP. Its main workflow accepts a connection, parses a request, dispatches by target to a response handler, and writes the response; routes also serve local media or proxy upstream content. The graph reflects the sampled implementation. The README names the learning listener and UDP sender, but describes them as separate command programs; the UDP sender is not part of the HTTP request workflow.

Main entry points: [`cmd/httpserver/main.go`](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/main.go) (HTTP server command), [`internal/server/server.go`](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/server/server.go) (TCP server), [`internal/response/response.go`](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/response/response.go) (Response writer), [`cmd/httpserver/media.go`](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/media.go) (Media handlers)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["HTTP runtime"]
  node_httpserver["HTTP server command<br/>[main.go]"]
  node_tcpserver["TCP server<br/>[server.go]"]
end

subgraph group_protocol["HTTP protocol"]
  node_requestreader["Request reader"]
  node_requestparser["Request parser<br/>[request.go]"]
  node_headers["Header parser<br/>[headers.go]"]
  node_responsewriter["Response writer<br/>[response.go]"]
  node_defaults["Response defaults<br/>[default.go]"]
end

subgraph group_routes["Request routes"]
  node_static["HTML responses<br/>[main.go]"]
  node_media["Media handlers<br/>[media.go]"]
  node_assets[("Local media files")]
  node_proxy["HTTP proxy<br/>[proxy.go]"]
end

subgraph group_learning["Learning commands"]
  node_tcplistener["TCP learning listener<br/>[main.go]"]
  node_udpsender["UDP sender<br/>[main.go]"]
end

node_client(("HTTP client"))
node_upstream["httpbingo upstream"]
node_udpservice(("UDP destination"))

node_client -->|"opens TCP connection"| node_tcpserver
node_httpserver -->|"starts server"| node_tcpserver
node_tcpserver -->|"reads request"| node_requestreader
node_requestreader -->|"parses bytes"| node_requestparser
node_requestparser -->|"parses fields"| node_headers
node_tcpserver -->|"dispatches request"| node_httpserver
node_httpserver -->|"handles default routes"| node_static
node_httpserver -->|"routes media"| node_media
node_media -->|"reads files"| node_assets
node_httpserver -->|"routes proxy requests"| node_proxy
node_proxy -.->|"fetches response"| node_upstream
node_httpserver -->|"writes responses"| node_responsewriter
node_static -->|"writes HTML"| node_responsewriter
node_media -->|"writes media"| node_responsewriter
node_proxy -->|"streams chunks"| node_responsewriter
node_tcpserver -->|"writes errors"| node_responsewriter
node_static -->|"gets headers"| node_defaults
node_media -->|"gets headers"| node_defaults
node_proxy -->|"gets proxy headers"| node_defaults
node_tcplistener -->|"parses requests"| node_requestreader
node_udpsender -->|"sends datagrams"| node_udpservice

click node_httpserver "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/main.go"
click node_tcpserver "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/server/server.go"
click node_requestreader "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/request/requestFromReader.go"
click node_requestparser "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/request/request.go"
click node_headers "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/headers/headers.go"
click node_responsewriter "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/response/response.go"
click node_defaults "https://github.com/krishna4a6av/httpformtcp/blob/master/internal/response/default.go"
click node_static "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/main.go"
click node_media "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/media.go"
click node_proxy "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/proxy.go"
click node_tcplistener "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/tcplistener/main.go"
click node_udpsender "https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/udpsender/main.go"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_httpserver,node_tcpserver,node_client toneBlue
class node_requestreader,node_requestparser,node_headers,node_responsewriter,node_defaults toneAmber
class node_static,node_media,node_assets,node_proxy toneMint
class node_tcplistener,node_udpsender toneRose
class node_upstream,node_udpservice toneIndigo
```

## Components

### HTTP runtime

- [HTTP server command](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/main.go): `cmd/httpserver/main.go`
- [TCP server](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/server/server.go): `internal/server/server.go`

### HTTP protocol

- [Request reader](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/request/requestFromReader.go): `internal/request/requestFromReader.go`
- [Request parser](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/request/request.go): `internal/request/request.go`
- [Header parser](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/headers/headers.go): `internal/headers/headers.go`
- [Response writer](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/response/response.go): `internal/response/response.go`
- [Response defaults](https://github.com/krishna4a6av/httpformtcp/blob/master/internal/response/default.go): `internal/response/default.go`

### Request routes

- [HTML responses](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/main.go): `cmd/httpserver/main.go`
- [Media handlers](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/media.go): `cmd/httpserver/media.go`
- **Local media files**
- [HTTP proxy](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/httpserver/proxy.go): `cmd/httpserver/proxy.go`

### Learning commands

- [TCP learning listener](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/tcplistener/main.go): `cmd/tcplistener/main.go`
- [UDP sender](https://github.com/krishna4a6av/httpformtcp/blob/master/cmd/udpsender/main.go): `cmd/udpsender/main.go`

### Other components

- **HTTP client**
- **httpbingo upstream**
- **UDP destination**

## Connections

- HTTP client → TCP server: opens TCP connection
- HTTP server command → TCP server: starts server
- TCP server → Request reader: reads request
- Request reader → Request parser: parses bytes
- Request parser → Header parser: parses fields
- TCP server → HTTP server command: dispatches request
- HTTP server command → HTML responses: handles default routes
- HTTP server command → Media handlers: routes media
- Media handlers → Local media files: reads files
- HTTP server command → HTTP proxy: routes proxy requests
- HTTP proxy → httpbingo upstream: fetches response
- HTTP server command → Response writer: writes responses
- HTML responses → Response writer: writes HTML
- Media handlers → Response writer: writes media
- HTTP proxy → Response writer: streams chunks
- TCP server → Response writer: writes errors
- HTML responses → Response defaults: gets headers
- Media handlers → Response defaults: gets headers
- HTTP proxy → Response defaults: gets proxy headers
- TCP learning listener → Request reader: parses requests
- UDP sender → UDP destination: sends datagrams
