package com.limegroup.gnutella.uploader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import com.limegroup.gnutella.Constants; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.RouterService; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.util.CommonUtils; /** * An implementaiton of the UploadState interface * when the request is to browse the host * @author Anurag Singla */ public final class BrowseHostUploadState extends UploadState { private final ByteArrayOutputStream BAOS = new ByteArrayOutputStream(); public BrowseHostUploadState(HTTPUploader uploader) { super(uploader); } public void writeMessageHeaders(OutputStream ostream) throws IOException { //GUARD CLAUSE // we can only handle query replies, so reply back with a 406 if they // don't accept them... if(!UPLOADER.getClientAcceptsXGnutellaQueryreplies()) { // send back a 406... String str = "HTTP/1.1 406 Not Acceptable\r\n\r\n"; ostream.write(str.getBytes()); ostream.flush(); debug("BHUS.doUpload(): client does not accept QRs."); return; } //create a new indexing query QueryRequest indexingQuery = QueryRequest.createBrowseHostQuery(); //get responses from file manager Response[] responses = RouterService.getFileManager().query(indexingQuery); if (responses == null) // we aren't sharing any files.... responses = new Response[0]; //convert to QueryReplies Iterator /*<QueryReply>*/ iterator = RouterService.getMessageRouter().responsesToQueryReplies(responses, indexingQuery); try { while(iterator.hasNext()) { QueryReply queryReply = (QueryReply)iterator.next(); queryReply.write(BAOS); } } catch (IOException e) { // if there is an error, do nothing.. } String str; str = "HTTP/1.1 200 OK\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()); writeProxies(ostream); str = "\r\n"; ostream.write(str.getBytes()); } public void writeMessageBody(OutputStream ostream) throws IOException { ostream.write(BAOS.toByteArray()); UPLOADER.setAmountUploaded(BAOS.size()); debug("BHUS.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(); } }