package com.netifera.platform.net.http.service; import java.io.IOException; import java.net.Socket; import java.net.URI; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.impl.DefaultHttpClientConnection; import org.apache.http.message.BasicHttpRequest; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.ExecutionContext; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpRequestExecutor; import org.apache.http.protocol.RequestConnControl; import org.apache.http.protocol.RequestContent; import org.apache.http.protocol.RequestExpectContinue; import org.apache.http.protocol.RequestUserAgent; import com.netifera.platform.util.locators.TCPSocketLocator; public class HTTPClient { public static final String DEFAULT_USER_AGENT = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"; final private TCPSocketLocator locator; final private DefaultHttpClientConnection connection = new DefaultHttpClientConnection(); // final private ConnectionReuseStrategy connectionStrategy = new DefaultConnectionReuseStrategy(); public HTTPClient(TCPSocketLocator locator) { this.locator = locator; } public void close() { try { connection.close(); } catch (IOException e) { } } public HttpResponse execute(HttpRequest request) throws IOException, HttpException { HttpParams params = new BasicHttpParams(); // FIXME should be HTTP/1.0, must test HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); HttpProtocolParams.setUserAgent(params, DEFAULT_USER_AGENT); HttpProtocolParams.setUseExpectContinue(params, true); BasicHttpProcessor processor = new BasicHttpProcessor(); // Required protocol interceptors processor.addInterceptor(new RequestContent()); // processor.addInterceptor(new RequestTargetHost()); // Recommended protocol interceptors processor.addInterceptor(new RequestConnControl()); processor.addInterceptor(new RequestUserAgent()); processor.addInterceptor(new RequestExpectContinue()); HttpRequestExecutor executor = new HttpRequestExecutor(); HttpContext context = new BasicHttpContext(null); context.setAttribute(ExecutionContext.HTTP_CONNECTION, connection); if (!connection.isOpen()) { Socket socket = new Socket(locator.getAddress().toInetAddress(), locator.getPort()); connection.bind(socket, params); } // System.out.println(">> Request URI: " // + request.getRequestLine().getUri()); context.setAttribute(ExecutionContext.HTTP_REQUEST, request); request.setParams(params); executor.preProcess(request, processor, context); HttpResponse response = executor.execute(request, connection, context); executor.postProcess(response, processor, context); // System.out.println("<< Response: " + response.getStatusLine()); // System.out.println(EntityUtils.toString(response.getEntity())); // System.out.println("=============="); /* if (!connectionStrategy.keepAlive(response, context)) { connection.close(); } else { System.out.println("Connection kept alive..."); } */ return response; } public HttpResponse GET(URI url) throws IOException, HttpException { HttpRequest request = new BasicHttpRequest("GET", url.getRawPath()+"?"+url.getRawQuery()); // copied from firefox request.addHeader("Host", url.getPort() == 0 || url.getPort() == 80 ? url.getHost() : url.getHost()+":"+url.getPort()); request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.addHeader("Accept-Language", "en-us,en;q=0.5"); // request.addHeader("Accept-Encoding", "gzip,deflate"); // request.addHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); // request.addHeader("Keep-Alive", "300"); // request.addHeader("Connection", "keep-alive"); return execute(request); } }