commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vermeulen, Francis" <Francis.Vermeu...@atosorigin.com>
Subject HttpClient IO Exception on Solaris
Date Thu, 30 Jan 2003 15:46:31 GMT
Hi,

I'm having the following problem, that maybe someone has also encountered?

I've used HttpClient to develop a servlet that forwards an original URL to
another host, a sort of very basic proxy thus. The relevant source code
looks like this:

    private	HttpClient	makeHttpClient(HttpSession	session)
{
    	
    	log.debug("makeHttpClient");
    	
		// ServletContext	context	=
session.getServletContext();

		String	targetPort	= _context.getInitParameter("port");
    	Integer	portNr	=	new	Integer(targetPort);
    	String	userName	=	_context.getInitParameter("user");
    	String	password	=
_context.getInitParameter("password");
    	String	domain		=	_context.getInitParameter("domein");
    	
    	HttpState	myState	=	new	HttpState();
    	
    	NTCredentials	ntCredentials =	new	NTCredentials(
 
userName,
 
password,
 
_host,
 
domain);
 

		myState.setCredentials("localhost:8080", ntCredentials);

		HttpClient	httpClient	=	new
HttpClient();    	
		
    	httpClient.setState(myState);
    	
    	log.debug("starting session on :" + _host + ":" + portNr);
    	httpClient.startSession(_host, portNr.intValue());
    	
    	session.setAttribute("client", httpClient);
    	
    	return	httpClient;    	
    }


	private	void	ForwardRequest(HttpServletRequest
req,HttpServletResponse res, HttpMethod	method)	{

    	int	status	=	0;
    	int	retryCount	=	0;
    	boolean	success	=	false;
    	
    	log.debug("ForwardRequest");
    	
   		CopyRequestHeaders(req, method);

		HttpSession	session	=	req.getSession();    	
    	HttpClient	httpClient	=
(HttpClient)session.getAttribute("client");
    	
    	//	If no httpClient in session, do it ourself, lifecycle events
    	//	are not supported then
    	if	(httpClient	==	null)	{
    		log.debug("No http client in session");
    		httpClient	=	makeHttpClient(session);
    	}

		while	((retryCount	<= 1)  && (success == false))
		{
	
   			try {
				status	=
httpClient.executeMethod(method);
	
res.getOutputStream().print(method.getResponseBodyAsString());
				success	=	true;

			} catch (IOException e) {
				log.error("IO exception occured on
execute");
				if	(retryCount	< 1)	{
					httpClient	=
makeHttpClient(session);
					++retryCount;
				}
				else
				{
					ReportError(res, e);
					return;
				}
   			}
   		
		}
		
   		CopyResponseHeadersAndStatus(res, method);		
	}

The retry stuff has been added because of the problem I have, i.e. on the
target Solaris platform, an IO exception "broken pipe"is thrown if the
requested page is reloaded in the browser after some time (my guess, after a
session timeout?). On the w2k development platform, I cannot reproduce this.
The redirect host is running an Apache web server. As you may see from the
code, the HttpClient is stored in the user's session and thus reused for the
duration of the session. All HTTP request headers and repsonse headers are
proxied, except for the connection headers. The servlet runs in an iPlanet
server engine on the Solaris machine in a JDK1.3.1 environment.

If anybody has a clue what might cause this problem on the Solaris machine,
that would be great help!

Regards, 

============================================
Ing. FRA Vermeulen
Senior J2EE Architect
ECM Solutions - Eindhoven
mobiel: +31 (0) 6 222 03 856
e-mail: francis.vermeulen@atosorigin.com
============================================



Mime
View raw message