<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    上善若水
    In general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatra
    posts - 146,comments - 147,trackbacks - 0

    概述

    Jetty作為HTTP服務(wù)器,服務(wù)器和客戶端以HTTP協(xié)議格式通信,Jetty使用Parser(HttpParser)來抽象HTTP請(qǐng)求消息和響應(yīng)消息的解析類引擎。在HttpParser實(shí)現(xiàn)中,它采用有限狀態(tài)機(jī)算法:定義了21中狀態(tài),每解析一個(gè)字符,就根據(jù)當(dāng)前的狀態(tài)做相應(yīng)的處理,并決定是否要遷移到下一個(gè)狀態(tài),直到HTTP請(qǐng)求消息或響應(yīng)消息解析完成。HttpParser采用事件驅(qū)動(dòng)機(jī)制,它定義了EventHandler類,用戶可以通過注冊(cè)的EventHandler實(shí)例獲取相應(yīng)的消息:請(qǐng)求行解析完成(startRequest)、響應(yīng)行解析完成(startResponse)、每個(gè)消息頭解析完成(parsedHeader)、所有消息頭解析完成(headerComplete)、消息內(nèi)容解析完成(content)、整個(gè)消息(請(qǐng)求消息或響應(yīng)消息)解析完成(messageComplete)。

    Parser接口定義

    public interface Parser {
        // 重置Parser的內(nèi)部狀態(tài),以重用Parser實(shí)例,如果returnBuffers為true,則將內(nèi)部Buffer回收。
        void reset(boolean returnBuffers);
        // 當(dāng)前Parser是否已經(jīng)解析完成。
        boolean isComplete();
        // 當(dāng)前Parser是否處于Idle狀態(tài),它還處于初始狀態(tài),解析還沒有開始。
        boolean isIdle();
        // 內(nèi)部Buffer是否還有內(nèi)容沒有解析。
        boolean isMoreInBuffer() throws IOException;
        // 開始解析已接收到的消息,返回-1表示解析到流的末位,0表示沒有該次調(diào)用沒有解析任何消息,>0表示這次調(diào)用總共解析過的字節(jié)數(shù)。
        int parseAvailable() throws IOException;
    }

    EventHandler定義

    public static abstract class EventHandler {
        // 消息內(nèi)容解析完成
        public abstract void content(Buffer ref) throws IOException;

        // 所有消息頭解析完成
        public void headerComplete() throws IOException {
        }

        // 整個(gè)消息(請(qǐng)求消息或響應(yīng)消息)解析完成
        public void messageComplete(long contentLength) throws IOException {
        }

        // 每個(gè)消息頭解析完成
        public void parsedHeader(Buffer name, Buffer value) throws IOException {
        }

        // 請(qǐng)求行解析完成
        public abstract void startRequest(Buffer method, Buffer url, Buffer version)
                throws IOException;

        // 響應(yīng)行解析完成
        public abstract void startResponse(Buffer version, int status, Buffer reason)
                throws IOException;
    }

    EventHandler的實(shí)現(xiàn)類

    在HttpConnection的內(nèi)部類RequestHandler類實(shí)現(xiàn)了HttpParser.EventHandler類,以作為HttpParser使用時(shí)的回調(diào)。
    startRequest:重置當(dāng)前HttpConnection狀態(tài),HttpRequest的時(shí)間戳,設(shè)置新解析出來的RequestMethod、URI、version信息。
    parsedHeader:將每個(gè)HTTP頭(name, value)對(duì)添加到_requestFields字段中,并檢查某些頭的存在性以及其值的合法性。
    1. 如果“host”頭存在,則設(shè)置_host為true。
    2. 對(duì)“Expect”頭,如果其值是“100-continue”,設(shè)置_expect100Continue為true,若值是“102-processing”,設(shè)置_expect102Processing值為true,當(dāng)信息不足時(shí),設(shè)置_expect為true。
    3. 對(duì)“Accept-Encoding”和“User-Agent”頭,只能是預(yù)定義的值。
    4. 對(duì)“Content-Type”頭只能是預(yù)定義的值,并且根據(jù)該值設(shè)置_charset字段。
    5. 對(duì)“Connectin”頭,如果是“close”值,則設(shè)置HttpGenerator的persistent屬性為false,并且設(shè)置_responseFields的“Connection”值為“close”,否則為“keep-alive”。
    headerComplete:在HTTP消息頭解析結(jié)束后,對(duì)AsyncEndpoint,調(diào)用其scheduleIdle()方法,設(shè)置HttpGenerator中的HTTP version字段,以及當(dāng)前請(qǐng)求是否為HEAD請(qǐng)求,如果當(dāng)前Server配置了sendDateHeader,則設(shè)置HttpGenerator的Date字段為HttpRequest的時(shí)間戳(在startRequest方法調(diào)用是設(shè)置)。對(duì)HTTP/1.1,如果沒有設(shè)置Host頭,直接返回400響應(yīng)(調(diào)用_generator的completeHeader和complete方法);如果expect為true,表示Expect頭設(shè)置有問題,直接返回417響應(yīng)(調(diào)用_generator的completeHeader和complete方法)。設(shè)置_charset字段,對(duì)CHUNK請(qǐng)求立即開始處理請(qǐng)求(handleRequest),否則延遲到消息讀取完成。
    content:對(duì)AsyncEndPoint,調(diào)用其scheduleIdle()方法,如果請(qǐng)求還未開始處理,則立即開始處理請(qǐng)求。
    messageComplete:如果請(qǐng)求還未開始處理,則立即開始處理請(qǐng)求。

    注:這里并沒有在content方法中保存消息體的內(nèi)容,在Jetty中使用HttpInput類從HttpParser中直接讀取消息體的內(nèi)容(通過HttpInput的read方法調(diào)用HttpParser.blockForContent()方法)。

    HttpPaser有限狀態(tài)機(jī)實(shí)現(xiàn)

    在HttpParser中定義了21中狀態(tài),其中STATE_END以前的狀態(tài)用于解析HTTP頭消息,而STATE_END以后的狀態(tài)用于解析HTTP消息體。它們各自的狀態(tài)遷移圖如下。

    HttpParser在解析HTTP消息頭時(shí)的狀態(tài)遷移圖

    HttpParser在解析HTTP消息體時(shí)的狀態(tài)遷移圖

    HttpParser在HttpConnection類中的使用

    HttpParser在HttpConnection中的handle方法被調(diào)用時(shí)用于解析客戶端過來的HTTP請(qǐng)求消息。
    if (!_parser.isComplete()) {
         int parsed=_parser.parseAvailable();
         if (parsed>0)
             progress=true;
    }
    posted on 2014-04-19 18:31 DLevin 閱讀(2508) 評(píng)論(3)  編輯  收藏 所屬分類: Jetty

    FeedBack:
    # re: 深入Jetty源碼之HttpParser
    2014-04-21 10:53 | 無添加
    想問下TF-IDF算法實(shí)現(xiàn)的具體事例有嗎?  回復(fù)  更多評(píng)論
      
    # re: 深入Jetty源碼之HttpParser
    2014-05-15 05:00 | jptan
    請(qǐng)問博主是如何把uml圖做出來的呢?  回復(fù)  更多評(píng)論
      
    # re: 深入Jetty源碼之HttpParser
    2014-05-15 13:54 | DLevin
    用StarUML@jptan
      回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: eeuss影院免费直达入口| 久久亚洲欧洲国产综合| 你懂的免费在线观看网站| 亚洲熟女精品中文字幕| 久久久久亚洲av无码专区喷水| 国产成人精品日本亚洲专区| 女人18毛片a级毛片免费视频| 久久国产精品一区免费下载| 精品一区二区三区免费视频| 猫咪免费人成在线网站| 亚洲精品无码久久久久A片苍井空| 亚洲成人免费网址| 一区二区三区亚洲| 亚洲av网址在线观看| 亚洲综合AV在线在线播放| 四虎亚洲国产成人久久精品| 色播在线永久免费视频| 成人人观看的免费毛片| 男人的好免费观看在线视频| 久久WWW免费人成一看片| 久久久免费精品re6| 久久一区二区三区免费播放 | 91情侣在线精品国产免费| 99免费观看视频| 亚洲免费视频网站| 久久精品免费电影| 亚洲视频免费在线观看| 四虎国产精品永久免费网址| 久久久国产精品福利免费| 免费久久人人爽人人爽av| 免费在线观影网站| 国产高清不卡免费视频| 久久国产精品免费观看| 99爱在线观看免费完整版| 蜜桃AV无码免费看永久| 亚洲免费一级视频| 国产免费av片在线看| 午夜一区二区免费视频| 全部免费毛片免费播放| 亚洲人妻av伦理| 日本亚洲欧洲免费天堂午夜看片女人员 |