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