2.0 branch? Thanks, Hiranya
On Thu, Oct 7, 2010 at 11:55 AM, <[email protected]> wrote: > Author: supun > Date: Thu Oct 7 06:25:32 2010 > New Revision: 1005337 > > URL: http://svn.apache.org/viewvc?rev=1005337&view=rev > Log: > adding the capability to force content length > > Modified: > > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java > > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java > > Modified: > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java > URL: > http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java?rev=1005337&r1=1005336&r2=1005337&view=diff > ============================================================================== > --- > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java > (original) > +++ > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/HttpCoreNIOSender.java > Thu Oct 7 06:25:32 2010 > @@ -40,6 +40,7 @@ import org.apache.axis2.util.JavaUtils; > import org.apache.commons.logging.Log; > import org.apache.commons.logging.LogFactory; > import org.apache.http.*; > +import org.apache.http.entity.BasicHttpEntity; > import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; > import org.apache.http.impl.nio.reactor.SSLIOSessionHandler; > import org.apache.http.nio.NHttpClientConnection; > @@ -60,6 +61,7 @@ import org.apache.synapse.transport.nhtt > import > org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory; > import org.apache.synapse.transport.nhttp.util.NhttpUtil; > import org.apache.synapse.transport.nhttp.util.NhttpMetricsCollector; > +import org.apache.synapse.commons.util.TemporaryData; > > import javax.net.ssl.SSLContext; > import java.io.IOException; > @@ -458,9 +460,11 @@ public class HttpCoreNIOSender extends A > */ > private void sendAsyncResponse(MessageContext msgContext) throws > AxisFault { > > + int contentLength = extractContentLength(msgContext); > + > // remove unwanted HTTP headers (if any from the current message) > removeUnwantedHeaders(msgContext); > - > + > ServerWorker worker = (ServerWorker) > msgContext.getProperty(Constants.OUT_TRANSPORT_INFO); > HttpResponse response = worker.getResponse(); > > @@ -488,31 +492,24 @@ public class HttpCoreNIOSender extends A > } > } > > - if > (JavaUtils.isTrueExplicitly(worker.getConn().getContext().getAttribute("forceClosing"))) > { > - HttpRequest req = (HttpRequest) > - > worker.getConn().getContext().getAttribute("http.request"); > - req.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE); > - } > - > - // pass ClientConnectionDebug to the Server side > - ServerConnectionDebug scd = (ServerConnectionDebug) > - > worker.getConn().getContext().getAttribute(ServerHandler.SERVER_CONNECTION_DEBUG); > - ClientConnectionDebug ccd = (ClientConnectionDebug) > - msgContext.getProperty(ClientHandler.CLIENT_CONNECTION_DEBUG); > - > - if (scd != null && ccd != null) { > - scd.setClientConnectionDebug(ccd); > - } else if (scd == null && ccd != null) { > - scd = ccd.getServerConnectionDebug(); > - scd.setClientConnectionDebug(ccd); > - } > + boolean forceContentLength = msgContext.isPropertyTrue( > + NhttpConstants.FORCE_HTTP_CONTENT_LENGTH); > + boolean forceContentLengthCopy = msgContext.isPropertyTrue( > + NhttpConstants.COPY_CONTENT_LENGTH_FROM_INCOMING); > > - if (scd != null) { > - scd.recordResponseStartTime(); > - } > + 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(); > @@ -525,41 +522,49 @@ public class HttpCoreNIOSender extends A > || Boolean.TRUE == noEntityBody) { > out.write(new byte[0]); > } else { > - messageFormatter.writeTo(msgContext, format, out, false); > + 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(); > - lstMetrics.incrementMessagesSent(); > + if (lstMetrics != null) { > + lstMetrics.incrementMessagesSent(); > + } > > } catch (HttpException e) { > if (lstMetrics != null) { > lstMetrics.incrementFaultsSending(); > } > handleException("Unexpected HTTP protocol error sending response > to : " + > - worker.getRemoteAddress() + "\n" + scd.dump(), e); > + worker.getRemoteAddress(), e); > } catch (ConnectionClosedException e) { > if (lstMetrics != null) { > lstMetrics.incrementFaultsSending(); > } > - log.warn("Connection closed by client : " > - + worker.getRemoteAddress() + "\n" + scd.dump()); > + log.warn("Connection closed by client : " + > worker.getRemoteAddress()); > } catch (IllegalStateException e) { > if (lstMetrics != null) { > lstMetrics.incrementFaultsSending(); > } > - log.warn("Connection closed by client : " > - + worker.getRemoteAddress() + "\n" + scd.dump()); > + 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() + "\n" + scd.dump(), e); > + worker.getRemoteAddress(), e); > } catch (Exception e) { > if (lstMetrics != null) { > lstMetrics.incrementFaultsSending(); > } > handleException("General Error sending response message to : " + > - worker.getRemoteAddress() + "\n" + scd.dump(), e); > + worker.getRemoteAddress(), e); > } > > InputStream is = worker.getIs(); > @@ -571,6 +576,76 @@ public class HttpCoreNIOSender extends A > } > > /** > + * Extract the content length from the incoming message > + * > + * @param msgContext current MessageContext > + * @return the length of the message > + */ > + private int extractContentLength(MessageContext msgContext) { > + Map headers = (Map) > msgContext.getProperty(MessageContext.TRANSPORT_HEADERS); > + > + if (headers == null || headers.isEmpty()) { > + return -1; > + } > + > + for (Object o : headers.keySet()) { > + String headerName = (String) o; > + if (HTTP.CONTENT_LEN.equalsIgnoreCase(headerName)) { > + Object value = headers.get(headerName); > + > + if (value != null && value instanceof String) { > + try { > + return Integer.parseInt((String) value); > + } catch (NumberFormatException e) { > + return -1; > + } > + } > + } > + } > + > + return -1; > + } > + > + /** > + * Write the stream to a temporary storage and calculate the content > length > + * @param entity HTTPEntity > + * @param messageFormatter message formatter > + * @param msgContext current message context > + * @param format message format > + * @throws IOException if an exception occurred while writing data > + */ > + private void setStreamAsTempData(BasicHttpEntity entity, > MessageFormatter messageFormatter, > + MessageContext msgContext, > OMOutputFormat format) > + throws IOException { > + TemporaryData serialized = new TemporaryData(256, 4096, "http-nio_", > ".dat"); > + OutputStream out = serialized.getOutputStream(); > + try { > + messageFormatter.writeTo(msgContext, format, out, true); > + } finally { > + out.close(); > + } > + msgContext.setProperty(NhttpConstants.SERIALIZED_BYTES, serialized); > + entity.setContentLength(serialized.getLength()); > + } > + > + /** > + * Take the data from temporary storage and write it to the output stream > + * @param out output stream output stream > + * @param msgContext messagecontext > + * @throws IOException if an exception occurred while writing data > + */ > + private void writeMessageFromTempData(OutputStream out, MessageContext > msgContext) > + throws IOException { > + TemporaryData serialized = > + (TemporaryData) > msgContext.getProperty(NhttpConstants.SERIALIZED_BYTES); > + try { > + serialized.writeTo(out); > + } finally { > + serialized.release(); > + } > + } > + > + /** > * Determine the HttpStatusCodedepending on the message type processed > <br> > * (normal response versus fault response) as well as Axis2 message > context properties set > * via Synapse configuration or MessageBuilders. > > Modified: > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java > URL: > http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java?rev=1005337&r1=1005336&r2=1005337&view=diff > ============================================================================== > --- > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java > (original) > +++ > synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java > Thu Oct 7 06:25:32 2010 > @@ -30,6 +30,9 @@ public class NhttpConstants { > public static final String SC_ACCEPTED = "SC_ACCEPTED"; > public static final String HTTP_SC = "HTTP_SC"; > public static final String FORCE_HTTP_1_0 = "FORCE_HTTP_1.0"; > + public static final String FORCE_HTTP_CONTENT_LENGTH = > "FORCE_HTTP_CONTENT_LENGTH"; > + public static final String COPY_CONTENT_LENGTH_FROM_INCOMING = > + "COPY_CONTENT_LENGTH_FROM_INCOMING"; > public static final String DISABLE_CHUNKING = "DISABLE_CHUNKING"; > public static final String POST_TO_URI = "POST_TO_URI"; > public static final String NO_KEEPALIVE = "NO_KEEPALIVE"; > > > -- Hiranya Jayathilaka Senior Software Engineer; WSO2 Inc.; http://wso2.org E-mail: [email protected]; Mobile: +94 77 633 3491 Blog: http://techfeast-hiranya.blogspot.com --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
