//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.util.http;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.SocketException;
import java.net.URL;

import sun.net.www.http.HttpClient;
//import sun.net.*;
//import sun.net.www.*;
class HttpClientTimeout extends HttpClient
{
	private int timeout = 0 ;

    HttpClientTimeout(URL url, String proxy, int proxyPort, int timeout) throws IOException
	{
		super(url, proxy, proxyPort);
		_setTimeout(timeout);

	}

    HttpClientTimeout(URL url, int timeout) throws IOException
	{
		super(url, (String)null, -1);
		setTimeout(timeout);
    }

	private void _setTimeout(int i)
    	throws SocketException
	{
    	this.timeout = i;
    	serverSocket.setSoTimeout(i) ;
 	}

    /* This class has no public constructor for HTTP.  This method is used to
     * get an HttpClient to the specifed URL.  If there's currently an
     * active HttpClient to that server/port, you'll get that one.
	 *
	 * no longer syncrhonized -- it slows things down too much
	 * synchronize at a higher level
     */
    static HttpClientTimeout GetNew(URL url, int timeout)
    throws IOException {
		/* see if one's already around */
		HttpClientTimeout ret = (HttpClientTimeout) kac.get(url);
		if (ret == null) {
	    	ret = new HttpClientTimeout (url, timeout);  // CTOR called openServer()
		} else {
	    	ret.url = url;
		}
		// don't know if we're keeping alive until we parse the headers
		// for now, keepingAlive is false
		return ret;
    }

    public void openServer(String s, int i)
        throws IOException
    {
        serverSocket = doConnect(s, i);
        serverOutput = new PrintStream(new BufferedOutputStream(serverSocket.getOutputStream()));
        serverSocket.setTcpNoDelay(true);
        serverSocket.setSoTimeout(timeout);
    }

}
