HTTP框架

本文详细介绍了Nginx中HTTP模块的处理流程,从ngx_XXX_init注册处理函数开始,到ngx_XXX_handler被调用的过程。通过分析ngx_http_core_content_phase、ngx_http_process_request等函数,揭示了HTTP请求从接收到处理的内部机制,包括读取请求头、解析HTTP协议和处理请求内容的步骤。
摘要由CSDN通过智能技术生成

比如当nginx收到一个http请求时,我的module需要处理这个请求,那么我应该怎么做?实际这个问题还要再细分。如果是希望nginx收到完整的HTTP请求,再交给我的module处理?又或者只需要接收到完整的http header就给我呢?我把接收完header就交给module处理的code列下,再说下它的处理流程。

首先我要在ngx_XXX_init里注册对这种请求的处理函数。

static char * ngx_XXX_init(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

         //... code 省略

        

         clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

         clcf->handler = ngx_XXX_handler;

 

         return NGX_CONF_OK;

}

好了,现在有个简单的GET请求进入后,nginx在接收完header,就来调用ngx_XXX_handler方法了。好,现在我们调试下,看看nginx是如何进入ngx_XXX_handler方法的。

#0  ngx_XXX_handler (r=0x6d5650)

    at nginx_XXX_module/ngx_XXX_module.c:646

#1  0x0000000000429e77 in ngx_http_core_content_phase (r=0x6d5650, ph=0x6e17d8)

    at src/http/ngx_http_core_module.c:1262

#2  0x00000000004292d0 in ngx_http_core_run_phases (r=0x6d5650)

    at src/http/ngx_http_core_module.c:800

#3  0x0000000000429284 in ngx_http_handler (r=0x6d5650)

    at src/http/ngx_http_core_module.c:783

#4  0x000000000043165c in ngx_http_process_request (r=0x6d5650)

    at src/http/ngx_http_request.c:1615

#5  0x0000000000430845 in ngx_http_process_request_headers (rev=0x6d60d0)

    at src/http/ngx_http_request.c:1064

#6  0x00000000004303a0 in ngx_http_process_request_line (rev=0x6e3730)

    at src/http/ngx_http_request.c:869

#7  0x000000000042fa8a in ngx_http_init_request (rev=0x6e3730)

    at src/http/ngx_http_request.c:510

#8  0x0000000000422d6f in ngx_epoll_process_events (cycle=0x6cb1d0, timer=Variable "timer" is not available.

)

    at src/event/modules/ngx_epoll_module.c:518

#9  0x00000000004181cb in ngx_process_events_and_timers (cycle=0x6cb1d0)

    at src/event/ngx_event.c:245

#10 0x0000000000420351 in ngx_worker_process_cycle (cycle=0x6cb1d0, data=Variable "data" is not available.

)

    at src/os/unix/ngx_process_cycle.c:791

#11 0x000000000041e19b in ngx_spawn_process (cycle=0x6cb1d0,

    proc=0x420271 <ngx_worker_process_cycle>, data=0x0, name=0x5171a4 "worker process",

    respawn=-3) at src/os/unix/ngx_process.c:194

#12 0x000000000041f8df in ngx_start_worker_processes (cycle=0x6cb1d0, n=1, type=-3)

    at src/os/unix/ngx_process_cycle.c:355

#13 0x000000000041f24d in ngx_master_process_cycle (cycle=0x6cb1d0)

    at src/os/unix/ngx_process_cycle.c:136

#14 0x0000000000403dea in main (argc=1, argv=Variable "argv" is not available.

) at src/core/nginx.c:396

 

上面这个栈信息,可以初步看到nginx是如果调用ngx_XXX_handler,我再详细说下。

ngx_epoll_process_events接收到网络IO事件EPOLLIN后(socket上有数据可读),rev->handler(rev);调用了这个回调方法(ngx_http_init_request)。ngx_http_init_request开始处理这个事件,首先它把基本的ngx_http_request_t变量(nginx HTTP框架中由始至终的东东)初始化,并从内存池中分配了第一块接收内存,然后开始调用ngx_http_process_request_line方法处理具体内容。

ngx_http_process_request_line开始处理具体接收到的消息了,它首先会调用ngx_http_read_request_header方法去读取socket上的字节,读完后(仅仅是当前socket上的缓冲)调用ngx_http_parse_request_line方法分析协议,ngx_http_parse_request_line方法就是一个HTTP协议的状态机实现,分析HTTP协议并赋值到ngx_http_request_t相应的字段里,如果不完整,就返回epoll等待这个socket上的下一次EPOLLIN事件。如果HTTP协议头完整了,就开始调用ngx_http_process_request_headers处理http header的内容了

ngx_http_process_request_headers方法会先调用ngx_http_parse_header_line去分析http header。ngx_http_parse_header_line也是一个状态机,仅用来解析http header,之后开始调用ngx_http_process_request方法处理已经解析成功的ngx_http_request_t对象。ngx_http_process_request简单的调用ngx_http_handler方法,ngx_http_handler方法把事件发布到ngx_http_core_run_phases阶段,开始回调我们在ngx_XXX_init方法中注册的ngx_XXX_handle方法

现在大家清楚一个最基本的module处理流程是怎样的了吧?如果大家还是不大明白,我画个活动图帮助大家理解下:

简介: 本框架是在Netroid的基础之上进行了封装,节省了其中配置的过程和一些不必要的操作 主要进行文本请求和图片请求,图片请求都进行了缓存(内存缓存和sd卡缓存)的封装,sd卡缓存时间可自行更改. 文本请求可传入解析的泛型clazz,即可返回解析后的clazz对象进行数据 操作,如果不需要进行数据解析,可通过另一种方式获取原生的string; 单图请求,单图请求可执行对本地asset文件夹,sd卡,http三种请求模式.只需传入相应的路径即可; 多图请求,多图请求主要是针对listview这种图文混排模式而生,能快速加载图片并实现缓存,不需要考虑 图片错位问题.只需传入相应的url即可完成全部功能. 使用说明: 1:在新创建的Manifest.xml中application中申明: <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.aqs.application.UApplication" > 并初始化Const.init();此处的初始化主要是对内存缓存,SD卡缓存大小,缓存时间等进行设置,如果不初始化,则按使用默认配置; 2:依赖HttpAqs-library或者jar包 3:通过公有方法进行网络请求,示例如下: >文本请求: >解析后的文本请求: HttpRequest.reqquest(int,String,Parse,Class){....}; >原生string文本请求: HttpRequest.getString(String,AqsString){...} >单张图片请求: HttpRequest.setImage(ImageView,String,int,int){...} >多张图片请求: 可使用AQSImageView控件来加载图片;特别是针对listview图文混排 实现方法: >在布局中添加 >在代码中 av.setImageUrl(url);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值