{"id":24480971,"url":"https://github.com/halfmoonly/handson-tomcat","last_synced_at":"2025-03-14T18:18:29.438Z","repository":{"id":270847464,"uuid":"911642217","full_name":"Halfmoonly/handson-tomcat","owner":"Halfmoonly","description":"致敬传奇，手写Tomcat。handson-tomcat采用多分支开发，每个分支都是可运行的程度。帮作者点点⭐⭐攻克Web系统底层原理，领悟服务器设计哲学，带你卷向更高处","archived":false,"fork":false,"pushed_at":"2025-03-09T08:16:41.000Z","size":3033,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-09T08:19:03.183Z","etag":null,"topics":["java","servlet-api","tomcat","web"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Halfmoonly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2025-01-03T13:56:15.000Z","updated_at":"2025-03-02T05:09:23.000Z","dependencies_parsed_at":"2025-01-03T14:45:16.329Z","dependency_job_id":"4abadf2b-d5a5-48ce-9cb5-bea9fffd2ef5","html_url":"https://github.com/Halfmoonly/handson-tomcat","commit_stats":null,"previous_names":["halfmoonly/handson-tomcat"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halfmoonly%2Fhandson-tomcat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halfmoonly%2Fhandson-tomcat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halfmoonly%2Fhandson-tomcat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Halfmoonly%2Fhandson-tomcat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Halfmoonly","download_url":"https://codeload.github.com/Halfmoonly/handson-tomcat/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243624103,"owners_count":20321029,"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","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":["java","servlet-api","tomcat","web"],"created_at":"2025-01-21T11:18:07.489Z","updated_at":"2025-03-14T18:18:29.430Z","avatar_url":"https://github.com/Halfmoonly.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# handson-tomcat\n致敬传奇，手写框架之Tomcat，帮作者点点⭐⭐攻克Web系统底层原理，领悟服务器设计哲学，带你卷向更高处\n\nTomcat宏观架构如下：\n\n![img.png](architecture.png)\n\n在手写Tomcat之前，你需要先掌握HTTP请求/响应的基本格式：\n\nHTTP请求格式如下：\n- 第一行：请求方法 路径 协议/版本\n- 后面是请求头\n- 空一行\n- 请求体\n```shell\nGET /hello.txt HTTP/1.1\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\nAccept-Encoding: gzip, deflate, br\nAccept-Language: zh-CN,zh;q=0.9\nCache-Control: max-age=0\nConnection: keep-alive\nHost: localhost:8080\nSec-Fetch-Dest: document\nSec-Fetch-Mode: navigate\nSec-Fetch-Site: none\nSec-Fetch-User: ?1\nUpgrade-Insecure-Requests: 1\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36\nsec-ch-ua: \"Google Chrome\";v=\"113\", \"Chromium\";v=\"113\", \"Not-A.Brand\";v=\"24\"\n\n请求体（支持不同的类型如json、xml、x-www-form-urlencoded等）\n```\n\nHTTP响应格式类似：\n- 状态行: 协议/版本 响应码 msg\n- 响应头\n- 空行\n- 响应体\n```shell\nHTTP/1.1 200 OK\nContent-Type: text/html\nContent-Length: 12\nServer: tomcat\n\nHello World!\n```\n\n与`handson-spring`一样，`handson-tomcat`依旧采取多分支开发的方式，分支结构如下：\n- a-server01：实现一个最简单的静态资源服务器，根据请求返回基本的响应结构\n- a-server02：服务器引入`commons-lang3`，自定义动态资源`Servlet`，并支持`Servlet`内容动态填充\n- a-server03：服务器引入`javax.servlet-api`，对用户自定义的`Servlet`适配标准的`Servlet`规范\n- b-connector01：引入`Tomcat`连接层，同时对`HttpServer`一拆为二`Connector`和`Processor`，做到职责分离\n- b-connector02：提高服务器性能，实现`Processor`对象池\n- b-connector03：进一步提高服务器性能，设计线程`Processor`，同时实现与`Connector`线程之间的同步机制\n- b-connector04：对`Request`相关的代码适配`Servlet`规范，封装`RequestLine`并解析请求第一行信息，和`DefaultHeaders`请求头信息\n- b-connector05：对`Response`相关的代码适配`Servlet`规范，并进行响应码，响应头的解析\n- b-connector06：门面模式的应用，分别对`HttpRequest`和`HttpResponse`适配门面，选择性的隐藏内部细节\n- b-connector07：更进一步，对`HttpRequest`进行`GET`路径参数，以及`POST`请求体的解析，同时改造 SocketInputStream，由继承 InputStream 改为继承 ServletInputStream。使输入流适配Servlet规范\n- b-connector08：对请求侧设计`Cookie`，解析请求路径或者请求头`Cookie`中的`jsessionid`，对服务器设计存储`Sessions`集合`\u003cjsessionid,session\u003e`\n- b-connector09：对响应头设计`Set-Cookie`，使之有状态，终于可以把多次没有上下文关联的`HTTP`访问视为同一个用户访问。在 Response 返回参数中回写 Session 信息，使得客户端程序能够接受这个信息，下次请求 Server时携带Session信息\n- 更多分支正在更新中...\n\nmain分支包含以上所有功能特性，全量/增量开发文档见[docs](docs)目录\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalfmoonly%2Fhandson-tomcat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhalfmoonly%2Fhandson-tomcat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhalfmoonly%2Fhandson-tomcat/lists"}