snichol 2002/11/29 13:42:39
Modified: java/src/org/apache/soap/util StringUtils.java
java/src/org/apache/soap/util/net HTTPUtils.java
Log:
Submitted by: Pavel Ausianik <[EMAIL PROTECTED]>
Please find a patch proposed for converting HTTP headers using own
conversion instead of using JVM byte to char converter, as it happens not
to be efficient.
Also I have concatenated several const Strings in StringBuffer.append.
Modification by Scott Nichol: put getStringISO8859_1 into StringUtils to
make it generally available.
Revision Changes Path
1.8 +25 -1 xml-soap/java/src/org/apache/soap/util/StringUtils.java
Index: StringUtils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/StringUtils.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- StringUtils.java 6 Sep 2002 17:50:26 -0000 1.7
+++ StringUtils.java 29 Nov 2002 21:42:38 -0000 1.8
@@ -67,9 +67,11 @@
* Deals with strings (probably need to elaborate some more).
*
* @author Matthew J. Duftler
+ * @author Pavel Ausianik <[EMAIL PROTECTED]>
*/
public class StringUtils
{
+ public static final String ISO_8859_1 = "8859_1";
public static final String lineSeparator =
System.getProperty("line.separator", "\n");
public static String URI_SEPARATION_CHAR = "@";
@@ -280,5 +282,27 @@
}
-
+ /**
+ * Creates a String from byte array using direct byte to char conversion
+ * (the same as ISO8859_1), using preallocated char array
+ * main purpose is to workaround slow JDK conversion
+ *
+ * @param value array that is the source of characters.
+ * @param offset the initial offset.
+ * @param count the length.
+ * @param cbuf preallocated char array
+ *
+ * @return <code>true</code> when the string matches against the pattern,
+ * <code>false</code> otherwise.
+ */
+ public static String getStringISO8859_1(byte[] value, int offset, int count,
char[] cbuf)
+ throws UnsupportedEncodingException {
+ if (count > cbuf.length)
+ return new String(value, offset, count, ISO_8859_1);
+
+ // make own transformation
+ for (int i = 0; i < count; i++)
+ cbuf[i] = (char) value[i + offset];
+ return new String(cbuf, 0, count);
+ }
}
1.40 +18 -18 xml-soap/java/src/org/apache/soap/util/net/HTTPUtils.java
Index: HTTPUtils.java
===================================================================
RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/net/HTTPUtils.java,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- HTTPUtils.java 20 Nov 2002 06:33:57 -0000 1.39
+++ HTTPUtils.java 29 Nov 2002 21:42:39 -0000 1.40
@@ -81,6 +81,7 @@
import org.apache.soap.rpc.SOAPContext;
import org.apache.soap.transport.TransportMessage;
import org.apache.soap.util.MutableBoolean;
+import org.apache.soap.util.StringUtils;
/**
* A bunch of utility stuff for doing HTTP things.
@@ -100,7 +101,6 @@
private static final String HTTP_VERSION = "1.0";
private static final int HTTP_DEFAULT_PORT = 80;
private static final int HTTPS_DEFAULT_PORT = 443;
- private static final String ISO_8859_1 = "8859_1";
public static final int DEFAULT_OUTPUT_BUFFER_SIZE = 8 * 1024;
@@ -110,7 +110,7 @@
public static String encodeAuth(String userName, String password)
throws SOAPException {
try {
- return Base64.encode((userName + ":" + password).getBytes(ISO_8859_1));
+ return Base64.encode((userName + ":" +
password).getBytes(StringUtils.ISO_8859_1));
} catch (UnsupportedEncodingException e) {
throw new SOAPException (Constants.FAULT_CODE_CLIENT, e.getMessage(), e);
}
@@ -461,14 +461,13 @@
/* Construct the HTTP header. */
StringBuffer headerbuf = new StringBuffer(512);
- headerbuf.append(Constants.HEADER_POST).append(' ').append(URI)
- .append(" HTTP/").append(HTTP_VERSION).append("\r\n")
- .append(Constants.HEADER_HOST).append(": ").append(host)
- .append(':').append(port)
- .append("\r\n")
- .append(Constants.HEADER_CONTENT_TYPE).append(": ")
- .append(request.getContentType()).append("\r\n")
- .append(Constants.HEADER_CONTENT_LENGTH).append(": ")
+ headerbuf.append(Constants.HEADER_POST + ' ').append(URI)
+ .append(" HTTP/"+ HTTP_VERSION + "\r\n" +
+ Constants.HEADER_HOST + ": ").append(host)
+ .append(':').append(port).append("\r\n" +
+ Constants.HEADER_CONTENT_TYPE + ": ")
+ .append(request.getContentType()).append("\r\n" +
+ Constants.HEADER_CONTENT_LENGTH + ": ")
.append(request.getContentLength()).append("\r\n");
for (Enumeration e = request.getHeaderNames(); e.hasMoreElements(); ) {
Object key = e.nextElement();
@@ -493,6 +492,7 @@
BufferedInputStream bInStream = new BufferedInputStream(inStream);
byte[] linebuf = new byte[1024];
+ char[] cbuf = new char[256];
int count = 0;
int b;
@@ -506,7 +506,7 @@
int codeStart = -1;
int codeEnd = -1;
int stringStart = -1;
-
+
for (count = 0, b = bInStream.read(); b != '\n' && b != -1; b =
bInStream.read()) {
if (b != '\r') {
if (b == ' ') {
@@ -534,17 +534,17 @@
throw new Exception("Reached end of stream while reading HTTP
response status");
if (codeStart == -1)
throw new Exception("HTTP response status not present");
- versionString = new String(linebuf, 0, versionEnd, ISO_8859_1);
+ versionString = StringUtils.getStringISO8859_1(linebuf, 0, versionEnd,
cbuf);
if (codeEnd == -1)
codeEnd = count + 1;
- statusCode = Integer.parseInt(new String(linebuf, codeStart, codeEnd -
codeStart, ISO_8859_1));
+ statusCode = Integer.parseInt(StringUtils.getStringISO8859_1(linebuf,
codeStart, codeEnd - codeStart, cbuf));
if (stringStart != -1)
- statusString = new String(linebuf, stringStart, 1 + count -
stringStart, ISO_8859_1);
+ statusString = StringUtils.getStringISO8859_1(linebuf, stringStart, 1
+ count - stringStart, cbuf);
else
statusString = "";
} catch (Exception e) {
throw new SOAPException(Constants.FAULT_CODE_CLIENT,
- "Error parsing HTTP status line \"" + new String(linebuf, 0, count,
ISO_8859_1) + "\": " + e, e);
+ "Error parsing HTTP status line \"" +
StringUtils.getStringISO8859_1(linebuf, 0, count, cbuf) + "\": " + e, e);
}
/* Read the HTTP headers. */
@@ -580,13 +580,13 @@
if (nameEnd == -1)
throw new Exception("Incorrectly formed HTTP response header");
- String name = new String(linebuf, 0, nameEnd, ISO_8859_1);
+ String name = StringUtils.getStringISO8859_1(linebuf, 0, nameEnd,
cbuf);
String value = null;
if (valStart != -1) {
// Remove trailing ; to prevent ContentType from throwing
exception
if (linebuf[count - 1] == ';')
--count;
- value = new String(linebuf, valStart, count - valStart,
ISO_8859_1);
+ value = StringUtils.getStringISO8859_1(linebuf, valStart, count
- valStart, cbuf);
} else
value = "";
@@ -608,7 +608,7 @@
}
} catch (Exception e) {
throw new SOAPException(Constants.FAULT_CODE_CLIENT,
- "Error parsing HTTP header line \"" + new String(linebuf, 0, count,
ISO_8859_1) + "\": " + e, e);
+ "Error parsing HTTP header line \"" +
StringUtils.getStringISO8859_1(linebuf, 0, count, cbuf) + "\": " + e, e);
}
boolean isOneWay = false;
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>