zoukankan      html  css  js  c++  java
  • tomcat源码分析 Http11Processor process

    这个类中Request , Response属性都是可重复使用的,每次请求结束,都会回收,以避免请求量大时创建大量对象。

    一个Processor同一时刻只处理一个请求。

    1、请求开始时设置一些初始信息,如获取socket的inputStream, outputStream,设置当前处理状态为STATE_PARSE

    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);
    
            // Flags
            error = false;
            keepAlive = true;
            comet = false;
            openSocket = false;
            sendfileInProgress = false;
            readComplete = true;
            if (endpoint.getUsePolling()) {
                keptAlive = false;
            } else {
                keptAlive = socketWrapper.isKeptAlive();
            }
    
            if (disableKeepAlive()) {
                socketWrapper.setKeepAliveLeft(0);
            }

    2、解析部分头信息

    if (!getInputBuffer().parseRequestLine(keptAlive)) {
                        if (handleIncompleteRequestLineRead()) {
                            break;
                        }
                    }

    在这个过程,先最多读取8192个字节,可在server.xml或context.xml中配置protocol 的maxTrailerSize属性,未设置则默认为8192。

    然后根据读取到头信息,进行解析,

    a、请求方法,get或是post等,

    b、请求URL,包括URL中的请求参数

    c、请求协议类型,一般为http/1.1

    3、解析完整的头信息

    // Currently only NIO will ever return false here
                        if (!getInputBuffer().parseHeaders()) {
                            // We've read part of the request, don't recycle it
                            // instead associate it with the socket
                            openSocket = true;
                            readComplete = false;
                            break;
                        }

    4、CoyoteAdapter对象处理请求

    rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);
                        adapter.service(request, response);
                        // Handle when the response was committed before a serious
                        // error occurred.  Throwing a ServletException should both
                        // set the status to 500 and set the errorException.
                        // If we fail here, then the response is likely already
                        // committed, so we can't try and set headers.
                        if(keepAlive && !error) { // Avoid checking twice.
                            error = response.getErrorException() != null ||
                                    (!isAsync() &&
                                    statusDropsConnection(response.getStatus()));
                        }
                        setCometTimeouts(socketWrapper);
    adapter.service(request, response); 这一步的处理,较为复杂,进入了tomcat的pipeline的处理流程中,最终将调用web应用的filter、servlet。

    5、处理完请求,并做一些善后事宜,如重置processor中request, response对象,以便下一次使用。

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/knockon/p/3344734.html
Copyright © 2011-2022 走看看