Nginx SPDY patch实现
前不久Nginx官方放出了SPDY的patch,到目前为止都还未合并进nginx源码,主要还是由于此patch还远不成熟,代码和功能都还不足够完善。个人感觉spdy patch合并进nginx源码还有些时日。本文是基于目前的patch,初窥一下nginx官方是如何在实现spdy。
static ngx_int_tngx_http_spdy_process_headers(ngx_http_spdy_connection_t *sc, u_char **pos, size_t size){ int z; ngx_buf_t *buf; ngx_int_t rc; ngx_uint_t last; ngx_table_elt_t *h; ngx_connection_t *c; ngx_http_request_t *r; 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 sc->processing++;// 这里将要开始执行这个请求了,下面详细看看其过程。 ngx_http_spdy_run_request(r);// 这个frame处理完成后,就重置spdy解析器为frame判断入口回调函数,准备处理下一个frame。 sc->handler = ngx_http_spdy_process_frame; return NGX_DONE;}static voidngx_http_spdy_run_request(ngx_http_request_t *r){ ngx_uint_t i; ngx_list_part_t *part; ngx_table_elt_t *h; ngx_connection_t *fc; ngx_http_header_t *hh; ngx_http_core_main_conf_t *cmcf;// 根据spdy的请求数据去构造普通http的请求行,这就是前面提到的spdy到http的转化过程。 if (ngx_http_spdy_construct_request_line(r) != NGX_OK) { ngx_http_spdy_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return; } 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 r->http_state = NGX_HTTP_PROCESS_REQUEST_STATE;// 处理header,也是在转化spdy到http。 if (ngx_http_process_request_header(r) != NGX_OK) { return; } if (r->plain_http) { ngx_log_error(NGX_LOG_INFO, fc->log, 0, "client sent plain HTTP request to HTTPS port"); ngx_http_spdy_finalize_request(r, NGX_HTTP_TO_HTTPS); return; }#if (NGX_STAT_STUB) (void) ngx_atomic_fetch_add(ngx_stat_reading, -1); r->stat_reading = 0; (void) ngx_atomic_fetch_add(ngx_stat_writing, 1); r->stat_writing = 1;#endif r->write_event_handler = ngx_http_core_run_phases;// 开始执行请求,主要执行所有的phases阶段,这里就开始进入了普通http请求的流程了。// 接下去就是经过所有的handler,filter等模块流程。 ngx_http_core_run_phases(r); ngx_http_run_posted_requests(fc);}
总结:
spdy patch的实现还是非常的清晰,主要目标就两个:1、是解析spdy frame,2、是转化为了http request。从代码可以看出此patch仅仅是一个初步的实现,还有很多的地方没有完善,后面nginx官网在实现上指不定还有大的调整也不奇怪。当然,spdy的server push等复杂又强大功能在此patch中根本还没有一点实现。