blob: ec656fefb506e5611e7327e5fedfdd4f990e9856 [file] [log] [blame]
/**
* 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();
}
}