@Override publicvoidprocess(final HttpRequest request, final HttpContext context) throws HttpException, IOException { Args.notNull(request, "HTTP request"); if (!request.containsHeader(HTTP.USER_AGENT)) { String s = null; final HttpParams params = request.getParams(); if (params != null) { s = (String) params.getParameter(CoreProtocolPNames.USER_AGENT); } if (s == null) { s = this.userAgent; } if (s != null) { request.addHeader(HTTP.USER_AGENT, s); } } }
}
这段代码比较简单,判断请求头是否包含User-Agent首部,如果没有,通过request来获取相关内容并且 set 到 Header 上.
HttpRequestExecutor
1
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
protected HttpResponse doSendRequest( final HttpRequest request, final HttpClientConnection conn, final HttpContext context)throws IOException, HttpException { Args.notNull(request, "HTTP request"); Args.notNull(conn, "Client connection"); Args.notNull(context, "HTTP context");
HttpResponse response = null;
context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn); context.setAttribute(HttpCoreContext.HTTP_REQ_SENT, Boolean.FALSE); //写请求头到SessionOutputBuffer->buffer(ByteArrayBuffer) conn.sendRequestHeader(request); //如果是HttpEntityEnclosingRequest的请求(POST,PUT等),检查请求头是否包含Expect: 100-Continue 头,这个是HTTP/1.1特有的头 //意思大致是传输大文本时,先询问server是否支持,如果不支持返回417等错误码,如果支持,返回100 continue //这时候客户端再讲POST内容传到服务器,如果在等待返回超时时间(3000ms)内服务端没有返回,直接POST,下面代码就是对这个头的处理. if (request instanceof HttpEntityEnclosingRequest) { // Check for expect-continue handshake. We have to flush the // headers and wait for an 100-continue response to handle it. // If we get a different response, we must not send the entity. boolean sendentity = true; final ProtocolVersion ver = request.getRequestLine().getProtocolVersion(); if (((HttpEntityEnclosingRequest) request).expectContinue() && !ver.lessEquals(HttpVersion.HTTP_1_0)) {
conn.flush(); // As suggested by RFC 2616 section 8.2.3, we don't wait for a // 100-continue response forever. On timeout, send the entity. if (conn.isResponseAvailable(this.waitForContinue)) { response = conn.receiveResponseHeader(); if (canResponseHaveBody(request, response)) { conn.receiveResponseEntity(response); } finalint status = response.getStatusLine().getStatusCode(); if (status < 200) { if (status != HttpStatus.SC_CONTINUE) { thrownew ProtocolException( "Unexpected response: " + response.getStatusLine()); } // discard 100-continue response = null; } else { sendentity = false; } } } if (sendentity) { conn.sendRequestEntity((HttpEntityEnclosingRequest) request); } } //调用Scoket OutputStream.flush() 真正写入并传输 conn.flush(); //记录上下文请求已经发送 context.setAttribute(HttpCoreContext.HTTP_REQ_SENT, Boolean.TRUE); return response; }