Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors

来源:互联网 发布:c语言double型 编辑:程序博客网 时间:2024/05/24 06:31
<p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">tomcat进行http request解析的时候报错,并将错误返回给客户端了,具体的错误如下:</p><pre class="prettyprint css" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto; color:rgb(51,51,51)" name="code"> <span class="tag" style="color:rgb(0,0,128)">org</span><span class="class" style="color:rgb(68,85,136); font-weight:bold">.apache</span><span class="class" style="color:rgb(68,85,136); font-weight:bold">.coyote</span><span class="class" style="color:rgb(68,85,136); font-weight:bold">.http11</span><span class="class" style="color:rgb(68,85,136); font-weight:bold">.AbstractHttp11Processor</span><span class="class" style="color:rgb(68,85,136); font-weight:bold">.process</span> <span class="tag" style="color:rgb(0,0,128)">Error</span> <span class="tag" style="color:rgb(0,0,128)">parsing</span> <span class="tag" style="color:rgb(0,0,128)">HTTP</span> <span class="tag" style="color:rgb(0,0,128)">request</span> <span class="tag" style="color:rgb(0,0,128)">header</span> <span class="tag" style="color:rgb(0,0,128)">Note</span>: <span class="tag" style="color:rgb(0,0,128)">further</span> <span class="tag" style="color:rgb(0,0,128)">occurrences</span> <span class="tag" style="color:rgb(0,0,128)">of</span> <span class="tag" style="color:rgb(0,0,128)">HTTP</span> <span class="tag" style="color:rgb(0,0,128)">header</span> <span class="tag" style="color:rgb(0,0,128)">parsing</span> <span class="tag" style="color:rgb(0,0,128)">errors</span> <span class="tag" style="color:rgb(0,0,128)">will</span> <span class="tag" style="color:rgb(0,0,128)">be</span> <span class="tag" style="color:rgb(0,0,128)">logged</span> <span class="tag" style="color:rgb(0,0,128)">at</span> <span class="tag" style="color:rgb(0,0,128)">DEBUG</span> <span class="tag" style="color:rgb(0,0,128)">level</span>.<div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">查看对应的类代码,其中涉及的方法如下:</p><pre class="prettyprint java" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code"><span class="keyword" style="font-weight:bold">public</span> SocketState process(SocketWrapper<S> socketWrapper)<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">throws</span> IOException {<span class="indent">  </span><span class="indent">  </span>RequestInfo rp = request.getRequestProcessor();<span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_PARSE);<span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Setting up the I/O</span><span class="indent">  </span><span class="indent">  </span>setSocketWrapper(socketWrapper);<span class="indent">  </span><span class="indent">  </span>getInputBuffer().init(socketWrapper, endpoint);<span class="indent">  </span><span class="indent">  </span>getOutputBuffer().init(socketWrapper, endpoint);<span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Flags</span><span class="indent">  </span><span class="indent">  </span>keepAlive = <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span>comet = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span>openSocket = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span>sendfileInProgress = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span>readComplete = <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (endpoint.getUsePolling()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keptAlive = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keptAlive = socketWrapper.isKeptAlive();<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (disableKeepAlive()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>socketWrapper.setKeepAliveLeft(<span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">while</span> (!getErrorState().isError() && keepAlive && !comet && !isAsync() &&<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>httpUpgradeHandler == <span class="keyword" style="font-weight:bold">null</span> && !endpoint.isPaused()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Parsing the request header</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">try</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setRequestLineReadTimeout();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!getInputBuffer().parseRequestLine(keptAlive)) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (handleIncompleteRequestLineRead()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (endpoint.isPaused()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// 503 - Service unavailable</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">503</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, <span class="keyword" style="font-weight:bold">null</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keptAlive = <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Set this every time in case limit has been changed via JMX</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>request.getMimeHeaders().setLimit(endpoint.getMaxHeaderCount());<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Currently only NIO will ever return false here</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!getInputBuffer().parseHeaders()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// We've read part of the request, don't recycle it</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// instead associate it with the socket</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>openSocket = <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>readComplete = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!disableUploadTimeout) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setSocketTimeout(connectionUploadTimeout);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (IOException e) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getLog().isDebugEnabled()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().debug(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>sm.getString(<span class="string" style="color:rgb(221,17,68)">"http11processor.header.parse"</span>), e);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_NOW, e);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (Throwable t) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>ExceptionUtils.handleThrowable(t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UserDataHelper.Mode logMode = userDataHelper.getNextMode();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (logMode != <span class="keyword" style="font-weight:bold">null</span>) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>String message = sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.header.parse"</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">switch</span> (logMode) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> INFO_THEN_DEBUG:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>message += sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.fallToDebug"</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">//$FALL-THROUGH$</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> INFO:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().info(message);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> DEBUG:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().debug(message);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// 400 - Bad Request</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">400</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getAdapter().log(request, response, <span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!getErrorState().isError()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Setting up filters, and parse some request headers</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_PREPARE);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">try</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>prepareRequest();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (Throwable t) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>ExceptionUtils.handleThrowable(t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getLog().isDebugEnabled()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().debug(sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.request.prepare"</span>), t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// 500 - Internal Server Error</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">500</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getAdapter().log(request, response, <span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (maxKeepAliveRequests == <span class="number" style="color:rgb(0,153,153)">1</span>) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keepAlive = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> <span class="keyword" style="font-weight:bold">if</span> (maxKeepAliveRequests > <span class="number" style="color:rgb(0,153,153)">0</span> &&<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>socketWrapper.decrementKeepAlive() <= <span class="number" style="color:rgb(0,153,153)">0</span>) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keepAlive = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Process the request in the adapter</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!getErrorState().isError()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">try</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_SERVICE);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getAdapter().service(request, response);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Handle when the response was committed before a serious</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// error occurred.  Throwing a ServletException should both</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// set the status to 500 and set the errorException.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// If we fail here, then the response is likely already</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// committed, so we can't try and set headers.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span>(keepAlive && !getErrorState().isError() && (<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.getErrorException() != <span class="keyword" style="font-weight:bold">null</span> ||<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>(!isAsync() &&<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>statusDropsConnection(response.getStatus())))) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, <span class="keyword" style="font-weight:bold">null</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setCometTimeouts(socketWrapper);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (InterruptedIOException e) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_NOW, e);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (HeadersTooLargeException e) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// The response should not have been committed but check it</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// anyway to be safe</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (response.isCommitted()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_NOW, e);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.reset();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">500</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, e);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setHeader(<span class="string" style="color:rgb(221,17,68)">"Connection"</span>, <span class="string" style="color:rgb(221,17,68)">"close"</span>); <span class="comment" style="color:rgb(153,153,136); font-style:italic">// TODO: Remove</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">catch</span> (Throwable t) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>ExceptionUtils.handleThrowable(t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().error(sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.request.process"</span>), t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// 500 - Internal Server Error</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">500</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getAdapter().log(request, response, <span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Finish the handling of the request</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_ENDINPUT);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!isAsync() && !comet) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getErrorState().isError()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// If we know we are closing the connection, don't drain</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// input. This way uploading a 100GB file doesn't tie up the</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// thread if the servlet has rejected it.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getInputBuffer().setSwallowInput(<span class="keyword" style="font-weight:bold">false</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> <span class="keyword" style="font-weight:bold">if</span> (expectation &&<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>(response.getStatus() < <span class="number" style="color:rgb(0,153,153)">200</span> || response.getStatus() > <span class="number" style="color:rgb(0,153,153)">299</span>)) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Client sent Expect: 100-continue but received a</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// non-2xx final response. Disable keep-alive (if enabled)</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// to ensure that the connection is closed. Some clients may</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// still send the body, some may send the next request.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// No way to differentiate, so close the connection to</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// force the client to send the next request.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getInputBuffer().setSwallowInput(<span class="keyword" style="font-weight:bold">false</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>keepAlive = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>endRequest();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_ENDOUTPUT);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// If there was an error, make sure the request is counted as</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// and error, and update the statistics counter</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getErrorState().isError()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">500</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>request.updateCounters();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!isAsync() && !comet || getErrorState().isError()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getErrorState().isIoAllowed()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getInputBuffer().nextRequest();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getOutputBuffer().nextRequest();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!disableUploadTimeout) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span>(endpoint.getSoTimeout() > <span class="number" style="color:rgb(0,153,153)">0</span>) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setSocketTimeout(endpoint.getSoTimeout());<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setSocketTimeout(<span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (breakKeepAliveLoop(socketWrapper)) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span>rp.setStage(org.apache.coyote.Constants.STAGE_ENDED);<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (getErrorState().isError() || endpoint.isPaused()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.CLOSED;<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> <span class="keyword" style="font-weight:bold">if</span> (isAsync() || comet) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.LONG;<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> <span class="keyword" style="font-weight:bold">if</span> (isUpgrade()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.UPGRADING;<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (sendfileInProgress) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.SENDFILE;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (openSocket) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (readComplete) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.OPEN;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.LONG;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> SocketState.CLOSED;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span>}<div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">而报错的地方则是在:</p><pre class="prettyprint cs" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code"><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Currently only NIO will ever return false here</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!getInputBuffer().parseHeaders()) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// We've read part of the request, don't recycle it</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// instead associate it with the socket</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>openSocket = <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>readComplete = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!disableUploadTimeout) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setSocketTimeout(connectionUploadTimeout);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}的时候抛出了异常,对应的<span class="keyword" style="font-weight:bold">catch</span>块代码如下: <span class="keyword" style="font-weight:bold">catch</span> (Throwable t) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>ExceptionUtils.handleThrowable(t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UserDataHelper.Mode logMode = userDataHelper.getNextMode();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (logMode != <span class="keyword" style="font-weight:bold">null</span>) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>String message = sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.header.parse"</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">switch</span> (logMode) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> INFO_THEN_DEBUG:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>message += sm.getString(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="string" style="color:rgb(221,17,68)">"http11processor.fallToDebug"</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">//$FALL-THROUGH$</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> INFO:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().info(message);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">break</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">case</span> DEBUG:<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getLog().debug(message);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// 400 - Bad Request</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>response.setStatus(<span class="number" style="color:rgb(0,153,153)">400</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>setErrorState(ErrorState.CLOSE_CLEAN, t);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>getAdapter().log(request, response, <span class="number" style="color:rgb(0,153,153)">0</span>);<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">错误日志的输出,是配置在LocalStrings.properties中的,相关的两个属性:</p><pre class="prettyprint undefined" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code">http11processor.fallToDebug=\n Note\: further occurrences of HTTP header parsing errors will be logged at DEBUG level.http11processor.header.parse=Error parsing HTTP request header<div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">找到对应的 getInputBuffer().parseHeaders()</p><pre class="prettyprint java" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code"><span class="keyword" style="font-weight:bold">public</span> <span class="keyword" style="font-weight:bold">boolean</span> parseHeaders()<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">throws</span> IOException {<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (!parsingHeader) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">throw</span> <span class="keyword" style="font-weight:bold">new</span> IllegalStateException(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>sm.getString(<span class="string" style="color:rgb(221,17,68)">"iib.parseheaders.ise.error"</span>));<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span>HeaderParseStatus status = HeaderParseStatus.HAVE_MORE_HEADERS;<span class="indent">  </span><span class="indent">  </span>do {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>status = parseHeader();<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Checking that</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// (1) Headers plus request line size does not exceed its limit</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// (2) There are enough bytes to avoid expanding the buffer when</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// reading body</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// Technically, (2) is technical limitation, (1) is logical</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// limitation to enforce the meaning of headerBufferSize</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// From the way how buf is allocated and how blank lines are being</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="comment" style="color:rgb(153,153,136); font-style:italic">// read, it should be enough to check (1) only.</span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (pos > headerBufferSize<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>|| buf.length - pos < socketReadBufferSize) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">throw</span> <span class="keyword" style="font-weight:bold">new</span> IllegalArgumentException(<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>sm.getString(<span class="string" style="color:rgb(221,17,68)">"iib.requestheadertoolarge.error"</span>));<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">while</span> ( status == HeaderParseStatus.HAVE_MORE_HEADERS );<span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">if</span> (status == HeaderParseStatus.DONE) {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>parsingHeader = <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>end = pos;<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> <span class="keyword" style="font-weight:bold">true</span>;<span class="indent">  </span><span class="indent">  </span>} <span class="keyword" style="font-weight:bold">else</span> {<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword" style="font-weight:bold">return</span> <span class="keyword" style="font-weight:bold">false</span>;<span class="indent">  </span><span class="indent">  </span>}<span class="indent">  </span>}<div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></pre><pre class="prettyprint xml" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code">可知此处涉及了两个缓冲区大小,headerBufferSize和socketReadBufferSize,如果读取时数据的长度大于这两个值,就会报iib.requestheadertoolarge.error即Request header is too large,在网上搜索时,有的是因为这个设置导致的400,解决方法就是修改Tomcat的server.xml,在<span class="tag" style="color:rgb(0,0,128)"><<span class="title">Connector</span> <span class="attribute" style="color:rgb(0,128,128)">port</span>=<span class="value" style="color:rgb(221,17,68)">"8080"</span> <span class="attribute" style="color:rgb(0,128,128)">protocol</span>=<span class="value" style="color:rgb(221,17,68)">"HTTP/1.1"</span> <span class="attribute" style="color:rgb(0,128,128)">connectionTimeout</span>=<span class="value" style="color:rgb(221,17,68)">"20000"</span>    <span class="attribute" style="color:rgb(0,128,128)">redirectPort</span>=<span class="value" style="color:rgb(221,17,68)">"8443"</span> /></span>的配置中增加maxHttpHeaderSize的配置<div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">在org.apache.coyote.http11.AbstractHttp11Protocol类中定义了其默认值:</p><pre class="prettyprint java" style="padding:0.3em; font-family:Monaco,Menlo,Consolas,'Courier New',monospace; color:rgb(51,51,51); margin-top:0px; margin-bottom:1.5em; font-size:13px; line-height:1.5em; word-break:break-all; word-wrap:break-word; white-space:pre-wrap; background-color:rgb(246,246,246); overflow-y:auto" name="code"><span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/** Maximum size of the HTTP message header.  */</span> <span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> maxHttpHeaderSize = <span class="number" style="color:rgb(0,153,153)">8</span> * <span class="number" style="color:rgb(0,153,153)">1024</span>;<span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/**Maximum size of the post which will be saved when processing certain  requests, such as a POST. */</span> <span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> maxSavePostSize = <span class="number" style="color:rgb(0,153,153)">4</span> * <span class="number" style="color:rgb(0,153,153)">1024</span>;<span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/*** Specifies a different (usually  longer) connection timeout during data  upload. */</span> <span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> connectionUploadTimeout = <span class="number" style="color:rgb(0,153,153)">300000</span>; <span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/**Maximum size of trailing headers in bytes */</span> <span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> maxTrailerSize = <span class="number" style="color:rgb(0,153,153)">8192</span>;<span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/** Maximum size of extension information in chunked encoding */</span> <span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> maxExtensionSize = <span class="number" style="color:rgb(0,153,153)">8192</span>;<span class="javadoc" style="color:rgb(153,153,136); font-style:italic">/**Maximum amount of request body to swallow.*/</span><span class="keyword" style="font-weight:bold">private</span> <span class="keyword" style="font-weight:bold">int</span> maxSwallowSize = <span class="number" style="color:rgb(0,153,153)">2</span> * <span class="number" style="color:rgb(0,153,153)">1024</span> * <span class="number" style="color:rgb(0,153,153)">1024</span>;<div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></pre><p style="margin-top:0px; margin-bottom:0.75em; font-size:16px; line-height:27.1875px; text-indent:1em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,Tahoma,Arial,STXihei,'Microsoft YaHei',微软雅黑,sans-serif; background-color:rgb(254,254,254)">其他参数设置介绍: <a target="_blank" href="http://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html" rel="nofollow,noindex" style="">http://tomcat.apache.org/tomcat-8.0-doc/config/ajp.html</a></p>   

阅读全文
0 0
原创粉丝点击