gecko/netwerk/test/unit/test_resumable_channel.js

385 lines
14 KiB
JavaScript
Raw Normal View History

/* Tests various aspects of nsIResumableChannel in combination with HTTP */
bug 482085 - fix all xpcshell tests to not reference files from the srcdir. r=bsmedberg,waldo --HG-- rename : toolkit/components/downloads/test/downloads.empty.sqlite => browser/components/privatebrowsing/test/unit/downloads.empty.sqlite rename : dom/src/json/test/fail1.json => dom/src/json/test/unit/fail1.json rename : dom/src/json/test/fail10.json => dom/src/json/test/unit/fail10.json rename : dom/src/json/test/fail11.json => dom/src/json/test/unit/fail11.json rename : dom/src/json/test/fail12.json => dom/src/json/test/unit/fail12.json rename : dom/src/json/test/fail13.json => dom/src/json/test/unit/fail13.json rename : dom/src/json/test/fail14.json => dom/src/json/test/unit/fail14.json rename : dom/src/json/test/fail15.json => dom/src/json/test/unit/fail15.json rename : dom/src/json/test/fail16.json => dom/src/json/test/unit/fail16.json rename : dom/src/json/test/fail17.json => dom/src/json/test/unit/fail17.json rename : dom/src/json/test/fail18.json => dom/src/json/test/unit/fail18.json rename : dom/src/json/test/fail19.json => dom/src/json/test/unit/fail19.json rename : dom/src/json/test/fail2.json => dom/src/json/test/unit/fail2.json rename : dom/src/json/test/fail20.json => dom/src/json/test/unit/fail20.json rename : dom/src/json/test/fail21.json => dom/src/json/test/unit/fail21.json rename : dom/src/json/test/fail22.json => dom/src/json/test/unit/fail22.json rename : dom/src/json/test/fail23.json => dom/src/json/test/unit/fail23.json rename : dom/src/json/test/fail24.json => dom/src/json/test/unit/fail24.json rename : dom/src/json/test/fail25.json => dom/src/json/test/unit/fail25.json rename : dom/src/json/test/fail26.json => dom/src/json/test/unit/fail26.json rename : dom/src/json/test/fail27.json => dom/src/json/test/unit/fail27.json rename : dom/src/json/test/fail28.json => dom/src/json/test/unit/fail28.json rename : dom/src/json/test/fail29.json => dom/src/json/test/unit/fail29.json rename : dom/src/json/test/fail3.json => dom/src/json/test/unit/fail3.json rename : dom/src/json/test/fail30.json => dom/src/json/test/unit/fail30.json rename : dom/src/json/test/fail31.json => dom/src/json/test/unit/fail31.json rename : dom/src/json/test/fail32.json => dom/src/json/test/unit/fail32.json rename : dom/src/json/test/fail33.json => dom/src/json/test/unit/fail33.json rename : dom/src/json/test/fail34.json => dom/src/json/test/unit/fail34.json rename : dom/src/json/test/fail4.json => dom/src/json/test/unit/fail4.json rename : dom/src/json/test/fail5.json => dom/src/json/test/unit/fail5.json rename : dom/src/json/test/fail6.json => dom/src/json/test/unit/fail6.json rename : dom/src/json/test/fail7.json => dom/src/json/test/unit/fail7.json rename : dom/src/json/test/fail8.json => dom/src/json/test/unit/fail8.json rename : dom/src/json/test/fail9.json => dom/src/json/test/unit/fail9.json rename : dom/src/json/test/json2.js => dom/src/json/test/unit/json2.js rename : dom/src/json/test/pass1.json => dom/src/json/test/unit/pass1.json rename : dom/src/json/test/pass3.json => dom/src/json/test/unit/pass3.json rename : testing/xpcshell/example/location_load.js => testing/xpcshell/example/unit/location_load.js rename : toolkit/components/commandlines/test/unit/unix/test_bug410156.js => toolkit/components/commandlines/test/unit_unix/test_bug410156.js rename : toolkit/components/commandlines/test/unit/win/test_bug410156.js => toolkit/components/commandlines/test/unit_win/test_bug410156.js rename : toolkit/mozapps/extensions/test/unit/addons/test_bug257155/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug257155/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_a_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_a_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_a_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_a_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_b_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_b_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_b_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_b_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_c_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_c_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_c_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_c_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_d_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_d_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_d_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_d_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_e_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_e_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_e_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_e_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_f_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_f_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_f_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_f_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_g_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_g_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug299716_g_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug299716_g_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_3/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_3/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_4/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_4/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_5/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_5/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_6/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_6/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_7/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_7/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_8/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_8/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug324121_9/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug324121_9/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug335238_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug335238_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug335238_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug335238_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_10/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_10/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_11/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_11/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_12/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_12/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_13/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_13/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_3/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_3/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_4/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_4/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_5/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_5/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_6/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_6/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_7/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_7/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_8/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_8/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug378216_9/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug378216_9/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug394300_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug394300_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug394300_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug394300_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_a_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_a_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_a_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_a_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_b_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_b_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_b_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_b_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_c_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_c_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_c_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_c_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_d_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_d_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug396129_d_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug396129_d_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug397778/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug397778/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug425657/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug425657/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_1/README => toolkit/mozapps/extensions/test/addons/test_bug428341_1/README rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_3/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_3/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_4/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_4/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_5/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_5/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_6/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_6/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_7/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_7/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_8/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_8/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug428341_9/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug428341_9/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug436207/install.js => toolkit/mozapps/extensions/test/addons/test_bug436207/install.js rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_1/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_1/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_2/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_2/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_3/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_3/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_4/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_4/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_5/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_5/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_6/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_6/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_7/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_7/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_8/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_8/install.rdf rename : toolkit/mozapps/extensions/test/unit/addons/test_bug463819_9/install.rdf => toolkit/mozapps/extensions/test/addons/test_bug463819_9/install.rdf
2009-03-21 08:20:00 -07:00
do_load_httpd_js();
var httpserver = null;
const NS_ERROR_ENTITY_CHANGED = 0x804b0020;
const NS_ERROR_NOT_RESUMABLE = 0x804b0019;
const rangeBody = "Body of the range request handler.\r\n";
function make_channel(url, callback, ctx) {
var ios = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
return ios.newChannel(url, "", null);
}
function AuthPrompt2() {
}
AuthPrompt2.prototype = {
user: "guest",
pass: "guest",
QueryInterface: function authprompt2_qi(iid) {
if (iid.equals(Components.interfaces.nsISupports) ||
iid.equals(Components.interfaces.nsIAuthPrompt2))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
promptAuth:
function ap2_promptAuth(channel, level, authInfo)
{
authInfo.username = this.user;
authInfo.password = this.pass;
return true;
},
asyncPromptAuth: function ap2_async(chan, cb, ctx, lvl, info) {
throw 0x80004001;
}
};
function Requestor() {
}
Requestor.prototype = {
QueryInterface: function requestor_qi(iid) {
if (iid.equals(Components.interfaces.nsISupports) ||
iid.equals(Components.interfaces.nsIInterfaceRequestor))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
getInterface: function requestor_gi(iid) {
if (iid.equals(Components.interfaces.nsIAuthPrompt2)) {
// Allow the prompt to store state by caching it here
if (!this.prompt2)
this.prompt2 = new AuthPrompt2();
return this.prompt2;
}
throw Components.results.NS_ERROR_NO_INTERFACE;
},
prompt2: null
};
function run_test() {
dump("*** run_test\n");
httpserver = new nsHttpServer();
httpserver.registerPathHandler("/auth", authHandler);
httpserver.registerPathHandler("/range", rangeHandler);
httpserver.registerPathHandler("/acceptranges", acceptRangesHandler);
2007-08-30 16:00:38 -07:00
httpserver.registerPathHandler("/redir", redirHandler);
var entityID;
function get_entity_id(request, data, ctx) {
dump("*** get_entity_id()\n");
do_check_true(request instanceof Ci.nsIResumableChannel,
"must be a resumable channel");
entityID = request.entityID;
dump("*** entity id = " + entityID + "\n");
// Try a non-resumable URL (responds with 200)
var chan = make_channel("http://localhost:4444/");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.asyncOpen(new ChannelListener(try_resume, null, CL_EXPECT_FAILURE), null);
}
function try_resume(request, data, ctx) {
dump("*** try_resume()\n");
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
// Try a successful resume
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.asyncOpen(new ChannelListener(try_resume_zero, null), null);
}
function try_resume_zero(request, data, ctx) {
dump("*** try_resume_zero()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody.substring(1));
// Try a server which doesn't support range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "none", false);
chan.asyncOpen(new ChannelListener(try_no_range, null, CL_EXPECT_FAILURE), null);
}
function try_no_range(request, data, ctx) {
dump("*** try_no_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
// Try a server which supports "bytes" range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "bytes", false);
chan.asyncOpen(new ChannelListener(try_bytes_range, null), null);
}
function try_bytes_range(request, data, ctx) {
dump("*** try_bytes_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody);
// Try a server which supports "foo" and "bar" range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "foo, bar", false);
chan.asyncOpen(new ChannelListener(try_foo_bar_range, null, CL_EXPECT_FAILURE), null);
}
function try_foo_bar_range(request, data, ctx) {
dump("*** try_foo_bar_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
// Try a server which supports "foobar" range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "foobar", false);
chan.asyncOpen(new ChannelListener(try_foobar_range, null, CL_EXPECT_FAILURE), null);
}
function try_foobar_range(request, data, ctx) {
dump("*** try_foobar_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
// Try a server which supports "bytes" and "foobar" range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "bytes, foobar", false);
chan.asyncOpen(new ChannelListener(try_bytes_foobar_range, null), null);
}
function try_bytes_foobar_range(request, data, ctx) {
dump("*** try_bytes_foobar_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody);
// Try a server which supports "bytesfoo" and "bar" range requests
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Range-Type", "bytesfoo, bar", false);
chan.asyncOpen(new ChannelListener(try_bytesfoo_bar_range, null, CL_EXPECT_FAILURE), null);
}
function try_bytesfoo_bar_range(request, data, ctx) {
dump("*** try_bytesfoo_bar_range()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
// Try a server which doesn't send Accept-Ranges header at all
var chan = make_channel("http://localhost:4444/acceptranges");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.asyncOpen(new ChannelListener(try_no_accept_ranges, null), null);
}
function try_no_accept_ranges(request, data, ctx) {
dump("*** try_no_accept_ranges()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody);
// Try a successful resume from 0
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(0, entityID);
chan.asyncOpen(new ChannelListener(success, null), null);
}
function success(request, data, ctx) {
dump("*** success()\n");
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody);
// Authentication (no password; working resume)
// (should not give us any data)
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Need-Auth", "true", false);
chan.asyncOpen(new ChannelListener(test_auth_nopw, null, CL_EXPECT_FAILURE), null);
}
function test_auth_nopw(request, data, ctx) {
dump("*** test_auth_nopw()\n");
do_check_false(request.nsIHttpChannel.requestSucceeded);
do_check_eq(request.status, NS_ERROR_ENTITY_CHANGED);
// Authentication + not working resume
var chan = make_channel("http://localhost:4444/auth");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.notificationCallbacks = new Requestor();
chan.asyncOpen(new ChannelListener(test_auth, null, CL_EXPECT_FAILURE), null);
}
function test_auth(request, data, ctx) {
dump("*** test_auth()\n");
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
do_check_true(request.nsIHttpChannel.responseStatus < 300);
// Authentication + working resume
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.notificationCallbacks = new Requestor();
chan.nsIHttpChannel.setRequestHeader("X-Need-Auth", "true", false);
chan.asyncOpen(new ChannelListener(test_auth_resume, null), null);
}
function test_auth_resume(request, data, ctx) {
dump("*** test_auth_resume()\n");
do_check_eq(data, rangeBody.substring(1));
do_check_true(request.nsIHttpChannel.requestSucceeded);
// 404 page (same content length as real content)
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.nsIHttpChannel.setRequestHeader("X-Want-404", "true", false);
chan.asyncOpen(new ChannelListener(test_404, null, CL_EXPECT_FAILURE), null);
}
function test_404(request, data, ctx) {
dump("*** test_404()\n");
do_check_eq(request.status, NS_ERROR_ENTITY_CHANGED);
2007-08-30 16:00:38 -07:00
do_check_eq(request.nsIHttpChannel.responseStatus, 404);
// 416 Requested Range Not Satisfiable
var chan = make_channel("http://localhost:4444/range");
chan.nsIResumableChannel.resumeAt(1000, entityID);
chan.asyncOpen(new ChannelListener(test_416, null, CL_EXPECT_FAILURE), null);
}
function test_416(request, data, ctx) {
dump("*** test_416()\n");
2007-08-30 16:00:38 -07:00
do_check_eq(request.status, NS_ERROR_ENTITY_CHANGED);
do_check_eq(request.nsIHttpChannel.responseStatus, 416);
// Redirect + successful resume
var chan = make_channel("http://localhost:4444/redir");
chan.nsIHttpChannel.setRequestHeader("X-Redir-To", "http://localhost:4444/range", false);
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.asyncOpen(new ChannelListener(test_redir_resume, null), null);
}
function test_redir_resume(request, data, ctx) {
dump("*** test_redir_resume()\n");
2007-08-30 16:00:38 -07:00
do_check_true(request.nsIHttpChannel.requestSucceeded);
do_check_eq(data, rangeBody.substring(1));
do_check_eq(request.nsIHttpChannel.responseStatus, 206);
// Redirect + failed resume
var chan = make_channel("http://localhost:4444/redir");
chan.nsIHttpChannel.setRequestHeader("X-Redir-To", "http://localhost:4444/", false);
chan.nsIResumableChannel.resumeAt(1, entityID);
chan.asyncOpen(new ChannelListener(test_redir_noresume, null, CL_EXPECT_FAILURE), null);
}
function test_redir_noresume(request, data, ctx) {
dump("*** test_redir_noresume()\n");
2007-08-30 16:00:38 -07:00
do_check_eq(request.status, NS_ERROR_NOT_RESUMABLE);
httpserver.stop(do_test_finished);
}
httpserver.start(4444);
var chan = make_channel("http://localhost:4444/range");
chan.asyncOpen(new ChannelListener(get_entity_id, null), null);
do_test_pending();
}
// HANDLERS
function handleAuth(metadata, response) {
// btoa("guest:guest"), but that function is not available here
var expectedHeader = "Basic Z3Vlc3Q6Z3Vlc3Q=";
var body;
if (metadata.hasHeader("Authorization") &&
metadata.getHeader("Authorization") == expectedHeader)
{
response.setStatusLine(metadata.httpVersion, 200, "OK, authorized");
response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false);
return true;
}
else
{
// didn't know guest:guest, failure
response.setStatusLine(metadata.httpVersion, 401, "Unauthorized");
response.setHeader("WWW-Authenticate", 'Basic realm="secret"', false);
return false;
}
}
// /auth
function authHandler(metadata, response) {
response.setHeader("Content-Type", "text/html", false);
var body = handleAuth(metadata, response) ? "success" : "failure";
response.bodyOutputStream.write(body, body.length);
}
// /range
function rangeHandler(metadata, response) {
response.setHeader("Content-Type", "text/html", false);
if (metadata.hasHeader("X-Need-Auth")) {
if (!handleAuth(metadata, response)) {
body = "auth failed";
response.bodyOutputStream.write(body, body.length);
return;
}
}
if (metadata.hasHeader("X-Want-404")) {
response.setStatusLine(metadata.httpVersion, 404, "Not Found");
body = rangeBody;
response.bodyOutputStream.write(body, body.length);
return;
}
var body = rangeBody;
if (metadata.hasHeader("Range")) {
// Syntax: bytes=[from]-[to] (we don't support multiple ranges)
var matches = metadata.getHeader("Range").match(/^\s*bytes=(\d+)?-(\d+)?\s*$/);
var from = (matches[1] === undefined) ? 0 : matches[1];
var to = (matches[2] === undefined) ? rangeBody.length - 1 : matches[2];
if (from >= rangeBody.length) {
response.setStatusLine(metadata.httpVersion, 416, "Start pos too high");
response.setHeader("Content-Range", "*/" + rangeBody.length, false);
return;
}
body = body.substring(from, to + 1);
// always respond to successful range requests with 206
response.setStatusLine(metadata.httpVersion, 206, "Partial Content");
response.setHeader("Content-Range", from + "-" + to + "/" + rangeBody.length, false);
}
response.bodyOutputStream.write(body, body.length);
}
// /acceptranges
function acceptRangesHandler(metadata, response) {
response.setHeader("Content-Type", "text/html", false);
if (metadata.hasHeader("X-Range-Type"))
response.setHeader("Accept-Ranges", metadata.getHeader("X-Range-Type"), false);
response.bodyOutputStream.write(rangeBody, rangeBody.length);
}
2007-08-30 16:00:38 -07:00
// /redir
function redirHandler(metadata, response) {
response.setStatusLine(metadata.httpVersion, 302, "Found");
response.setHeader("Content-Type", "text/html", false);
response.setHeader("Location", metadata.getHeader("X-Redir-To"), false);
2007-08-30 16:00:38 -07:00
var body = "redirect\r\n";
response.bodyOutputStream.write(body, body.length);
}