/** * Copyright (c) 2006 Parity Communications, Inc. * 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: * Sergey Yakovlev - initial API and implementation */ package org.eclipse.ecf.internal.provider.rss.http; import java.io.IOException; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.util.Map; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.core.util.Trace; import org.eclipse.ecf.internal.provider.rss.RssDebugOptions; import org.eclipse.ecf.internal.provider.rss.RssPlugin; import org.eclipse.ecf.provider.comm.IConnectionListener; import org.eclipse.ecf.provider.comm.ISynchAsynchConnection; import org.eclipse.ecf.provider.comm.ISynchAsynchEventHandler; /** * A ISynchAsynchConnection with support for HTTP-specific features. See the <a * href='http://www.w3.org/pub/WWW/Protocols/'>spec</a> for details. * * */ public class HttpClient implements ISynchAsynchConnection { private static final String PRODUCT_NAME = "ECF RSS Client/0.0.1"; protected static final int DEFAULT_PORT = 80; protected Socket socket; protected ISynchAsynchEventHandler handler; protected boolean started = false; /** * The constructors * @param handler */ public HttpClient(ISynchAsynchEventHandler handler) { if (handler == null) { throw new NullPointerException("Event handler cannot be null"); } this.handler = handler; } protected void trace(String msg) { Trace.trace(RssPlugin.PLUGIN_ID, RssDebugOptions.DEBUG, msg); } protected void dumpStack(String msg, Throwable e) { Trace.catching(RssPlugin.PLUGIN_ID, RssDebugOptions.EXCEPTIONS_CATCHING, this.getClass(), "", e); } private URL getURL(String path) throws MalformedURLException { if (socket != null) { return new URL("http", socket.getInetAddress().getHostName(), socket.getPort(), path); } return null; } public Object connect(ID remote, Object data, int timeout) throws ECFException { try { trace("connect(" + remote + "," + data + "," + timeout + ")"); if (socket != null) { throw new ECFException("Already connected to " + getURL(null)); } final URL url = new URL(remote.getName()); /* * // Get socket factory and create/connect socket SocketFactory fact = * SocketFactory.getSocketFactory(); if(fact == null) { fact = * SocketFactory.getDefaultSocketFactory(); } */ final int port = url.getPort() != -1 ? url.getPort() : DEFAULT_PORT; // socket = fact.createSocket(url.getHost(), port, timeout); socket = new Socket(url.getHost(), port); } catch (final IOException e) { throw new ECFException(e); } return null; } public void disconnect() { trace("disconnect()"); if (socket != null) { try { socket.close(); } catch (final IOException e) { // ignored as we are releasing it anyway } socket = null; } } public boolean isConnected() { if (socket != null) { return socket.isConnected(); } return false; } public ID getLocalID() { if (handler != null) { return handler.getEventHandlerID(); } if (socket == null) { return null; } ID retID = null; try { retID = IDFactory.getDefault().createStringID(getURL(null).toString()); } catch (final Exception e) { dumpStack("Exception in getLocalID()", e); return null; } return retID; } public void start() { trace("start()"); started = true; } public void stop() { trace("stop()"); started = false; } public boolean isStarted() { return started; } public Map getProperties() { return null; } public void addListener(IConnectionListener listener) { // TODO Auto-generated method stub } public void removeListener(IConnectionListener listener) { // TODO Auto-generated method stub } public Object getAdapter(Class clazz) { return null; } public void sendAsynch(ID receiver, byte[] data) throws IOException { // TODO Auto-generated method stub } public Object sendSynch(ID receiver, byte[] data) throws IOException { trace("sendSynch(" + receiver + ", " + data + ")"); // data should be a string final HttpRequest request = new HttpRequest("GET", getURL(new String(data))); request.setHeader("User-Agent", PRODUCT_NAME); request.setHeader("Accept", "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"); request.setHeader("Connection", "keep-alive"); request.writeToStream(request.getStartLine(), socket.getOutputStream()); final HttpResponse response = new HttpResponse(socket.getInputStream()); return response.getBody(); } }