Search in sources :

Example 11 with NHttpServerConnection

use of org.apache.http.nio.NHttpServerConnection in project wso2-synapse by wso2.

the class MessageHelper method cloneAxis2MessageContextForAggregate.

private static org.apache.axis2.context.MessageContext cloneAxis2MessageContextForAggregate(org.apache.axis2.context.MessageContext mc) throws AxisFault {
    org.apache.axis2.context.MessageContext newMC = clonePartiallyForAggregate(mc);
    newMC.setEnvelope(cloneSOAPEnvelope(mc.getEnvelope()));
    newMC.setOptions(cloneOptions(mc.getOptions()));
    newMC.setServiceContext(mc.getServiceContext());
    newMC.setOperationContext(mc.getOperationContext());
    newMC.setAxisMessage(mc.getAxisMessage());
    if (newMC.getAxisMessage() != null) {
        newMC.getAxisMessage().setParent(mc.getAxisOperation());
    }
    newMC.setAxisService(mc.getAxisService());
    // copying transport related parts from the original
    newMC.setTransportIn(mc.getTransportIn());
    newMC.setTransportOut(mc.getTransportOut());
    newMC.setProperty(org.apache.axis2.Constants.OUT_TRANSPORT_INFO, mc.getProperty(org.apache.axis2.Constants.OUT_TRANSPORT_INFO));
    newMC.setProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS, getClonedTransportHeaders(mc));
    if (newMC.getProperty(PassThroughConstants.PASS_THROUGH_PIPE) != null) {
        // clone passthrough pipe here..writer...
        // newMC.setProperty(PassThroughConstants.CLONE_PASS_THROUGH_PIPE_REQUEST,true);
        NHttpServerConnection conn = (NHttpServerConnection) newMC.getProperty("pass-through.Source-Connection");
        if (conn != null) {
            SourceConfiguration sourceConfiguration = (SourceConfiguration) newMC.getProperty("PASS_THROUGH_SOURCE_CONFIGURATION");
            Pipe pipe = new Pipe(conn, sourceConfiguration.getBufferFactory().getBuffer(), "source", sourceConfiguration);
            newMC.setProperty(PassThroughConstants.PASS_THROUGH_PIPE, pipe);
        }
    }
    return newMC;
}
Also used : NHttpServerConnection(org.apache.http.nio.NHttpServerConnection) SourceConfiguration(org.apache.synapse.transport.passthru.config.SourceConfiguration) Pipe(org.apache.synapse.transport.passthru.Pipe)

Example 12 with NHttpServerConnection

use of org.apache.http.nio.NHttpServerConnection in project wso2-synapse by wso2.

the class HttpCoreNIOSender method sendAsyncResponse.

/**
 * Send the passed in response message, asynchronously
 * @param msgContext the message context to be sent
 * @throws AxisFault on error
 */
private void sendAsyncResponse(MessageContext msgContext) throws AxisFault {
    int contentLength = extractContentLength(msgContext);
    // remove unwanted HTTP headers (if any from the current message)
    removeUnwantedHeaders(msgContext);
    // Check whether original messageType value is changed. if not set the correct value to engage correct message formatter
    String cType = (String) msgContext.getProperty(NhttpConstants.MC_CONTENT_TYPE);
    String messageType = (String) msgContext.getProperty(NhttpConstants.MESSAGE_TYPE);
    String oriMessageType = (String) msgContext.getProperty(NhttpConstants.ORIGINAL_MESSAGE_TYPE);
    if (cType != null && cType.indexOf(HTTPConstants.MEDIA_TYPE_MULTIPART_RELATED) != -1 && messageType != null && messageType.equals(oriMessageType)) {
        msgContext.setProperty(NhttpConstants.MESSAGE_TYPE, HTTPConstants.MEDIA_TYPE_MULTIPART_RELATED);
    }
    Map transportHeaders = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
    ServerWorker worker = (ServerWorker) msgContext.getProperty(Constants.OUT_TRANSPORT_INFO);
    NHttpServerConnection conn = worker.getConn();
    if (null == conn.getHttpRequest()) {
        // this is a special case we dropped the connection when message size exceeds the user defined threshold
        if (conn.getContext().getAttribute(NhttpConstants.CONNECTION_DROPPED) != null && (Boolean) conn.getContext().getAttribute(NhttpConstants.CONNECTION_DROPPED)) {
            // already submitted response for this case, hence return
            return;
        }
    }
    HttpResponse response = worker.getResponse();
    OMOutputFormat format = NhttpUtil.getOMOutputFormat(msgContext);
    MessageFormatter messageFormatter = MessageFormatterDecoratorFactory.createMessageFormatterDecorator(msgContext);
    Boolean noEntityBody = (Boolean) msgContext.getProperty(NhttpConstants.NO_ENTITY_BODY);
    if (noEntityBody == null || Boolean.FALSE == noEntityBody) {
        response.setHeader(HTTP.CONTENT_TYPE, messageFormatter.getContentType(msgContext, format, msgContext.getSoapAction()));
    } else if (Boolean.TRUE == noEntityBody) {
        ((BasicHttpEntity) response.getEntity()).setChunked(false);
        ((BasicHttpEntity) response.getEntity()).setContentLength(0);
        // as synapse cannot calculate content length without providing message body.
        if (transportHeaders.get(NhttpConstants.HTTP_REQUEST_METHOD) != null && NhttpConstants.HTTP_HEAD.equals(transportHeaders.get(NhttpConstants.HTTP_REQUEST_METHOD)) && transportHeaders.get(NhttpConstants.ORIGINAL_CONTENT_LEN) != null) {
            ((BasicHttpEntity) response.getEntity()).setContentLength(Long.parseLong(String.valueOf(transportHeaders.get(NhttpConstants.ORIGINAL_CONTENT_LEN))));
            transportHeaders.remove(NhttpConstants.ORIGINAL_CONTENT_LEN);
            transportHeaders.remove(NhttpConstants.HTTP_REQUEST_METHOD);
        }
    }
    response.setStatusCode(determineHttpStatusCode(msgContext, response));
    // Override the Standard Reason Phrase
    if (msgContext.getProperty(NhttpConstants.HTTP_REASON_PHRASE) != null && !msgContext.getProperty(NhttpConstants.HTTP_REASON_PHRASE).equals("")) {
        response.setReasonPhrase(msgContext.getProperty(NhttpConstants.HTTP_REASON_PHRASE).toString());
    }
    // set any transport headers
    if (transportHeaders != null && !transportHeaders.values().isEmpty()) {
        Iterator iter = transportHeaders.keySet().iterator();
        while (iter.hasNext()) {
            Object header = iter.next();
            Object value = transportHeaders.get(header);
            if (value != null && header instanceof String && value instanceof String) {
                response.addHeader((String) header, (String) value);
                String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
                Map map = (Map) msgContext.getProperty(excessProp);
                if (map != null && map.get(header) != null) {
                    log.debug("Number of excess values for " + header + " header is : " + ((Collection) (map.get(header))).size());
                    for (Iterator iterator = map.keySet().iterator(); iterator.hasNext(); ) {
                        String key = (String) iterator.next();
                        for (String excessVal : (Collection<String>) map.get(key)) {
                            if (header.equals(key)) {
                                response.addHeader((String) header, (String) excessVal);
                            }
                        }
                    }
                }
            }
        }
    }
    boolean forceContentLength = msgContext.isPropertyTrue(NhttpConstants.FORCE_HTTP_CONTENT_LENGTH);
    boolean forceContentLengthCopy = msgContext.isPropertyTrue(NhttpConstants.COPY_CONTENT_LENGTH_FROM_INCOMING);
    BasicHttpEntity entity = (BasicHttpEntity) response.getEntity();
    MetricsCollector lstMetrics = worker.getServiceHandler().getMetrics();
    try {
        if (forceContentLength) {
            entity.setChunked(false);
            if (forceContentLengthCopy && contentLength > 0) {
                entity.setContentLength(contentLength);
            } else {
                setStreamAsTempData(entity, messageFormatter, msgContext, format);
            }
        }
        worker.getServiceHandler().commitResponse(worker.getConn(), response);
        lstMetrics.reportResponseCode(response.getStatusLine().getStatusCode());
        OutputStream out = worker.getOutputStream();
        /*
             * if this is a dummy message to handle http 202 case with non-blocking IO
             * write an empty byte array as body
             */
        if (msgContext.isPropertyTrue(NhttpConstants.SC_ACCEPTED) || Boolean.TRUE == noEntityBody) {
            out.write(new byte[0]);
        } else {
            if (forceContentLength) {
                if (forceContentLengthCopy && contentLength > 0) {
                    messageFormatter.writeTo(msgContext, format, out, false);
                } else {
                    writeMessageFromTempData(out, msgContext);
                }
            } else {
                messageFormatter.writeTo(msgContext, format, out, false);
            }
        }
        out.close();
        if (lstMetrics != null) {
            lstMetrics.incrementMessagesSent();
        }
    } catch (ProtocolException e) {
        log.error(e + " (Synapse may be trying to send an exact response more than once )");
    } catch (HttpException e) {
        if (lstMetrics != null) {
            lstMetrics.incrementFaultsSending();
        }
        handleException("Unexpected HTTP protocol error sending response to : " + worker.getRemoteAddress(), e);
    } catch (ConnectionClosedException e) {
        if (lstMetrics != null) {
            lstMetrics.incrementFaultsSending();
        }
        log.warn("Connection closed by client : " + worker.getRemoteAddress());
    } catch (IllegalStateException e) {
        if (lstMetrics != null) {
            lstMetrics.incrementFaultsSending();
        }
        log.warn("Connection closed by client : " + worker.getRemoteAddress());
    } catch (IOException e) {
        if (lstMetrics != null) {
            lstMetrics.incrementFaultsSending();
        }
        handleException("IO Error sending response message to : " + worker.getRemoteAddress(), e);
    } catch (Exception e) {
        if (lstMetrics != null) {
            lstMetrics.incrementFaultsSending();
        }
        handleException("General Error sending response message to : " + worker.getRemoteAddress(), e);
    }
    InputStream is = worker.getIs();
    if (is != null) {
        try {
            is.close();
        } catch (IOException ignore) {
        }
    }
}
Also used : MetricsCollector(org.apache.axis2.transport.base.MetricsCollector) NhttpMetricsCollector(org.apache.synapse.transport.nhttp.util.NhttpMetricsCollector) ProtocolException(org.apache.http.ProtocolException) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) HttpResponse(org.apache.http.HttpResponse) ConnectionClosedException(org.apache.http.ConnectionClosedException) BasicHttpEntity(org.apache.http.entity.BasicHttpEntity) MessageFormatter(org.apache.axis2.transport.MessageFormatter) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) ProtocolException(org.apache.http.ProtocolException) HttpException(org.apache.http.HttpException) InterruptedIOException(java.io.InterruptedIOException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) ConnectionClosedException(org.apache.http.ConnectionClosedException) NHttpServerConnection(org.apache.http.nio.NHttpServerConnection) Iterator(java.util.Iterator) Collection(java.util.Collection) HttpException(org.apache.http.HttpException) OMOutputFormat(org.apache.axiom.om.OMOutputFormat) Map(java.util.Map)

Aggregations

NHttpServerConnection (org.apache.http.nio.NHttpServerConnection)12 MessageContext (org.apache.axis2.context.MessageContext)7 IOException (java.io.IOException)5 Map (java.util.Map)4 SourceConfiguration (org.apache.synapse.transport.passthru.config.SourceConfiguration)4 OutputStream (java.io.OutputStream)3 ConnectionClosedException (org.apache.http.ConnectionClosedException)3 HttpException (org.apache.http.HttpException)3 Pipe (org.apache.synapse.transport.passthru.Pipe)3 SSLPeerUnverifiedException (javax.net.ssl.SSLPeerUnverifiedException)2 XMLStreamException (javax.xml.stream.XMLStreamException)2 OMOutputFormat (org.apache.axiom.om.OMOutputFormat)2 MessageFormatter (org.apache.axis2.transport.MessageFormatter)2 HttpResponse (org.apache.http.HttpResponse)2 HttpContext (org.apache.http.protocol.HttpContext)2 HttpCoreRequestResponseTransport (org.apache.synapse.transport.nhttp.HttpCoreRequestResponseTransport)2 InputStream (java.io.InputStream)1 InterruptedIOException (java.io.InterruptedIOException)1 InetAddress (java.net.InetAddress)1 MalformedURLException (java.net.MalformedURLException)1