You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2006/07/03 12:02:38 UTC
svn commit: r418730 - in
/jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl:
CoyoteHttpConnectionImpl.java HttpConnectionProcessor.java
Author: olegk
Date: Mon Jul 3 03:02:35 2006
New Revision: 418730
URL: http://svn.apache.org/viewvc?rev=418730&view=rev
Log:
Re-use Coyote primitives to minimize buffer copying and reduce intermediate garbage
Modified:
jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/CoyoteHttpConnectionImpl.java
jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/HttpConnectionProcessor.java
Modified: jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/CoyoteHttpConnectionImpl.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/CoyoteHttpConnectionImpl.java?rev=418730&r1=418729&r2=418730&view=diff
==============================================================================
--- jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/CoyoteHttpConnectionImpl.java (original)
+++ jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/CoyoteHttpConnectionImpl.java Mon Jul 3 03:02:35 2006
@@ -65,6 +65,7 @@
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicRequestLine;
import org.apache.http.message.BasicStatusLine;
+import org.apache.http.message.BufferedHeader;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
@@ -236,9 +237,14 @@
BasicStatusLine.format(this.charbuffer, response.getStatusLine());
this.datatransmitter.writeLine(this.charbuffer);
for (Iterator it = response.headerIterator(); it.hasNext(); ) {
- this.charbuffer.clear();
- BasicHeader.format(this.charbuffer, (Header) it.next());
- this.datatransmitter.writeLine(this.charbuffer);
+ Header header = (Header) it.next();
+ if (header instanceof BufferedHeader) {
+ this.datatransmitter.writeLine(((BufferedHeader)header).getBuffer());
+ } else {
+ this.charbuffer.clear();
+ BasicHeader.format(this.charbuffer, header);
+ this.datatransmitter.writeLine(this.charbuffer);
+ }
}
this.charbuffer.clear();
this.datatransmitter.writeLine(this.charbuffer);
Modified: jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/HttpConnectionProcessor.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/HttpConnectionProcessor.java?rev=418730&r1=418729&r2=418730&view=diff
==============================================================================
--- jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/HttpConnectionProcessor.java (original)
+++ jakarta/httpcomponents/tcconnector/trunk/src/java/org/apache/http/tcconnector/impl/HttpConnectionProcessor.java Mon Jul 3 03:02:35 2006
@@ -60,10 +60,13 @@
import org.apache.http.StatusLine;
import org.apache.http.entity.BasicHttpEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.io.CharArrayBuffer;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;
+import org.apache.http.message.BufferedHeader;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.AbstractHttpProcessor;
+import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpExecutionContext;
import org.apache.http.protocol.ResponseConnControl;
@@ -78,6 +81,9 @@
import org.apache.http.tcconnector.NotImplementedException;
import org.apache.http.tcconnector.UnsupportedHttpVersionException;
import org.apache.http.tcconnector.params.CoyoteParams;
+import org.apache.tomcat.util.buf.ByteChunk;
+import org.apache.tomcat.util.buf.CharChunk;
+import org.apache.tomcat.util.buf.MessageBytes;
import org.apache.tomcat.util.http.MimeHeaders;
/**
@@ -342,8 +348,20 @@
// Convert the request headers
Header[] headers = httpreq.getAllHeaders();
+ MimeHeaders mimeheaders = this.coyotereq.getMimeHeaders();
for (Header header: headers) {
- this.coyotereq.getMimeHeaders().addValue(header.getName()).setString(header.getValue());
+ MessageBytes mb = mimeheaders.addValue(header.getName());
+ if (header instanceof BufferedHeader) {
+ BufferedHeader bufheader = (BufferedHeader) header;
+ CharArrayBuffer buffer = bufheader.getBuffer();
+ int pos = bufheader.getValuePos();
+ while (pos < buffer.length() && HTTP.isWhitespace(buffer.charAt(pos))) {
+ pos++;
+ }
+ mb.setChars(buffer.buffer(), pos, buffer.length() - pos);
+ } else {
+ mb.setString(header.getValue());
+ }
}
}
@@ -379,7 +397,19 @@
&& status != HttpStatus.SC_NOT_MODIFIED
&& status != HttpStatus.SC_RESET_CONTENT;
}
-
+
+ private static void addMessageBytes(final CharArrayBuffer buffer, final MessageBytes mb) {
+ if (mb.getType() == MessageBytes.T_CHARS) {
+ CharChunk chunk = mb.getCharChunk();
+ buffer.append(chunk.getBuffer(), chunk.getStart(), chunk.getLength());
+ } else if (mb.getType() == MessageBytes.T_BYTES) {
+ ByteChunk chunk = mb.getByteChunk();
+ buffer.append(chunk.getBuffer(), chunk.getStart(), chunk.getLength());
+ } else if (mb.getType() == MessageBytes.T_STR) {
+ buffer.append(mb.getString());
+ }
+ }
+
private void prepareHttpResponse() throws IOException {
this.coyotereq.getRequestProcessor().setStage(Constants.STAGE_ENDINPUT);
if (this.httpres != null) {
@@ -403,9 +433,14 @@
MimeHeaders headers = this.coyoteres.getMimeHeaders();
int size = headers.size();
for (int i = 0; i < size; i++) {
- String name = headers.getName(i).getString();
- String value = headers.getValue(i).getString();
- this.httpres.addHeader(name, value);
+ MessageBytes n = headers.getName(i);
+ MessageBytes v = headers.getValue(i);
+ CharArrayBuffer buffer = new CharArrayBuffer(n.getLength() + v.getLength() + 2);
+ addMessageBytes(buffer, n);
+ buffer.append(": ");
+ addMessageBytes(buffer, v);
+ BufferedHeader header = new BufferedHeader(buffer);
+ this.httpres.addHeader(header);
}
String lang = this.coyoteres.getContentLanguage();
if (lang != null) {