You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Lee Francis Wilhelmsen <le...@start.no> on 2004/05/14 14:24:43 UTC
Posting XML over authenticated connection using SSL
Hi
This is my first posting to this list although I've been a subscriber
for a while now. Anyway, I've been using HTTP client for some time and
although it works it also fails too often and I don't know why.
I'm using HTTP Client version 2.0 final downloaded a few months back.
I'm running on Sun JRE 1.4.2_03 on Win2000.
The task at hand is the following: I'm posting xml to a servlet on a IBM
server. The server sends me xml back. The serlvet is protected by
username/password and the connection is SSL. I have to parse the
returned xml and read a special tag value to see if there is more data
available. If there is then I have to establish a new connection and
receive the next batch of xml data. This goes on until all data is
returned at which point I send a receipt. The trouble I'm having is that
the connection sometimes fails between batches and I have been getting a
few different error messages.
Here's my code, does this look ok?
In the class constructor:
client = new HttpClient(); // used for every call to connect()
In the class connect() method:
logger.info("Making remote connection");
client.setStrictMode(false);
logger.debug("Setting username/password credentials");
UsernamePasswordCredentials upc =
new UsernamePasswordCredentials(username, password);
HttpState httpState = client.getState();
httpState.setCredentials(realm, host, upc);
logger.debug("Making connection method object");
HttpMethodBase method = requester.createHttpMethod(url);
method.setDoAuthentication(true);
logger.debug("Using DefaultMethodRetryHandler");
DefaultMethodRetryHandler methodRetryHandler =
new DefaultMethodRetryHandler();
method.setMethodRetryHandler(methodRetryHandler);
logger.debug("Method Retry count is " +
methodRetryHandler.getRetryCount());
logger.debug("Attempting to connect");
final int LIMIT = 3;
try {
for (int i=0; i<LIMIT; i++) {
try {
status = client.executeMethod(method);
logger.info("Executed!");
break;
} catch (HttpRecoverableException e) {
logger.error("Http exception", e);
} catch (IOException e) {
logger.fatal("IOException", e);
}
}
} finally {
byte[] body = method.getResponseBody();
String charset = method.getRequestCharSet();
method.releaseConnection();
processContent(body, charset);
}
printRequestHeaders(method);
printResponseHeaders(method);
printCookieInfo(client.getState());
} catch (...)
Does this look ok? It seems to work fine when executeMethod() succeeds,
but when it fails there seems to be no way back.
Ok. From the wire trace it seems this is happening:
- I initiate a post to the server
- The server responds saying not authorized with a realm value
- HTTP Client then resends the post using the credentitals
I have supplied (why doesn't it do this the first time?)
- The server responds with the result
- HTTP Client can't read the result because it can't find a
line starting with HTTP.
The error I'm getting is this case is
org.apache.commons.httpclient.HttpRecoverableException:
org.apache.commons.httpclient.HttpRecoverableException: Error in parsing
the status line from the response: unable to find line starting with "HTTP"
at
org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1965)
at
org.apache.commons.httpclient.HttpMethodBase.processRequest(HttpMethodBase.java:2659)
at
org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1093)
at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:675)
at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:529)
When I look at the wire trace it says:
DEBUG [main] httpclient.wire - >> "POST /sting/StingServlet
HTTP/1.1[\r][\n]"
DEBUG [main] httpclient.wire - >> "User-Agent: Jakarta
Commons-HttpClient/2.0final[\r][\n]"
DEBUG [main] httpclient.wire - >> "Host: e-torg.no.ihost.com[\r][\n]"
DEBUG [main] httpclient.wire - >> "Content-Length: 816[\r][\n]"
DEBUG [main] httpclient.wire - >> "Content-Type:
application/x-www-form-urlencoded[\r][\n]"
DEBUG [main] httpclient.wire - >> "[\r][\n]"
DEBUG [main] httpclient.wire - >>
"xmlInput=%3C%3Fxml+version%3D%22[stuffdeleted]3E%0A%3C%2FstingRequest%3E%0A"
DEBUG [main] httpclient.wire - << "HTTP/1.1 401 Unauthorized [\r][\n]"
DEBUG [main] httpclient.wire - << "Server: IBM HTTP Server/V5R3M0[\r][\n]"
DEBUG [main] httpclient.wire - << "Date: Fri, 14 May 2004 11:18:33
GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Accept-Ranges: bytes[\r][\n]"
DEBUG [main] httpclient.wire - << "Content-Type: text/html;
charset=IBM-1047[\r][\n]"
DEBUG [main] httpclient.wire - << "Content-Length: 282[\r][\n]"
DEBUG [main] httpclient.wire - << "Last-Modified: Fri, 14 May 2004
11:18:33 GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Expires: Fri, 14 May 2004 11:18:33
GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Pragma: no-cache[\r][\n]"
DEBUG [main] httpclient.wire - << "Cache-Control: no-cache[\r][\n]"
DEBUG [main] httpclient.wire - << "WWW-Authenticate: Basic
realm="STING_Restricted"[\r][\n]"
DEBUG [main] httpclient.wire - << "IMW0254E
<HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY
bgcolor="[0xfffd][0xfffd]FFF7E7"><H1>Error 401</H1>IMW0216E Not
authorized. Authentication failed.<P><HR><ADDRESS><A
HREF="https://e-torg.no.ihost.com/" target="_top">IBM HTTP Server -
North American Edition V5R3M0</A></ADDRESS></BODY></HTML"
DEBUG [main] httpclient.wire - >> "POST /sting/StingServlet
HTTP/1.1[\r][\n]"
DEBUG [main] httpclient.wire - >> "User-Agent: Jakarta
Commons-HttpClient/2.0final[\r][\n]"
DEBUG [main] httpclient.wire - >> "Host: e-torg.no.ihost.com[\r][\n]"
DEBUG [main] httpclient.wire - >> "Content-Length: 816[\r][\n]"
DEBUG [main] httpclient.wire - >> "Content-Type:
application/x-www-form-urlencoded[\r][\n]"
DEBUG [main] httpclient.wire - >> "Authorization: Basic
aTAweGRrOmVqYjl3aQ==[\r][\n]"
DEBUG [main] httpclient.wire - >> "[\r][\n]"
DEBUG [main] httpclient.wire - >>
"xmlInput=%3C%3Fxml+version%3D%22[stuffdeleted]3E%0A%3C%2FstingRequest%3E%0A"
DEBUG [main] httpclient.wire - << ">HTTP/1.1 200 ok [\r][\n]"
DEBUG [main] httpclient.wire - << "Server: IBM HTTP Server/V5R3M0[\r][\n]"
DEBUG [main] httpclient.wire - << "Date: Fri, 14 May 2004 11:18:35
GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Accept-Ranges: bytes[\r][\n]"
DEBUG [main] httpclient.wire - << "Transfer-Encoding: chunked[\r][\n]"
DEBUG [main] httpclient.wire - << "Content-Type: text/xml[\r][\n]"
DEBUG [main] httpclient.wire - << "Last-Modified: Fri, 14 May 2004
11:18:35 GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Expires: Thu, 01 Dec 1994 16:00:00
GMT[\r][\n]"
DEBUG [main] httpclient.wire - << "Set-Cookie:
sesessionid=9Br13dKU6vHMOp6QVZGKGuJi;Path=/[\r][\n]"
DEBUG [main] httpclient.wire - << "Cache-Control:
no-cache="set-cookie,set-cookie2"[\r][\n]"
DEBUG [main] httpclient.wire - << "[\r][\n]"
DEBUG [main] httpclient.wire - << "148E[\r][\n]"
DEBUG [main] httpclient.wire - << "<?xml version="1.0"
encoding="UTF-8"?>[\r][\n]"
[xml contents from server follow]
Notice the funny ">" character before the second server response: ">
HTTP/1.1 200 ok". This seems to be part of a HTML response from the
first response further up the wire trace:
4000 [main] DEBUG httpclient.wire - << "IMW0254E
<HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY
bgcolor="[0xfffd][0xfffd]FFF7E7"><H1>Error 401</H1>IMW0216E Not
authorized. Authentication failed.<P><HR><ADDRESS><A
HREF="https://e-torg.no.ihost.com/" target="_top">IBM HTTP Server -
North American Edition V5R3M0</A></ADDRESS></BODY></HTML"
Notice there is no closing ">" character and this seems to be the cause
of this particular problem.
Most of the code in this wire trace is done automatically by HTTP Client.
Why is this happening? Can anyone help?
Best regards
Lee Francis Wilhelmsen
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
Re: Posting XML over authenticated connection using SSL
Posted by Michael Becke <be...@u.washington.edu>.
Hi Lee,
I believe the problem is that method.releaseConnection() is being
called incorrectly. releaseConnection() must be called after every
client.executeMethod(method).
Mike
On May 14, 2004, at 8:24 AM, Lee Francis Wilhelmsen wrote:
> Hi
>
> This is my first posting to this list although I've been a subscriber
> for a while now. Anyway, I've been using HTTP client for some time and
> although it works it also fails too often and I don't know why.
>
> I'm using HTTP Client version 2.0 final downloaded a few months back.
> I'm running on Sun JRE 1.4.2_03 on Win2000.
>
> The task at hand is the following: I'm posting xml to a servlet on a
> IBM server. The server sends me xml back. The serlvet is protected by
> username/password and the connection is SSL. I have to parse the
> returned xml and read a special tag value to see if there is more data
> available. If there is then I have to establish a new connection and
> receive the next batch of xml data. This goes on until all data is
> returned at which point I send a receipt. The trouble I'm having is
> that the connection sometimes fails between batches and I have been
> getting a few different error messages.
>
> Here's my code, does this look ok?
>
> In the class constructor:
> client = new HttpClient(); // used for every call to connect()
>
> In the class connect() method:
>
> logger.info("Making remote connection");
> client.setStrictMode(false);
>
> logger.debug("Setting username/password credentials");
> UsernamePasswordCredentials upc =
> new UsernamePasswordCredentials(username, password);
> HttpState httpState = client.getState();
> httpState.setCredentials(realm, host, upc);
>
> logger.debug("Making connection method object");
> HttpMethodBase method = requester.createHttpMethod(url);
> method.setDoAuthentication(true);
>
> logger.debug("Using DefaultMethodRetryHandler");
> DefaultMethodRetryHandler methodRetryHandler =
> new DefaultMethodRetryHandler();
> method.setMethodRetryHandler(methodRetryHandler);
> logger.debug("Method Retry count is " +
> methodRetryHandler.getRetryCount());
>
> logger.debug("Attempting to connect");
>
> final int LIMIT = 3;
> try {
> for (int i=0; i<LIMIT; i++) {
> try {
> status = client.executeMethod(method);
> logger.info("Executed!");
> break;
> } catch (HttpRecoverableException e) {
> logger.error("Http exception", e);
> } catch (IOException e) {
> logger.fatal("IOException", e);
> }
> }
> } finally {
> byte[] body = method.getResponseBody();
> String charset = method.getRequestCharSet();
> method.releaseConnection();
>
> processContent(body, charset);
> }
>
> printRequestHeaders(method);
> printResponseHeaders(method);
> printCookieInfo(client.getState());
> } catch (...)
>
> Does this look ok? It seems to work fine when executeMethod()
> succeeds, but when it fails there seems to be no way back.
>
> Ok. From the wire trace it seems this is happening:
>
> - I initiate a post to the server
> - The server responds saying not authorized with a realm value
> - HTTP Client then resends the post using the credentitals
> I have supplied (why doesn't it do this the first time?)
> - The server responds with the result
> - HTTP Client can't read the result because it can't find a
> line starting with HTTP.
>
>
> The error I'm getting is this case is
>
> org.apache.commons.httpclient.HttpRecoverableException:
> org.apache.commons.httpclient.HttpRecoverableException: Error in
> parsing the status line from the response: unable to find line
> starting with "HTTP"
> at
> org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBas
> e.java:1965)
> at
> org.apache.commons.httpclient.HttpMethodBase.processRequest(HttpMethodB
> ase.java:2659)
> at
> org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.jav
> a:1093)
> at
> org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:
> 675)
> at
> org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:
> 529)
>
>
>
> When I look at the wire trace it says:
>
> DEBUG [main] httpclient.wire - >> "POST /sting/StingServlet
> HTTP/1.1[\r][\n]"
> DEBUG [main] httpclient.wire - >> "User-Agent: Jakarta
> Commons-HttpClient/2.0final[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Host: e-torg.no.ihost.com[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Content-Length: 816[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Content-Type:
> application/x-www-form-urlencoded[\r][\n]"
> DEBUG [main] httpclient.wire - >> "[\r][\n]"
> DEBUG [main] httpclient.wire - >>
> "xmlInput=%3C%3Fxml+version%3D%22[stuffdeleted]3E%0A%3C%2FstingRequest%
> 3E%0A"
> DEBUG [main] httpclient.wire - << "HTTP/1.1 401 Unauthorized [\r][\n]"
> DEBUG [main] httpclient.wire - << "Server: IBM HTTP
> Server/V5R3M0[\r][\n]"
> DEBUG [main] httpclient.wire - << "Date: Fri, 14 May 2004 11:18:33
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Accept-Ranges: bytes[\r][\n]"
> DEBUG [main] httpclient.wire - << "Content-Type: text/html;
> charset=IBM-1047[\r][\n]"
> DEBUG [main] httpclient.wire - << "Content-Length: 282[\r][\n]"
> DEBUG [main] httpclient.wire - << "Last-Modified: Fri, 14 May 2004
> 11:18:33 GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Expires: Fri, 14 May 2004 11:18:33
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Pragma: no-cache[\r][\n]"
> DEBUG [main] httpclient.wire - << "Cache-Control: no-cache[\r][\n]"
> DEBUG [main] httpclient.wire - << "WWW-Authenticate: Basic
> realm="STING_Restricted"[\r][\n]"
> DEBUG [main] httpclient.wire - << "IMW0254E
> <HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY
> bgcolor="[0xfffd][0xfffd]FFF7E7"><H1>Error 401</H1>IMW0216E Not
> authorized. Authentication failed.<P><HR><ADDRESS><A
> HREF="https://e-torg.no.ihost.com/" target="_top">IBM HTTP Server -
> North American Edition V5R3M0</A></ADDRESS></BODY></HTML"
> DEBUG [main] httpclient.wire - >> "POST /sting/StingServlet
> HTTP/1.1[\r][\n]"
> DEBUG [main] httpclient.wire - >> "User-Agent: Jakarta
> Commons-HttpClient/2.0final[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Host: e-torg.no.ihost.com[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Content-Length: 816[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Content-Type:
> application/x-www-form-urlencoded[\r][\n]"
> DEBUG [main] httpclient.wire - >> "Authorization: Basic
> aTAweGRrOmVqYjl3aQ==[\r][\n]"
> DEBUG [main] httpclient.wire - >> "[\r][\n]"
> DEBUG [main] httpclient.wire - >>
> "xmlInput=%3C%3Fxml+version%3D%22[stuffdeleted]3E%0A%3C%2FstingRequest%
> 3E%0A"
> DEBUG [main] httpclient.wire - << ">HTTP/1.1 200 ok [\r][\n]"
> DEBUG [main] httpclient.wire - << "Server: IBM HTTP
> Server/V5R3M0[\r][\n]"
> DEBUG [main] httpclient.wire - << "Date: Fri, 14 May 2004 11:18:35
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Accept-Ranges: bytes[\r][\n]"
> DEBUG [main] httpclient.wire - << "Transfer-Encoding: chunked[\r][\n]"
> DEBUG [main] httpclient.wire - << "Content-Type: text/xml[\r][\n]"
> DEBUG [main] httpclient.wire - << "Last-Modified: Fri, 14 May 2004
> 11:18:35 GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Expires: Thu, 01 Dec 1994 16:00:00
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Set-Cookie:
> sesessionid=9Br13dKU6vHMOp6QVZGKGuJi;Path=/[\r][\n]"
> DEBUG [main] httpclient.wire - << "Cache-Control:
> no-cache="set-cookie,set-cookie2"[\r][\n]"
> DEBUG [main] httpclient.wire - << "[\r][\n]"
> DEBUG [main] httpclient.wire - << "148E[\r][\n]"
> DEBUG [main] httpclient.wire - << "<?xml version="1.0"
> encoding="UTF-8"?>[\r][\n]"
> [xml contents from server follow]
>
>
> Notice the funny ">" character before the second server response: ">
> HTTP/1.1 200 ok". This seems to be part of a HTML response from the
> first response further up the wire trace:
>
> 4000 [main] DEBUG httpclient.wire - << "IMW0254E
> <HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY
> bgcolor="[0xfffd][0xfffd]FFF7E7"><H1>Error 401</H1>IMW0216E Not
> authorized. Authentication failed.<P><HR><ADDRESS><A
> HREF="https://e-torg.no.ihost.com/" target="_top">IBM HTTP Server -
> North American Edition V5R3M0</A></ADDRESS></BODY></HTML"
>
> Notice there is no closing ">" character and this seems to be the
> cause of this particular problem.
>
> Most of the code in this wire trace is done automatically by HTTP
> Client.
>
> Why is this happening? Can anyone help?
>
> Best regards
> Lee Francis Wilhelmsen
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
> commons-httpclient-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail:
> commons-httpclient-dev-help@jakarta.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org
Re: Posting XML over authenticated connection using SSL
Posted by Ortwin Glück <or...@nose.ch>.
Lee Francis Wilhelmsen wrote:
> - The server responds saying not authorized with a realm value
> - HTTP Client then resends the post using the credentitals
> I have supplied (why doesn't it do this the first time?)
This is the standard behaviour. You can enable preemtive authentication.
> org.apache.commons.httpclient.HttpRecoverableException: Error in parsing
> the status line from the response: unable to find line starting with
> "HTTP"
> DEBUG [main] httpclient.wire - << "HTTP/1.1 401 Unauthorized [\r][\n]"
> DEBUG [main] httpclient.wire - << "Server: IBM HTTP Server/V5R3M0[\r][\n]"
> DEBUG [main] httpclient.wire - << "Date: Fri, 14 May 2004 11:18:33
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Accept-Ranges: bytes[\r][\n]"
> DEBUG [main] httpclient.wire - << "Content-Type: text/html;
> charset=IBM-1047[\r][\n]"
> DEBUG [main] httpclient.wire - << "Content-Length: 282[\r][\n]"
> DEBUG [main] httpclient.wire - << "Last-Modified: Fri, 14 May 2004
> 11:18:33 GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Expires: Fri, 14 May 2004 11:18:33
> GMT[\r][\n]"
> DEBUG [main] httpclient.wire - << "Pragma: no-cache[\r][\n]"
> DEBUG [main] httpclient.wire - << "Cache-Control: no-cache[\r][\n]"
> DEBUG [main] httpclient.wire - << "WWW-Authenticate: Basic
> realm="STING_Restricted"[\r][\n]"
> DEBUG [main] httpclient.wire - << "IMW0254E
> <HTML><HEAD><TITLE>Error</TITLE></HEAD><BODY
> bgcolor="[0xfffd][0xfffd]FFF7E7"><H1>Error 401</H1>IMW0216E Not
> authorized. Authentication failed.<P><HR><ADDRESS><A
> HREF="https://e-torg.no.ihost.com/" target="_top">IBM HTTP Server -
> North American Edition V5R3M0</A></ADDRESS></BODY></HTML"
> DEBUG [main] httpclient.wire - >> "POST /sting/StingServlet
> Notice there is no closing ">" character and this seems to be the cause
> of this particular problem.
> Why is this happening? Can anyone help?
>
> Best regards
> Lee Francis Wilhelmsen
Lee,
The problem is that your server reports an incorrect Content-Length on
the 401 Response body.
Count yourself: It sais 282 bytes. But the response is 283 bytes. (the
two [0xfffd] sequences are one byte each). Nothing we can do here I fear.
Ortwin Glück
--
_________________________________________________________________
NOSE applied intelligence ag
ortwin glück [www] http://www.nose.ch
software engineer [email] ortwin.glueck@nose.ch
hardturmstrasse 171 [pgp id] 0x81CF3416
8005 zürich [office] +41-1-277 57 35
switzerland [fax] +41-1-277 57 12
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org