[prev in list] [next in list] [prev in thread] [next in thread]
List: httpclient-commons-dev
Subject: RE: problem posting xml, with size larger than 8196 or 4319 bytes...
From: "Kalnichevski, Oleg" <oleg.kalnichevski () bearingpoint ! com>
Date: 2004-02-25 18:18:23
Message-ID: 825BF35A92B3F0479CC164ECBBE9376E0DE6E0 () kccxoex06 ! corp ! kpmgconsulting ! com
[Download RAW message or body]
Koutsomboris,
Your servlet code appears to be causing the problem
> ServletInputStream servInStream = null;
> ByteArrayOutputStream baos = null;
> ByteArrayInputStream bais = null;
> byte[] bufByteArray = null;
> String msgIN = null;
> servInStream = request.getInputStream();
> System.out.println("--->request.getContentLength() = "
> +request.getContentLength());
> bufByteArray = new byte[request.getContentLength()];
> servInStream.read(bufByteArray);
> msgIN = new String(bufByteArray, "UTF-8");
> bais = new ByteArrayInputStream(bufByteArray);
If I interpret the words of the InputStream.html#read(byte[]) javadoc correctly, the \
method is supposed to read only "some number of bytes from the input stream... The \
number of bytes actually read is returned as an integer. This method blocks until \
input data is available, end of file is detected, or an exception is thrown". This \
method does not block until THE ENTIRE buffer is filled up, only until SOME data \
become available. Please someone correct me if I err.
file:///C:/java/sun-jdk-1.4.2/docs/api/java/io/InputStream.html#read(byte[])
You should probably be reading the request body like that
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int len;
while ((len = instream.read(buffer)) > 0) {
outstream.write(buffer, 0, len);
}
outstream.close();
byte[] requestBody = outstream.toByteArray();
Hope this helps,
Oleg
-----Original Message-----
From: Koutsomboris Tasos [mailto:koutsomboris@intralot.com]
Sent: Wednesday, February 25, 2004 14:42
To: 'commons-httpclient-dev@jakarta.apache.org'
Subject: problem posting xml, with size larger than 8196 or 4319 bytes...
Hello to all!
Forgive me, if I have made a mistake, by posting my question to an
irrelevant list, but this is my first try to use the benefits of the mailing
list.
I have just downloaded (from http://jakarta.apache.org/site/binindex.cgi)
version 2 (final) of httpclient and I am trying to create a small tester,
trying to post an xml, that I have read from a file.
I am pasting the test code that mades the post (in the code, I am creating
the test string , that I am willing to send, with a specific length of
10000 . The results are also the same, in case I am reading the input xml
from a file ) :
package com.intralot.melisa.bae.utils;
import com.intralot.melisa.bae.agents.agentBase;
import java.io.ByteArrayOutputStream;
import com.intralot.melisa.exceptions.iLotException;
import java.io.UnsupportedEncodingException;
import org.exolab.castor.xml.Marshaller;
import java.io.OutputStreamWriter;
import org.exolab.castor.xml.CastorException;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import org.exolab.castor.types.Date;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
public class test_post_mailinglist {
public test_post_mailinglist() {
}
public static void main(String[] args) {
test_post_mailinglist test_post1 = new test_post_mailinglist();
System.out.println("POST");
try {
///////////////////////////
System.setProperty("org.apache.commons.logging.Log",
"org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.showdatetime",
"true");
System.setProperty(
"org.apache.commons.logging.simplelog.log.httpclient.wire",
"debug");
System.setProperty(
"org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient",
"debug");
String stringtosend = "";
for (int kl = 0;kl<10000;kl++){
stringtosend = stringtosend + "c" ;
}
test_post1.SendTo("http://localhost:8080/MELISAdummy/receiver",stringtosend)
;
}
catch (Exception e) {
System.out.println(e.toString());
}
}
public String SendTo(String URL, String XmlStringToSend) throws Exception
{
try {
String strURL = URL;
String input = XmlStringToSend ;
PostMethod post = new PostMethod(strURL);
//post.setRequestBody(new FileInputStream(new File("./input.xml")));
post.setRequestBody(input);
System.out.println(
"--------------------------------------------------------");
System.out.println("----------------- input.length() = " +
input.length());
post.setRequestContentLength( post.CONTENT_LENGTH_AUTO );
// post.setRequestContentLength( (int) input.length()
//
post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED)
post.setRequestHeader("Content-type", "text/xml; charset=UTF-8");
HttpClient httpclient = new HttpClient();
// Execute request
httpclient.setConnectionTimeout(20000);
httpclient.setTimeout(20000);
int result = httpclient.executeMethod(post);
System.out.println(" Response status code: " + result);
System.out.print("Response CharSet--> ");
System.out.println(post.getResponseCharSet());
System.out.print("Response body--> ");
System.out.println(post.getResponseBodyAsString());
post.releaseConnection();
return post.getResponseBodyAsString() ;
}
catch(org.apache.commons.httpclient.HttpConnection$ConnectionTimeoutExceptio
n e){
System.out.println("--- ConnectionTimeoutException ---");
throw e;
}
catch(org.apache.commons.httpclient.HttpRecoverableException e){
System.out.println("--- TimeoutException, ---");
throw e;
}
catch (Exception exc) {
throw exc;
}
}
}
The strange thing is that if I print the results on server side, which is a
servlet (I am reading the results as :
ServletInputStream servInStream = null;
ByteArrayOutputStream baos = null;
ByteArrayInputStream bais = null;
byte[] bufByteArray = null;
String msgIN = null;
servInStream = request.getInputStream();
System.out.println("--->request.getContentLength() = "
+request.getContentLength());
bufByteArray = new byte[request.getContentLength()];
servInStream.read(bufByteArray);
msgIN = new String(bufByteArray, "UTF-8");
bais = new ByteArrayInputStream(bufByteArray);
System.out.println("--->bufByteArray.length = " +bufByteArray.length);
System.out.println("--->msgIN.length() = " +msgIN.length());
for (int gg=0;gg<bufByteArray.length;gg++) {
if (bufByteArray[gg]==0) break;
System.out.print("--->byte("+gg+") = " + msgIN.charAt(gg));
}
)
only first 4319 bytes include a value, although the length of received data
is the same as the length of sent data (I can see these values in
system.out).
Any help would be useful,
Tassos
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
***************************************************************************************************
The information in this email is confidential and may be legally privileged. Access \
to this email by anyone other than the intended addressee is unauthorized. If you \
are not the intended recipient of this message, any review, disclosure, copying, \
distribution, retention, or any action taken or omitted to be taken in reliance on it \
is prohibited and may be unlawful. If you are not the intended recipient, please \
reply to or forward a copy of this message to the sender and delete the message, any \
attachments, and any copies thereof from your system.
***************************************************************************************************
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic