tomcat啟動(Ⅶ)請求處理--Processor.process(SocketWrapper<S> socketWrapper)

來源:互聯網
上載者:User

標籤:turn   mmap   response   cep   false   doc   head   output   point   

tomcat啟動(六)Catalina分析-StandardServer.start()

上一篇分析到:Http11NioProcessor.process(SocketWrapper<S> socketWrapper)會將請求進行轉換成產生request,和response對象,然後調用CoyoteAdapter.service(request,response)傳遞請求給對應的上下文

初始化構造方法

public Http11NioProcessor(int maxHttpHeaderSize, boolean rejectIllegalHeaderName,            NioEndpoint endpoint, int maxTrailerSize, Set<String> allowedTrailerHeaders,            int maxExtensionSize, int maxSwallowSize)

Http11NioProcessor這個對象產生是由createProcessor()產生了

org.apache.coyote.http11.Http11NioProtocol.Http11ConnectionHandler.createProcessor()
@Override        public Http11NioProcessor createProcessor() {            Http11NioProcessor processor = new Http11NioProcessor(                    proto.getMaxHttpHeaderSize(), proto.getRejectIllegalHeaderName(),                    (NioEndpoint)proto.endpoint, proto.getMaxTrailerSize(),                    proto.getAllowedTrailerHeadersAsSet(), proto.getMaxExtensionSize(),                    proto.getMaxSwallowSize());            proto.configureProcessor(processor);            register(processor);            return processor;        }

構造參數都是由proto對象提供,這個對象是表示Http11NioProtocol

para1:private int maxHttpHeaderSize = 8 * 1024;para2:private boolean rejectIllegalHeaderName = false;para3:NioEndpoint ;略。para4:以尾部為標題的最大大小,位元組為單位private int maxTrailerSize = 8192;para5:允許通過尾部發送的標題名稱。它們以小寫形式儲存。   private Set<String> allowedTrailerHeaders =            Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());para6:分塊編碼中擴充資訊的最大大小private int maxExtensionSize = 8192;para7:Maximum amount of request body to swallowprivate int maxSwallowSize = 2 * 1024 * 1024;

 

再看下構造方法裡究竟幹了神馬

Http11NioProcessor
public Http11NioProcessor(int maxHttpHeaderSize, boolean rejectIllegalHeaderName,            NioEndpoint endpoint, int maxTrailerSize, Set<String> allowedTrailerHeaders,            int maxExtensionSize, int maxSwallowSize) {        super(endpoint);        inputBuffer = new InternalNioInputBuffer(request, maxHttpHeaderSize,                rejectIllegalHeaderName);        request.setInputBuffer(inputBuffer);        outputBuffer = new InternalNioOutputBuffer(response, maxHttpHeaderSize);        response.setOutputBuffer(outputBuffer);        initializeFilters(maxTrailerSize, allowedTrailerHeaders, maxExtensionSize, maxSwallowSize);    }

super(endpoint)

public AbstractHttp11Processor(AbstractEndpoint<S> endpoint) {        super(endpoint);        userDataHelper = new UserDataHelper(getLog());    }

 繼續super(endpoint)

public AbstractProcessor(AbstractEndpoint<S> endpoint) {        this.endpoint = endpoint;        asyncStateMachine = new AsyncStateMachine(this);        request = new Request();        response = new Response();        response.setHook(this);        request.setResponse(response);        request.setHook(this);    }

 到這裡就可以知道了。原來就是初始化org.apache.coyote.Request、org.apache.coyote.Response、InternalNioInputBuffer、InternalNioOutputBuffer對象

InputBuffer和request匹配。OutputBuffer和response匹配。

注意:

request.setInputBuffer(inputBuffer);

 request關聯的inputbuffer對象與我們線程接收到的socket相關聯。這裡相當於完成的request初始化。最後會傳遞到對應的context

初始化完後,接著看Http11NioProcessor.process

/**     * Process pipelined HTTP requests using the specified input and output     * streams.     *     * @param socketWrapper Socket from which the HTTP requests will be read     *               and the HTTP responses will be written.     *     * @throws IOException error during an I/O operation     */    @Override    public SocketState process(SocketWrapper<S> socketWrapper){        RequestInfo rp = request.getRequestProcessor();        rp.setStage(org.apache.coyote.Constants.STAGE_PARSE);    // Setting up the I/O解析階段        setSocketWrapper(socketWrapper);        getInputBuffer().init(socketWrapper, endpoint);        getOutputBuffer().init(socketWrapper, endpoint);     。    。    。if (!getErrorState().isError()) {                // Setting up filters, and parse some request headers、、準備階段                rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE);                try {                    prepareRequest();                }。。。// Process the request in the adapter            if (!getErrorState().isError()) {                try {、、、請求處理階段                    rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);                    getAdapter().service(request, response);。。。// Finish the handling of the request            rp.setStage(org.apache.coyote.Constants.STAGE_ENDINPUT);    endRequest();。。。後面階段省略rp.setStage(org.apache.coyote.Constants.STAGE_ENDOUTPUT);rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE);rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);

 從解析階段

getInputBuffer().init(socketWrapper, endpoint);從socket中擷取inputBuffer,初始化一個SocketInputBuffer對象來執行doRead()進行讀操作
getOutputBuffer().init(socketWrapper, endpoint);從socket中擷取outputBuffer,初始化一個SocketOutputBuffer對象來執行doWrite()進行寫操作

 請求處理階段。(重點)

getAdapter().service(request, response);

 到這裡就是將請求轉寄到對應context處理的。請求初始化在Http11NioProcessor類的構造方法中可以看到。

 

tomcat啟動(Ⅶ)請求處理--Processor.process(SocketWrapper<S> socketWrapper)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.