package com.limegroup.gnutella.uploader;
import java.io.IOException;
import java.io.OutputStream;
import com.limegroup.gnutella.IncompleteFileDesc;
import com.limegroup.gnutella.http.HTTPHeaderName;
import com.limegroup.gnutella.http.HTTPUtils;
import com.limegroup.gnutella.util.CommonUtils;
/**
* An implementaiton of the UploadState that sends an error message
* for an unavailable range that has been requested. This is an
* HTTP 416 error.
*/
public class UnavailableRangeUploadState extends UploadState {
/**
* Constant for the amount of time to wait before retrying if we are
* not actively downloading this file. (1 hour)
*
* The value is meant to be used only as a suggestion to when
* newer ranges may be available if we do not have any ranges
* that the downloader may want.
*/
private static final String INACTIVE_RETRY_AFTER = "" + (60 * 60);
/**
* Creates a new <tt>UnavailableRangeUploadState</tt> with the specified
* <tt>FileDesc</tt>.
*
* @param fd the <tt>FileDesc</tt> for the upload
*/
public UnavailableRangeUploadState(HTTPUploader uploader) {
super(uploader);
}
public void writeMessageHeaders(OutputStream ostream) throws IOException {
String str;
str = "HTTP/1.1 416 Requested Range Unavailable\r\n";
ostream.write(str.getBytes());
str = "Server: " + CommonUtils.getHttpServer() + "\r\n";
ostream.write(str.getBytes());
str = "Content-Type: text/plain\r\n";
ostream.write(str.getBytes());
str = "Content-Length: 0\r\n";
ostream.write(str.getBytes());
writeAlts(ostream);
writeRanges(ostream);
writeProxies(ostream);
if (FILE_DESC!=null && FILE_DESC instanceof IncompleteFileDesc) {
IncompleteFileDesc ifd = (IncompleteFileDesc)FILE_DESC;
if(!ifd.isActivelyDownloading()) {
HTTPUtils.writeHeader(HTTPHeaderName.RETRY_AFTER,
INACTIVE_RETRY_AFTER,
ostream);
}
}
str = "\r\n";
ostream.write(str.getBytes());
}
public void writeMessageBody(OutputStream ostream) throws IOException {
// no message, do nothing.
}
public boolean getCloseConnection() {
return false;
}
}