<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                3、對HTTP body的處理 上面我們已經開始處理http request header了,接下來,如果請求中有body內容,那么需要處理body了。這里你肯定不會想要去阻塞式的讀取body吧?body的長度可大可小,網絡環境也巨復雜,只要有阻塞操作肯定玩完。Nginx這時已經準備了一個現成的讀取body的非阻塞模式給用戶,就是ngx_http_read_client_request_body方法。 ? 大家看下ngx_http_read_client_request_body方法的原型: ngx_int_t ngx_http_read_client_request_body(ngx_http_request_t r,ngx_http_client_body_handler_pt post_handler); 參數r就是要處理的請求,post_handler則是body接收完成后的回調方法。 所以,在worker進程中,調用ngx_http_read_client_request_body是不會阻塞的,要么讀完socket上的buffer發現不完整立刻返回,等待下一次EPOLLIN事件,要么就是讀完body了,調用用戶定義的post_handler方法去處理body。 ? ngx_http_read_client_request_body提供兩種保存body的方式,一種是把body存儲在內存中,另一種是把body存儲到臨時文件里。這個臨時文件也有不同的處理方法,一種是請求結束后nginx便清理掉,另外就是永久保留這個臨時文件。例如下面這兩個參數就會設定為每個body都存放到臨時文件里,并且這個臨時文件在請求結束后不會被刪除: ????????r->request_body_in_persistent_file = 1; ????????r->request_body_in_file_only = 1; ? 貌似ngx_http_read_client_request_body已經提供了很足夠的功能了,其實不然。比如,我現在實現的業務中,就要求針對不同的請求,我要把body放到不同的目錄下,也就是不同的mountpoint點上。這樣,如果我把臨時body指定到同一個mountpoint點下,相當于已經存儲到遠程機器上了,但是nginx的ngx_http_read_client_request_body方法是不提供這個功能的,它的臨時文件目錄早在編譯時已經通過--http-client-body-temp-path=指定了,無法在運行時更改,比較惡心的實現。我想實現這個功能,只能自己重構下接收body這套方法了。這里我把我的處理方法(修改自ngx_http_read_client_request_body處理步驟)說下,方便大家理解body的接收過程。 ? 在我決定開始接收body后,首先調用ngx_http_read_webex_DMD_request_body方法,同時把處理完整body的勾子函數ngx_webex_DMD_handler_request_body也傳進去。如果需要把temp body file放到指定目錄,這時需要按照自己的方式把臨時目錄傳進去,通過參數或者通過自定義的ngx_Module_ctx_t方式,這個隨意。 ngx_http_read_webex_DMD_request_body方法首先判斷是否存在body,如果不存在,立刻回調ngx_webex_DMD_handler_request_body方法;如果存在body,那么根據已經收到的buffer判斷是否已經接收完body,如果已經收到完整的body,判斷是否需要寫入臨時文件中,若需要則調用webex_DMD_ngx_http_write_request_body方法寫臨時文件,然后回調ngx_webex_DMD_handler_request_body。則如果沒有收完,調用webex_DMD_ngx_http_do_read_client_request_body方法。 ? webex_DMD_ngx_http_do_read_client_request_body方法里,首先查看無阻塞的socket上是否仍有buffer,有則讀出,再次判斷是否body完整,如果已經收到完整的body,判斷是否需要寫入臨時文件中,若需要則調用webex_DMD_ngx_http_write_request_body方法寫臨時文件,然后回調ngx_webex_DMD_handler_request_body。如果不完整,注冊EPOLLIN事件的回調函數為webex_DMD_ngx_http_read_client_request_body_handler,把控制權交回給nginx epoll,等待下一次的EPOLLIN事件。下次EPOLLIN事件到達時,調用webex_DMD_ngx_http_read_client_request_body_handler,然后該函數會繼續調用webex_DMD_ngx_http_do_read_client_request_body讀取buffer,重復上一個步驟,直到body完整。 ? 為了大家方便理解,我再畫一幅活動圖吧。 ![](https://box.kancloud.cn/2016-04-07_5706251593c25.gif) ?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看