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对象,以便下一次使用。

 

posted on 2013-09-28 21:24  knockon  阅读(1863)  评论(0编辑  收藏  举报

导航