<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服務器,服務器和客戶端以HTTP協議格式通信,Jetty使用Parser(HttpParser)來抽象HTTP請求消息和響應消息的解析類引擎。在HttpParser實現中,它采用有限狀態機算法:定義了21中狀態,每解析一個字符,就根據當前的狀態做相應的處理,并決定是否要遷移到下一個狀態,直到HTTP請求消息或響應消息解析完成。HttpParser采用事件驅動機制,它定義了EventHandler類,用戶可以通過注冊的EventHandler實例獲取相應的消息:請求行解析完成(startRequest)、響應行解析完成(startResponse)、每個消息頭解析完成(parsedHeader)、所有消息頭解析完成(headerComplete)、消息內容解析完成(content)、整個消息(請求消息或響應消息)解析完成(messageComplete)。

    Parser接口定義

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

    EventHandler定義

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

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

        // 整個消息(請求消息或響應消息)解析完成
        public void messageComplete(long contentLength) throws IOException {
        }

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

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

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

    EventHandler的實現類

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

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

    HttpPaser有限狀態機實現

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

    HttpParser在解析HTTP消息頭時的狀態遷移圖

    HttpParser在解析HTTP消息體時的狀態遷移圖

    HttpParser在HttpConnection類中的使用

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

    FeedBack:
    # re: 深入Jetty源碼之HttpParser
    2014-04-21 10:53 | 無添加
    想問下TF-IDF算法實現的具體事例有嗎?  回復  更多評論
      
    # re: 深入Jetty源碼之HttpParser
    2014-05-15 05:00 | jptan
    請問博主是如何把uml圖做出來的呢?  回復  更多評論
      
    # re: 深入Jetty源碼之HttpParser
    2014-05-15 13:54 | DLevin
    用StarUML@jptan
      回復  更多評論
      
    主站蜘蛛池模板: 久久www免费人成精品香蕉| 麻豆精品成人免费国产片| 青柠影视在线观看免费| 国产日本一线在线观看免费| 亚洲福利在线播放| 91亚洲精品麻豆| 本道天堂成在人线av无码免费| 免费可以看黄的视频s色| 亚洲区小说区图片区| 亚洲成年人免费网站| 国产成人无码精品久久久免费| 日本一区二区三区免费高清| 亚洲一区爱区精品无码| 亚洲综合色婷婷在线观看| 国产猛男猛女超爽免费视频| 成人永久免费高清| 亚洲美女视频一区二区三区| 一边摸一边桶一边脱免费视频| 手机在线看永久av片免费| 久久精品国产亚洲沈樵| 亚洲av无码成人精品国产| 久久w5ww成w人免费| 久久亚洲国产成人精品无码区| 日本亚洲免费无线码| 久久这里只精品热免费99| 亚洲国产精品日韩专区AV| 亚洲视频无码高清在线| 久久久久久夜精品精品免费啦| 亚洲午夜成人精品电影在线观看| 亚洲AV日韩综合一区尤物| 在线观看免费中文视频| 国产亚洲美女精品久久久2020| 亚洲色大18成人网站WWW在线播放| 最近中文字幕mv免费高清视频8| 久久精品国产亚洲AV不卡| 黑人粗长大战亚洲女2021国产精品成人免费视频 | AAAAA级少妇高潮大片免费看| 成人永久福利免费观看| 亚洲综合伊人制服丝袜美腿| 在线免费观看国产| 亚洲av永久无码精品网站|