List of usage examples for org.apache.http.nio NHttpClientConnection resetInput
void resetInput();
From source file:net.kungfoo.grizzly.proxy.impl.ConnectingHandler.java
public void responseReceived(final NHttpClientConnection conn) { System.out.println(conn + " [proxy<-origin] response received"); HttpContext context = conn.getContext(); ProxyProcessingInfo proxyTask = (ProxyProcessingInfo) context.getAttribute(ProxyProcessingInfo.ATTRIB); synchronized (proxyTask) { ConnState connState = proxyTask.getOriginState(); if (connState != ConnState.REQUEST_SENT && connState != ConnState.REQUEST_BODY_DONE) { throw new IllegalStateException("Illegal target connection state: " + connState); }/* w w w. ja v a 2 s. c o m*/ HttpResponse response = conn.getHttpResponse(); HttpRequest request = proxyTask.getRequest(); StatusLine line = response.getStatusLine(); System.out.println(conn + " [proxy<-origin] << " + line); int statusCode = line.getStatusCode(); if (statusCode < HttpStatus.SC_OK) { // Ignore 1xx response, TODO: are you sure? return; } try { // Update connection state final Response clientResponse = proxyTask.getResponse(); proxyTask.setOriginState(ConnState.RESPONSE_RECEIVED); clientResponse.setStatus(statusCode); clientResponse.setMessage(line.getReasonPhrase()); for (Header header : response.getAllHeaders()) { clientResponse.setHeader(header.getName(), header.getValue()); } if (!canResponseHaveBody(request, response)) { conn.resetInput(); if (!this.connStrategy.keepAlive(response, context)) { System.out.println(conn + " [proxy<-origin] close connection"); proxyTask.setOriginState(ConnState.CLOSING); conn.close(); } proxyTask.getCompletion().run(); } else { final HttpEntity httpEntity = response.getEntity(); if (httpEntity.isStreaming()) { final InputStream is = httpEntity.getContent(); ByteChunk bc = new ByteChunk(1024); while (is.read(bc.getBytes()) != -1) { clientResponse.doWrite(bc); } } } /* // Make sure client output is active proxyTask.getClientIOControl().requestOutput(); */ } catch (IOException ex) { shutdownConnection(conn); } } }
From source file:org.apache.synapse.transport.nhttp.ClientHandler.java
/** * Perform processing of the received response though Axis2 * * @param conn HTTP connection to be processed * @param context HTTP context associated with the connection * @param response HTTP response associated with the connection *//* w w w .j a v a 2 s . co m*/ private void processResponse(final NHttpClientConnection conn, HttpContext context, HttpResponse response) { ContentInputBuffer inputBuffer = null; MessageContext outMsgContext = (MessageContext) context.getAttribute(OUTGOING_MESSAGE_CONTEXT); String endptPrefix = (String) context.getAttribute(NhttpConstants.ENDPOINT_PREFIX); String requestMethod = (String) context.getAttribute(NhttpConstants.HTTP_REQ_METHOD); int statusCode = response.getStatusLine().getStatusCode(); boolean expectEntityBody = false; if (!"HEAD".equals(requestMethod) && !"OPTIONS".equals(requestMethod) && statusCode >= HttpStatus.SC_OK && statusCode != HttpStatus.SC_NO_CONTENT && statusCode != HttpStatus.SC_NOT_MODIFIED && statusCode != HttpStatus.SC_RESET_CONTENT) { expectEntityBody = true; } else if (NhttpConstants.HTTP_HEAD.equals(requestMethod)) { // When invoking http HEAD request esb set content length as 0 to response header. Since there is no message // body content length cannot be calculated inside synapse. Hence additional two headers are added to // which contains content length of the backend response and the request method. These headers are removed // before submitting the actual response. response.addHeader(NhttpConstants.HTTP_REQUEST_METHOD, requestMethod); if (response.getFirstHeader(HTTP.CONTENT_LEN) != null) { response.addHeader(NhttpConstants.ORIGINAL_CONTENT_LEN, response.getFirstHeader(HTTP.CONTENT_LEN).getValue()); } } if (expectEntityBody) { inputBuffer = new SharedInputBuffer(cfg.getBufferSize(), conn, allocator); context.setAttribute(RESPONSE_SINK_BUFFER, inputBuffer); BasicHttpEntity entity = new BasicHttpEntity(); if (response.getStatusLine().getProtocolVersion().greaterEquals(HttpVersion.HTTP_1_1)) { entity.setChunked(true); } response.setEntity(entity); context.setAttribute(ExecutionContext.HTTP_RESPONSE, response); } else { conn.resetInput(); conn.resetOutput(); if (context.getAttribute(NhttpConstants.DISCARD_ON_COMPLETE) != null || !connStrategy.keepAlive(response, context)) { try { // this is a connection we should not re-use connpool.forget(conn); shutdownConnection(conn, false, null); context.removeAttribute(RESPONSE_SINK_BUFFER); context.removeAttribute(REQUEST_SOURCE_BUFFER); } catch (Exception ignore) { } } else { connpool.release(conn); } } workerPool .execute(new ClientWorker(cfgCtx, inputBuffer == null ? null : new ContentInputStream(inputBuffer), response, outMsgContext, endptPrefix)); }
From source file:org.apache.http.impl.nio.client.NHttpClientProtocolHandler.java
private void processResponse(final NHttpClientConnection conn, final HttpExchange httpexchange, final HttpAsyncExchangeHandler<?> handler) throws IOException { if (!httpexchange.isValid()) { conn.close();/*from ww w .j a v a 2s . c o m*/ } HttpRequest request = httpexchange.getRequest(); HttpResponse response = httpexchange.getResponse(); String method = request.getRequestLine().getMethod(); int status = response.getStatusLine().getStatusCode(); if (method.equalsIgnoreCase("CONNECT") && status == HttpStatus.SC_OK) { this.log.debug("CONNECT method succeeded"); conn.resetInput(); } else { if (!handler.keepAlive(response)) { conn.close(); } } if (this.log.isDebugEnabled()) { this.log.debug("Response processed " + formatState(conn, httpexchange)); } handler.responseCompleted(); httpexchange.reset(); }
From source file:org.apache.synapse.transport.nhttp.ClientHandler.java
/** * Process a response received for the request sent out * //from w ww . ja v a2 s .c om * @param conn the connection being processed */ public void responseReceived(final NHttpClientConnection conn) { setServerContextAttribute(NhttpConstants.RES_FROM_BACKEND_READ_START_TIME, System.currentTimeMillis(), conn); HttpContext context = conn.getContext(); HttpResponse response = conn.getHttpResponse(); ProxyTunnelHandler tunnelHandler = (ProxyTunnelHandler) context.getAttribute(TUNNEL_HANDLER); if (tunnelHandler != null && !tunnelHandler.isCompleted()) { context.removeAttribute(TUNNEL_HANDLER); tunnelHandler.handleResponse(response, conn); if (tunnelHandler.isSuccessful()) { log.debug(conn + ": Tunnel established"); conn.resetInput(); conn.requestOutput(); return; } else { Axis2HttpRequest axis2Req = (Axis2HttpRequest) context.getAttribute(ATTACHMENT_KEY); context.setAttribute(AXIS2_HTTP_REQUEST, axis2Req); context.setAttribute(OUTGOING_MESSAGE_CONTEXT, axis2Req.getMsgContext()); ContentOutputBuffer outputBuffer = new SharedOutputBuffer(cfg.getBufferSize(), conn, allocator); axis2Req.setOutputBuffer(outputBuffer); context.setAttribute(REQUEST_SOURCE_BUFFER, outputBuffer); context.setAttribute(NhttpConstants.DISCARD_ON_COMPLETE, Boolean.TRUE); } } setServerContextAttribute(NhttpConstants.RES_HEADER_ARRIVAL_TIME, System.currentTimeMillis(), conn); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_CONTINUE) { if (log.isDebugEnabled()) { log.debug(conn + ": Received a 100 Continue response"); } // according to the HTTP 1.1 specification HTTP status 100 continue implies that // the response will be followed, and the client should just ignore the 100 Continue // and wait for the response return; } ClientConnectionDebug ccd = (ClientConnectionDebug) conn.getContext().getAttribute(CLIENT_CONNECTION_DEBUG); if (ccd != null) { ccd.recordResponseStartTime(response.getStatusLine().toString()); } // Have we sent out our request fully in the first place? if not, forget about it now.. Axis2HttpRequest req = (Axis2HttpRequest) conn.getContext().getAttribute(AXIS2_HTTP_REQUEST); if (req != null) { req.setCompleted(true); if (log.isDebugEnabled()) { log.debug(conn + ": Response Received for Request : " + req); } if (!req.isSendingCompleted()) { req.getMsgContext().setProperty(NhttpConstants.ERROR_CODE, NhttpConstants.SEND_ABORT); SharedOutputBuffer outputBuffer = (SharedOutputBuffer) conn.getContext() .getAttribute(REQUEST_SOURCE_BUFFER); if (outputBuffer != null) { outputBuffer.shutdown(); } if (log.isDebugEnabled()) { log.debug(conn + ": Remote server aborted request being sent and replied : " + conn + " for request : " + conn.getContext().getAttribute(NhttpConstants.HTTP_REQ_METHOD)); } context.setAttribute(NhttpConstants.DISCARD_ON_COMPLETE, Boolean.TRUE); if (metrics != null) { metrics.incrementFaultsSending(NhttpConstants.SEND_ABORT, req.getMsgContext()); } } } switch (response.getStatusLine().getStatusCode()) { case HttpStatus.SC_ACCEPTED: { if (log.isDebugEnabled()) { log.debug(conn + ": Received a 202 Accepted response"); } // Process response body if Content-Type header is present in the response // If Content-Type header is null, We will ignore entity body Header contentType = response.getFirstHeader(HTTP.CONTENT_TYPE); if (contentType != null) { processResponse(conn, context, response); return; } // sometimes, some http clients sends an "\r\n" as the content body with a // HTTP 202 OK.. we will just get it into this temp buffer and ignore it.. ContentInputBuffer inputBuffer = new SharedInputBuffer(8, conn, allocator); context.setAttribute(RESPONSE_SINK_BUFFER, inputBuffer); // create a dummy message with an empty SOAP envelope and a property // NhttpConstants.SC_ACCEPTED set to Boolean.TRUE to indicate this is a // placeholder message for the transport to send a HTTP 202 to the // client. Should / would be ignored by any transport other than // nhttp. For example, JMS would not send a reply message for one-way // operations. MessageContext outMsgCtx = (MessageContext) context.getAttribute(OUTGOING_MESSAGE_CONTEXT); MessageReceiver mr = outMsgCtx.getAxisOperation().getMessageReceiver(); // the following check is to support the dual channel invocation. Hence the // response will be sent as a new request to the client over a different channel // client sends back a 202 Accepted response to synapse and we need to neglect that // 202 Accepted message if (!outMsgCtx.isPropertyTrue(NhttpConstants.IGNORE_SC_ACCEPTED)) { try { MessageContext responseMsgCtx = outMsgCtx.getOperationContext() .getMessageContext(WSDL2Constants.MESSAGE_LABEL_IN); if (responseMsgCtx == null || outMsgCtx.getOptions().isUseSeparateListener() || outMsgCtx.getOperationContext().isComplete()) { if (responseMsgCtx != null && responseMsgCtx.getProperty("synapse.send") == null) { return; } } else if (responseMsgCtx == null || outMsgCtx.getOptions().isUseSeparateListener()) { // Since we need to notify the SynapseCallback receiver to remove the // call backs registered we set a custom property setHeaders(context, response, outMsgCtx, responseMsgCtx); outMsgCtx.setProperty(NhttpConstants.HTTP_202_RECEIVED, "true"); mr.receive(outMsgCtx); return; } if (responseMsgCtx == null) { return; } setHeaders(context, response, outMsgCtx, responseMsgCtx); responseMsgCtx.setServerSide(true); responseMsgCtx.setDoingREST(outMsgCtx.isDoingREST()); responseMsgCtx.setProperty(MessageContext.TRANSPORT_IN, outMsgCtx.getProperty(MessageContext.TRANSPORT_IN)); responseMsgCtx.setTransportIn(outMsgCtx.getTransportIn()); responseMsgCtx.setTransportOut(outMsgCtx.getTransportOut()); responseMsgCtx.setAxisMessage( outMsgCtx.getAxisOperation().getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE)); responseMsgCtx.setOperationContext(outMsgCtx.getOperationContext()); responseMsgCtx.setConfigurationContext(outMsgCtx.getConfigurationContext()); responseMsgCtx.setTo(null); if (!outMsgCtx.isDoingREST() && !outMsgCtx.isSOAP11()) { responseMsgCtx.setEnvelope(new SOAP12Factory().getDefaultEnvelope()); } else { responseMsgCtx.setEnvelope(new SOAP11Factory().getDefaultEnvelope()); } responseMsgCtx.setProperty(AddressingConstants.DISABLE_ADDRESSING_FOR_OUT_MESSAGES, Boolean.TRUE); responseMsgCtx.setProperty(NhttpConstants.SC_ACCEPTED, Boolean.TRUE); int statusCode = response.getStatusLine().getStatusCode(); responseMsgCtx.setProperty(NhttpConstants.HTTP_SC, statusCode); mr.receive(responseMsgCtx); } catch (org.apache.axis2.AxisFault af) { log.debug(conn + ": Unable to report back " + "202 Accepted state to the message receiver"); } } return; } case HttpStatus.SC_OK: { processResponse(conn, context, response); return; } case HttpStatus.SC_INTERNAL_SERVER_ERROR: { if (warnOnHttp500(response)) { log.warn(getErrorMessage( "Received an internal server error : " + response.getStatusLine().getReasonPhrase(), conn)); } processResponse(conn, context, response); return; } default: { if (log.isDebugEnabled()) { log.debug(conn + ": " + getErrorMessage("HTTP status code received : " + response.getStatusLine().getStatusCode() + " :: " + response.getStatusLine().getReasonPhrase(), conn)); } Header contentType = response.getFirstHeader(HTTP.CONTENT_TYPE); if (contentType != null) { if ((contentType.getValue().indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) >= 0) || contentType.getValue().indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE) >= 0) { if (log.isDebugEnabled()) { log.debug(conn + ": Received an unexpected response with a SOAP payload"); } } else if (contentType.getValue().indexOf("html") == -1) { if (log.isDebugEnabled()) { log.debug(conn + ": Received an unexpected response with a POX/REST payload"); } } else { log.warn(getErrorMessage( "Received an unexpected response - " + "of content type : " + contentType.getValue() + " and status code : " + response.getStatusLine().getStatusCode() + " with reason : " + response.getStatusLine().getReasonPhrase(), conn)); } } else { if (log.isDebugEnabled()) { log.debug(conn + ": " + getErrorMessage( "Received a response - " + "without a content type with status code : " + response.getStatusLine().getStatusCode() + " and reason : " + response.getStatusLine().getReasonPhrase(), conn)); } } processResponse(conn, context, response); } } }
From source file:org.apache.synapse.transport.passthru.DeliveryAgent.java
/** * This method queues the message for delivery. If a connection is already existing for * the destination epr, the message will be delivered immediately. Otherwise message has * to wait until a connection is established. In this case this method will inform the * system about the need for a connection. * * @param msgContext the message context to be sent * @param epr the endpoint to which the message should be sent * @throws AxisFault if an error occurs/*from w w w . j a v a2s .c o m*/ */ public void submit(MessageContext msgContext, EndpointReference epr) throws AxisFault { try { URL url = new URL(epr.getAddress()); String scheme = url.getProtocol() != null ? url.getProtocol() : "http"; String hostname = url.getHost(); int port = url.getPort(); if (port == -1) { // use default if ("http".equals(scheme)) { port = 80; } else if ("https".equals(scheme)) { port = 443; } } HttpHost target = new HttpHost(hostname, port, scheme); boolean secure = "https".equalsIgnoreCase(target.getSchemeName()); HttpHost proxy = proxyConfig.selectProxy(target); HttpRoute route; if (proxy != null) { route = new HttpRoute(target, null, proxy, secure); } else { route = new HttpRoute(target, null, secure); } // first we queue the message Queue<MessageContext> queue = null; lock.lock(); try { queue = waitingMessages.get(route); if (queue == null) { queue = new ConcurrentLinkedQueue<MessageContext>(); waitingMessages.put(route, queue); } if (queue.size() == maxWaitingMessages) { MessageContext msgCtx = queue.poll(); targetErrorHandler.handleError(msgCtx, ErrorCodes.CONNECTION_TIMEOUT, "Error connecting to the back end", null, ProtocolState.REQUEST_READY); } queue.add(msgContext); } finally { lock.unlock(); } NHttpClientConnection conn = targetConnections.getConnection(route); if (conn != null) { conn.resetInput(); conn.resetOutput(); MessageContext messageContext = queue.poll(); if (messageContext != null) { tryNextMessage(messageContext, route, conn); } } } catch (MalformedURLException e) { handleException("Malformed URL in the target EPR", e); } }
From source file:org.apache.synapse.transport.passthru.TargetHandler.java
public void responseReceived(NHttpClientConnection conn) { HttpContext context = conn.getContext(); HttpResponse response = conn.getHttpResponse(); ProtocolState connState;//from w w w . j a va 2 s . co m try { String method = null; ProxyTunnelHandler tunnelHandler = (ProxyTunnelHandler) context .getAttribute(PassThroughConstants.TUNNEL_HANDLER); if (tunnelHandler != null && !tunnelHandler.isCompleted()) { method = "CONNECT"; context.removeAttribute(PassThroughConstants.TUNNEL_HANDLER); tunnelHandler.handleResponse(response, conn); if (tunnelHandler.isSuccessful()) { log.debug(conn + ": Tunnel established"); conn.resetInput(); conn.requestOutput(); return; } else { TargetContext.updateState(conn, ProtocolState.REQUEST_DONE); } } int statusCode = response.getStatusLine().getStatusCode(); if (statusCode < HttpStatus.SC_OK) { if (log.isDebugEnabled()) { log.debug(conn + ": Received a 100 Continue response"); } // Ignore 1xx response return; } boolean isError = false; context.setAttribute(PassThroughConstants.RES_HEADER_ARRIVAL_TIME, System.currentTimeMillis()); connState = TargetContext.getState(conn); MessageContext requestMsgContext = TargetContext.get(conn).getRequestMsgCtx(); NHttpServerConnection sourceConn = (NHttpServerConnection) requestMsgContext .getProperty(PassThroughConstants.PASS_THROUGH_SOURCE_CONNECTION); if (connState != ProtocolState.REQUEST_DONE) { isError = true; StatusLine errorStatus = response.getStatusLine(); /* We might receive a 404 or a similar type, even before we write the request body. */ if (errorStatus != null) { if (errorStatus.getStatusCode() >= HttpStatus.SC_BAD_REQUEST) { TargetContext.updateState(conn, ProtocolState.REQUEST_DONE); conn.resetOutput(); if (sourceConn != null) { SourceContext.updateState(sourceConn, ProtocolState.REQUEST_DONE); SourceContext.get(sourceConn).setShutDown(true); } if (log.isDebugEnabled()) { log.debug(conn + ": Received response with status code : " + response.getStatusLine().getStatusCode() + " in invalid state : " + connState.name()); } } } else { handleInvalidState(conn, "Receiving response"); return; } } context.setAttribute(PassThroughConstants.RES_FROM_BACKEND_READ_START_TIME, System.currentTimeMillis()); TargetRequest targetRequest = TargetContext.getRequest(conn); if (targetRequest != null) { method = targetRequest.getMethod(); } if (method == null) { method = "POST"; } boolean canResponseHaveBody = isResponseHaveBodyExpected(method, response); if (!canResponseHaveBody) { if (log.isDebugEnabled()) { log.debug(conn + ": Received no-content response " + response.getStatusLine().getStatusCode()); } conn.resetInput(); } TargetResponse targetResponse = new TargetResponse(targetConfiguration, response, conn, canResponseHaveBody, isError); TargetContext.setResponse(conn, targetResponse); targetResponse.start(conn); if (statusCode == HttpStatus.SC_ACCEPTED && handle202(requestMsgContext)) { return; } targetConfiguration.getWorkerPool() .execute(new ClientWorker(targetConfiguration, requestMsgContext, targetResponse)); targetConfiguration.getMetrics().incrementMessagesReceived(); sourceConn = (NHttpServerConnection) requestMsgContext .getProperty(PassThroughConstants.PASS_THROUGH_SOURCE_CONNECTION); if (sourceConn != null) { sourceConn.getContext().setAttribute(PassThroughConstants.RES_HEADER_ARRIVAL_TIME, conn.getContext().getAttribute(PassThroughConstants.RES_HEADER_ARRIVAL_TIME)); conn.getContext().removeAttribute(PassThroughConstants.RES_HEADER_ARRIVAL_TIME); sourceConn.getContext().setAttribute(PassThroughConstants.REQ_DEPARTURE_TIME, conn.getContext().getAttribute(PassThroughConstants.REQ_DEPARTURE_TIME)); conn.getContext().removeAttribute(PassThroughConstants.REQ_DEPARTURE_TIME); sourceConn.getContext().setAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_START_TIME, conn.getContext().getAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_START_TIME)); conn.getContext().removeAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_START_TIME); sourceConn.getContext().setAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_END_TIME, conn.getContext().getAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_END_TIME)); conn.getContext().removeAttribute(PassThroughConstants.REQ_TO_BACKEND_WRITE_END_TIME); sourceConn.getContext().setAttribute(PassThroughConstants.RES_FROM_BACKEND_READ_START_TIME, conn.getContext().getAttribute(PassThroughConstants.RES_FROM_BACKEND_READ_START_TIME)); conn.getContext().removeAttribute(PassThroughConstants.RES_FROM_BACKEND_READ_START_TIME); } } catch (Exception ex) { log.error("Exception occurred while processing response", ex); informReaderError(conn); TargetContext.updateState(conn, ProtocolState.CLOSED); targetConfiguration.getConnections().shutdownConnection(conn, true); } }
From source file:org.siddhiesb.transport.passthru.DeliveryAgent.java
/** * This method queues the message for delivery. If a connection is already existing for * the destination epr, the message will be delivered immediately. Otherwise message has * to wait until a connection is established. In this case this method will inform the * system about the need for a connection. * * @param commonContext the message context to be sent *///from w w w. j ava2 s .c om public void submit(CommonContext commonContext) { try { String toAddress = (String) commonContext.getProperty(CommonAPIConstants.ENDPOINT); URL url = new URL(toAddress); String scheme = url.getProtocol() != null ? url.getProtocol() : "http"; String hostname = url.getHost(); int port = url.getPort(); if (port == -1) { // use default if ("http".equals(scheme)) { port = 80; } else if ("https".equals(scheme)) { port = 443; } } HttpHost target = new HttpHost(hostname, port, scheme); boolean secure = "https".equalsIgnoreCase(target.getSchemeName()); HttpHost proxy = null; //proxyConfig.selectProxy(target); HttpRoute route; if (proxy != null) { route = new HttpRoute(target, null, proxy, secure); } else { route = new HttpRoute(target, null, secure); } // first we queue the message Queue<CommonContext> queue = null; lock.lock(); try { queue = waitingMessages.get(route); if (queue == null) { queue = new ConcurrentLinkedQueue<CommonContext>(); waitingMessages.put(route, queue); } if (queue.size() == maxWaitingMessages) { CommonContext msgCtx = queue.poll(); } queue.add(commonContext); } finally { lock.unlock(); } NHttpClientConnection conn = targetConnections.getConnection(route); if (conn != null) { conn.resetInput(); conn.resetOutput(); CommonContext commonContext1 = queue.poll(); if (commonContext1 != null) { tryNextMessage(commonContext1, route, conn); } } } catch (MalformedURLException e) { handleException("Malformed URL in the target EPR", e); } }