package com.limegroup.gnutella.uploader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.limegroup.gnutella.Constants;
import com.limegroup.gnutella.GUID;
import com.limegroup.gnutella.RouterService;
import com.limegroup.gnutella.messages.PushRequest;
import com.limegroup.gnutella.statistics.UploadStat;
import com.limegroup.gnutella.util.CommonUtils;
import com.limegroup.gnutella.util.NetworkUtils;
/**
* An implementaiton of the UploadState interface
* when the request is to PushProxy
*/
public final class PushProxyUploadState extends UploadState {
private static final Log LOG = LogFactory.getLog(PushProxyUploadState.class);
public static final String P_SERVER_ID = "ServerId";
public static final String P_GUID = "guid";
public static final String P_FILE = "file";
private final ByteArrayOutputStream BAOS =
new ByteArrayOutputStream();
public PushProxyUploadState(HTTPUploader uploader) {
super(uploader);
LOG.debug("creating push proxy upload state");
}
public void writeMessageHeaders(OutputStream ostream) throws IOException {
LOG.debug("writing headers");
byte[] clientGUID = GUID.fromHexString(UPLOADER.getFileName());
InetAddress hostAddress = UPLOADER.getNodeAddress();
int hostPort = UPLOADER.getNodePort();
if ( clientGUID.length != 16 ||
hostAddress == null ||
!NetworkUtils.isValidPort(hostPort) ||
!NetworkUtils.isValidAddress(hostAddress)) {
// send back a 400
String str = "HTTP/1.1 400 Push Proxy: Bad Request\r\n\r\n";
ostream.write(str.getBytes());
ostream.flush();
debug("PPUS.doUpload(): unknown host.");
UploadStat.PUSH_PROXY_REQ_BAD.incrementStat();
return;
}
Map params = UPLOADER.getParameters();
int fileIndex = 0; // default to 0.
Object index = params.get(P_FILE);
// set the file index if we know it...
if( index != null )
fileIndex = ((Integer)index).intValue();
PushRequest push = new PushRequest(GUID.makeGuid(), (byte) 0,
clientGUID, fileIndex,
hostAddress.getAddress(), hostPort);
try {
RouterService.getMessageRouter().sendPushRequest(push);
}
catch (IOException ioe) {
// send back a 410
String str="HTTP/1.1 410 Push Proxy: Servent not connected\r\n\r\n";
ostream.write(str.getBytes());
ostream.flush();
debug("PPUS.doUpload(): push failed.");
debug(ioe);
UploadStat.PUSH_PROXY_REQ_FAILED.incrementStat();
return;
}
UploadStat.PUSH_PROXY_REQ_SUCCESS.incrementStat();
String str;
str = "HTTP/1.1 202 Push Proxy: Message Sent\r\n";
ostream.write(str.getBytes());
str = "Server: " + CommonUtils.getHttpServer() + "\r\n";
ostream.write(str.getBytes());
str = "Content-Type: " + Constants.QUERYREPLY_MIME_TYPE + "\r\n";
ostream.write(str.getBytes());
str = "Content-Length: " + BAOS.size() + "\r\n";
ostream.write(str.getBytes());
str = "\r\n";
ostream.write(str.getBytes());
}
public void writeMessageBody(OutputStream ostream) throws IOException {
LOG.debug("writing body");
ostream.write(BAOS.toByteArray());
UPLOADER.setAmountUploaded(BAOS.size());
debug("PPUS.doUpload(): returning.");
}
public boolean getCloseConnection() {
return false;
}
private final static boolean debugOn = false;
private final void debug(String out) {
if (debugOn)
System.out.println(out);
}
private final void debug(Exception out) {
if (debugOn)
out.printStackTrace();
}
}