I've had no response to my last on this subject.
I know we're all busy, but this one does seem to be pretty
fundamental, and I did go to a bunch of trouble to write the testcase
to show the problem ;-)
I'd value some feedback -
Am I completely wrong in thinking that this is a problem?
Is there some issue in the way that I reported it?
Duncan McGregor
Begin forwarded message:
From: Duncan McGregor <[EMAIL PROTECTED]>
Date: 6 April 2006 00:39:57 BDT
To: dev@tomcat.apache.org
Subject: If-Range bug in DefaultServlet?
Hi
I've been making If-Range requests to Tomcat (5.5.16) and it seems
not to be sending back content when the request and current ETags
don't match.
RFC 2616 section 14.27 says
If the entity tag given in the If-Range header matches the current
entity tag for the entity, then the server SHOULD provide the
specified sub-range of the entity using a 206 (Partial content)
response. If the entity tag does not match, then the server SHOULD
return the entire entity using a 200 (OK) response.
Am I doing something wrong, or is the servlet behaviour not as it
SHOULD be?
Thanks in anticipation
Duncan McGregor
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import com.enterprisedt.net.ftp.FTPClient;
public class TomcatIfRangeTest extends TestCase {
protected HttpClient httpClient;
protected GetMethod getMethod;
private FTPClient ftpClient;
@Override
public void setUp() throws Exception {
httpClient = new HttpClient();
ftpClient = new FTPClient();
ftpClient.setRemoteHost("localhost");
ftpClient.setControlPort(2122);
ftpClient.connect();
ftpClient.login("user", "user");
}
public void testIfRange() throws Exception {
upload("contents", "delme.txt");
assertEquals(HttpStatus.SC_OK, get("http://localhost:8080/
zirisEdge/public/delme.txt"));
String etag = headerValue("ETag");
assertEquals("contents", responseBody());
assertEquals(HttpStatus.SC_PARTIAL_CONTENT,
get("http://localhost:8080/zirisEdge/public/delme.txt",
"If-Range", etag,
"Range", "bytes=1-3"
));
assertEquals(etag, headerValue("ETag"));
assertEquals("ont", responseBody());
upload("new contents", "delme.txt");
assertEquals(HttpStatus.SC_OK,
get("http://localhost:8080/zirisEdge/public/delme.txt",
"If-Range", etag,
"Range", "bytes=1-3"
));
assertFalse(etag.equals(headerValue("ETag")));
assertEquals("new contents", responseBody());
// FAILS as responseBody is ""
}
protected int get(String url, String...headerValues) throws
HttpException, IOException {
getMethod = new GetMethod(url);
for (int i = 0; i < headerValues.length; i += 2) {
getMethod.addRequestHeader(headerValues[i], headerValues
[i +1]);
}
return httpClient.executeMethod(getMethod);
}
protected String responseBody() throws IOException {
return getMethod.getResponseBodyAsString();
}
protected String headerValue(String headerName) {
Header header = getMethod.getResponseHeader(headerName);
return header != null ? header.getValue() : null;
}
protected void upload(String contents, String path) throws
Exception {
ftpClient.put(contents.getBytes(), path);
Thread.sleep(5000); // TODO - is this a cache timeout?
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]