zoukankan      html  css  js  c++  java
  • tomcat启动(Ⅶ)请求处理--Processor.process(SocketWrapper<S> socketWrapper)

    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()生成了

    @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 swallow
    private 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类的构造方法中可以看到。

  • 相关阅读:
    日常学习随笔-数组、单链表、双链表三种形式实现队列结构的基本操作(源码注释)
    代码重构之单元测试
    C# yield return 用法与解析
    MVC学习手册之数据注解与验证
    C#数字图像处理算法学习笔记(三)--图像几何变换
    关于变量名与类名同名问题
    C# 计时器
    C#入门--索引器
    C#入门--字段与属性
    var与dynamic
  • 原文地址:https://www.cnblogs.com/gne-hwz/p/7808652.html
Copyright © 2011-2022 走看看