sylar项目HTTP模块框图 <sylar_leo>
2025-04-04 16:12:46 0 举报
关于学习sylar项目的http模块框图 2025.4.4 github https://github.com/Lwaiz/sylar_leo/tree/master
作者其他创作
大纲/内容
SocketStream Socket流接口
virtual int read() override 读数据 virtual int readFixSize() override 读固定长度的数据virtual int write() override 写数据virtual int writeFixSize() override 写固定长度的数据virtual void close() override 关闭流getSocket() 返回Socket类isConnected() 返回是否连接
Socket::ptr m_socket Socket 对象,进行数据收发bool m_owner 是否主控
遍历连接池 m_conns
read() Socket in buffer
HttpRequestParser解析器
DoGet(uri) 发送GET请求
创建 HttpResponse
conn->sendRequest() 发送请求
sock->connect(addr)连接服务器
HTTPServer HTTP服务器
handleClient() 处理客户端请求getServletDispatch() 获取ServletDispatchvoid setServletDispatch() 设置ServletDispatch
bool m_isKeepalive 支持长连接ServletDispatch::ptr m_dispatch Servlet分发器
解析 Content-Length 读取请求体
解码 gzip / deflate 内容
否
继承
创建HttpRequest 对象 req设置请求头、请求体
解析 URI 获取地址对象 (addr)
writeFixSize() 确保完整发送
bool m_isKeepalive 支持长连接ServletDispatch::ptr m_dispatch Servlet分发器
session->recvRequest() 读取请求
session->sendResponse(rsp)发送响应
writeFixSize() 确保完整发送
函数请求处理
是否有可用连接
recvRequest
分发请求
Uri::Create(url) 创建uri
ss.str() 序列化 HttpRquest
ptr=new HttpConnection(sock)
DoGet(url) 发送GET请求
1.精准匹配
getConnection() 获取连接
execute() 解析响应头
解析 响应体
http_parser.h
HTTP RequestParserHTTP ResponseParser
<<http11client_parser.h>>HTTP 客户端响应解析
解析 host 获取 IPAddress
HttpRequestParser 解析请求
execute() 解析协议
http_parser m_parserHttpRequest::ptr m_data int m_error 错误码
HTTP Response 响应对象
get、set方法setRedirect() 设置HTTP重定向dump() 序列化输出到流中
HttpStatus m_statusuint8_t m_versionbool m_closebool m_websocketstd::string m_bodystd::string m_reasonMapType m_headersvector<string> m_cookies
HTTP Request 请求对象
get、set方法createResponse() 创建HTTP响应dump() 序列化输出到流中
HttpMethod m_methoduint8_t m_versionbool m_closebool m_websocket uint8_t m_parserParamFlagstd::string m_pathstd::string m_querystd::string m_fragmentstd::string m_bodyMapType m_headersMapType m_paramsMapType m_cookies
handleClient()
创建 HttpSession来处理请求
ServletCreator<T> 泛型工厂
virtual Servlet::ptr get() overridevirtual std::string getName() override
DoRequest 发送请求 处理响应
IServletCreator 工厂基类
virtual Servlet::ptr get() = 0virtual std::string getName() = 0
<<http11_parser.h>>HTTP/1.1服务器端请求解析
Stream 流结构基类
virtual int read() = 0 读数据 virtual int readFixSize() = 0 读固定长度的数据virtual int write() = 0 写数据virtual int writeFixSize()= 0 写固定长度的数据virtual void close() = 0 关闭流
FunctionServlet 函数式回调Servlet用Lambda函数或回调函数来处理请求,处理轻量级请求
NotFoundServlet 默认返回404
std::string m_name std::string m_content
解析请求头Header
return ptr 返回连接
rsp->setHeader设置Server头部信息
invalid_conns 丢弃不可用连接
DoPost(uri) 发送POST请求
HTTP Result 响应结果结构体
int result 错误码HttpResponse::ptr response 响应结构体std::string error 错误描述
Chunked响应体
Uri::Create(url) 创建uri
配置
HTTPSession HTTP会话类 在套接字上 接收请求报文,发送响应报文
HttpRequest::ptr recvRequest() 接收HTTP请求int sendResponse(HttpResponse::ptr rsp) 发送HTTP响应
conn->getSocket() 获取套接字
是
普通响应体
http.h
HTTP Methods 方法HTTP Status 状态HTTP RequestHTTP Response
HttpConnectionPool 连接池需要keep-alive支持
static HttpConnectionPool::ptr Create() 创建连接池HttpConnection::ptr getConnection(); 获取连接HttpResult::ptr DoGet(); 发送GET请求HttpResult::ptr DoPost(); 发送POST请求HttpResult::ptr DoRequest(); 发送HTTP请求
std::string m_host;std::string m_vhost;uint32_t m_port;uint32_t m_maxSize;uint32_t m_maxAliveTime;uint32_t m_maxRequest;bool m_isHttps;std::list<HttpConnection*> m_conns; 连接池std::atomic<int32_t> m_total = {0};
返回 HttpResponse
默认请求处理
创建TCP 或 SSL套接字 (sock)
创建TCP连接(HTTP\\HTTPS)
创建
DoPost(url) 发送POST请求
3.默认404
getMatchedServlet
HoldServletCreator 持有 Servlet 实例
Servlet::ptr m_servlet
DoRequest 发送请求
session->close() 关闭会话
conn->recvResponse()接收请求
conn->recvResponse() 接收响应
HttpResponseParser响应解析器
m_conns.pop_front() 从队头取出连接
ptr = conn 复用该连接
返回 HttpRequest
ss.str() 序列化 HttpResponse
EchoServer 回显服务器
<接收客户端数据并返回>handleClient() 处理客户端请求
2.模糊匹配
HttpResponseParser 响应解析
http_parser m_parserHttpRequest::ptr m_data int m_error 错误码
TCPServer TCP服务器
void setConf() 设置服务器配置virtual bool start() 启动服务 需要bind成功后执行,开始监听和处理客户端请求virtual bool bind() 绑定地址virtual void startAccept() 开始接受新的连接virtual void handleClient() 处理新连接的Socket类virtual bool stop() 停止服务 释放资源,关闭监听套接字
HttpConnection HTTP客户端类
static HttpResult::ptr DoGet(); 发送GET请求static HttpResult::ptr DoPost(); 发送POST请求static HttpResult::ptr DoRequest(); 发送HTTP请求HttpResponse::ptr recvResponse(); 接收HTTP响应int sendRequest(HttpRequest::ptr req); 发送HTTP请求
uint64_t m_createTime = 0;uint64_t m_request = 0;
recvResponse
TCPServerConf 配置结构体
address 服务器监听的地址keepalive 是否启用 keepalivetimeout 连接超时时间ssl = 0 是否启用 SSLid 服务器 IDtype 服务器类型name 服务器名称cert_file SSL 证书文件路径key_file SSL 私钥文件路径accept_worker 负责accept的协程池io_worker 负责 IO 操作的协程池process_worker 负责业务处理map<> args 额外参数
Servlet 请求处理基类
std::string m_name 名称
sendRequest
void setConf() 设置服务器配置virtual bool start() 启动服务 需要bind成功后执行,开始监听和处理客户端请求virtual bool bind() 绑定地址virtual void startAccept() 开始接受新的连接virtual void handleClient() 处理新连接的Socket类virtual bool stop() 停止服务 释放资源,关闭监听套接字
read() Socket in buffer
conn->sendRequest(req)发送请求
ServletDispatch Servlet 分发器
0 条评论
下一页
为你推荐
查看更多