{"id":35040545,"url":"https://github.com/barcellos-pedro/java-echo-server","last_synced_at":"2025-12-27T08:15:07.641Z","repository":{"id":325854918,"uuid":"1102243131","full_name":"barcellos-pedro/java-echo-server","owner":"barcellos-pedro","description":"Java simple http server","archived":false,"fork":false,"pushed_at":"2025-11-23T20:11:52.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-23T21:05:50.489Z","etag":null,"topics":["http","java","server","study","tcp"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/barcellos-pedro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-23T04:42:40.000Z","updated_at":"2025-11-23T20:11:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/barcellos-pedro/java-echo-server","commit_stats":null,"previous_names":["barcellos-pedro/java-echo-server"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/barcellos-pedro/java-echo-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/barcellos-pedro%2Fjava-echo-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/barcellos-pedro%2Fjava-echo-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/barcellos-pedro%2Fjava-echo-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/barcellos-pedro%2Fjava-echo-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/barcellos-pedro","download_url":"https://codeload.github.com/barcellos-pedro/java-echo-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/barcellos-pedro%2Fjava-echo-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28076014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-27T02:00:05.897Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http","java","server","study","tcp"],"created_at":"2025-12-27T08:15:04.706Z","updated_at":"2025-12-27T08:15:07.633Z","avatar_url":"https://github.com/barcellos-pedro.png","language":"Java","readme":"# Simple Java HTTP Server\n\nThis project implements a minimal, educational HTTP server in Java.  \nThe goal is to understand low-level request handling, routing, controllers, and response building without relying on large frameworks.\n\nIt includes:\n\n- Socket-based HTTP server  \n- Basic router and mapping system  \n- Controllers implementing a `RequestHandler` interface  \n- Request parsing (method, path, headers, body)  \n- Response builder with support for multiple formats  \n- A complete class diagram for architecture visibility\n\n---\n\n## 🚀 Overview\n\nThe server listens on a configurable port and processes each incoming socket by:\n\n1. Parsing the HTTP request into a `Request` object  \n2. Passing it to the `Router`  \n3. Resolving the appropriate `RequestHandler` via `Routes`  \n4. Building the HTTP response with `Response` helpers  \n5. Sending the result back through the socket\n\nThe structure is intentionally simple so you can extend it — adding controllers, middleware, or even template rendering.\n\n---\n\n## 📦 Project Structure\n\n```text\njava-echo-server/\n├── README.md\n├── src\n│   └── main\n│       └── java\n│           └── com\n│               └── server\n│                   ├── controller\n│                   │   ├── EchoController.java\n│                   │   ├── GreetingController.java\n│                   │   ├── NotFoundController.java\n│                   │   └── RequestHandler.java\n│                   ├── http\n│                   │   ├── HttpMethod.java\n│                   │   ├── HttpServer.java\n│                   │   ├── Request.java\n│                   │   └── Response.java\n│                   ├── Main.java\n│                   ├── router\n│                   │   ├── Router.java\n│                   │   └── Routes.java\n│                   └── utils\n│                       └── ResponseTemplate.java\n└── tests\n    ├── load_get_greeting.sh\n    ├── load_post_message.sh\n    └── run_all_load_tests.sh\n```\n\n## 🧩 Class Diagram\n\nBelow is a full Mermaid UML diagram representing the architecture:\n\n```mermaid\nclassDiagram\n\n    %% Interfaces\n    class RequestHandler {\n        \u003c\u003cinterface\u003e\u003e\n        +handle(request) String\n    }\n\n    %% Enums\n    class HttpMethod {\n        \u003c\u003cenumeration\u003e\u003e\n        GET\n        POST\n        PUT\n        PATCH\n        DELETE\n    }\n\n    class Response_Type {\n        \u003c\u003cenumeration\u003e\u003e\n        TEXT\n        JSON\n    }\n\n    %% Core classes\n    class Main {\n        +main()\n    }\n\n    class HttpServer {\n        -port : int\n        +HttpServer(int)\n        +create(int) HttpServer\n        +listen(Consumer\u003cSocket\u003e) void\n    }\n\n    class Router {\n        +handle(Socket) void\n        +route(Request) String\n    }\n\n    class Routes {\n        +mapping : Map\u003cString, RequestHandler\u003e\n        +getOrNotFound(Request) String\n    }\n\n    class Request {\n        -method : HttpMethod\n        -path : String\n        -protocol : String\n        -headers : Map\u003cString, String\u003e\n        -reader : BufferedReader\n\n        +Request()\n        +of(Socket) Request\n        +getReader(Socket) BufferedReader\n        +setRequestLineFields() void\n        +parseHeaders() void\n        +parseBody() String\n        +hasBody() boolean\n        +getMethod() HttpMethod\n        +setMethod(HttpMethod) void\n        +getPath() String\n        +setPath(String) void\n        +getProtocol() String\n        +setProtocol(String) void\n        +getHeaders() Map\u003cString,String\u003e\n        +setHeaders(Map\u003cString,String\u003e) void\n        +setReader(BufferedReader) void\n        +toString() String\n    }\n\n    class Response {\n        +of(String) String\n        +of(String, Type) String\n        +echo(Request, Type) String\n        +bindValues(Type, String) String\n    }\n\n    class ResponseTemplate {\n        +TEXT : String\n        +JSON : String\n    }\n\n    class GreetingController {\n        +handle(Request) String\n    }\n\n    class EchoController {\n        +handle(Request) String\n        -valid(Request) boolean\n    }\n\n    class NotFoundController {\n        +handle(Request) String\n    }\n\n    class IO {\n        +println(Object) void\n    }\n\n    %% Relationships\n    RequestHandler \u003c|.. GreetingController\n    RequestHandler \u003c|.. EchoController\n    RequestHandler \u003c|.. NotFoundController\n\n    Routes \"1\" *-- \"0..*\" RequestHandler : mapping\n    Router --\u003e Request : uses\n    Router --\u003e Routes : route / getOrNotFound\n    HttpServer --\u003e Router : passes handler\n    Main --\u003e HttpServer : creates / listens\n    Response ..\u003e Response_Type : uses\n    Response --\u003e ResponseTemplate : uses\n    Response --\u003e Request : echo()\n    Request --\u003e HttpMethod : uses\n    Request \"1\" *-- \"1\" BufferedReader : reader\n    IO \u003c.. Router\n    IO \u003c.. Request\n    IO \u003c.. HttpServer\n    IO \u003c.. Response\n\n    %% Notes\n    Note right of Request : Request.of(socket)\\nbuilds a Request\\n- getReader(socket)\\n- setRequestLineFields()\\n- parseHeaders()\n    Note left of Routes : mapping = Map.of(\"/greeting\" -\u003e GreetingController,\\n\"/message\" -\u003e EchoController\")\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbarcellos-pedro%2Fjava-echo-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbarcellos-pedro%2Fjava-echo-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbarcellos-pedro%2Fjava-echo-server/lists"}