swoole的协议解析是在reactor线程中处理的,在reactor swReactorThread_loop() 事件循环中通过 swPort_set_protocol() 注册了协议解析处理函数, 其中http的协议解析函数是 swPort_onRead_http()
reactor线程启动文件: src/network/ReactorThread.c swReactorThread_start()
如果对reactor事件处理流程不清楚可以参考这篇文章 swoole-主线程和reactor线程交互流程
下面主要来看 swPort_onRead_http, 对http协议的解析 。 这里说明下,有了这个协议解析后,如果你启动的是http server或者,启动是配置了 open_http_protocol 选项, 都会执行swPort_onRead_http对数据进行http协议解析, 这样在 onReceive() 中接收到的就是整个http请求的数据
swPort_onRead_http() 函数在 src/network/Port.c 文件中, 源码就不帖了, 说下这个函数的主要功能
- 通过 swConnection_recv() 可能多次获取, 保证最终拿到一个完整的http包, 如果大文件这种会收到一个一个http chunk包, chunk的处理不在这里,而是在具体的worker中
- 如果http method是 100-continue, 则直接处理
- 如果请求的是静态文件,则通过 swPort_http_static_handler() 直接返回静态文件内容, 静态文件处理说明
- 其他情况都通过 swReactorThread_dispatch(conn, buffer->str, buffer->length); 发送给worker去处理
通过swReactorThread_dispatch后 会回调worker的 onRequest,或者onReceive() 的回调函数, 关于http协议的解析,以及数据是如何解析到 Http\Request->header、 Http\Request->get、 Http\Request->post等是在 swoole_http_server.c 中完成
网友评论