標籤: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)