michael@0: /* michael@0: * Test Chunked-Encoded response parsing. michael@0: */ michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test infrastructure michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: XPCOMUtils.defineLazyGetter(this, "URL", function() { michael@0: return "http://localhost:" + httpserver.identity.primaryPort; michael@0: }); michael@0: michael@0: var httpserver = new HttpServer(); michael@0: var index = 0; michael@0: var test_flags = new Array(); michael@0: var testPathBase = "/chunked_hdrs"; michael@0: michael@0: function run_test() michael@0: { michael@0: httpserver.start(-1); michael@0: michael@0: do_test_pending(); michael@0: run_test_number(1); michael@0: } michael@0: michael@0: function run_test_number(num) michael@0: { michael@0: testPath = testPathBase + num; michael@0: httpserver.registerPathHandler(testPath, eval("handler" + num)); michael@0: michael@0: var channel = setupChannel(testPath); michael@0: flags = test_flags[num]; // OK if flags undefined for test michael@0: channel.asyncOpen(new ChannelListener(eval("completeTest" + num), michael@0: channel, flags), null); michael@0: } michael@0: michael@0: function setupChannel(url) michael@0: { michael@0: var ios = Components.classes["@mozilla.org/network/io-service;1"]. michael@0: getService(Ci.nsIIOService); michael@0: var chan = ios.newChannel(URL + url, "", null); michael@0: var httpChan = chan.QueryInterface(Components.interfaces.nsIHttpChannel); michael@0: return httpChan; michael@0: } michael@0: michael@0: function endTests() michael@0: { michael@0: httpserver.stop(do_test_finished); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 1: FAIL because of overflowed chunked size. The parser uses long so michael@0: // the test case uses >64bit to fail on all platforms. michael@0: test_flags[1] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; michael@0: michael@0: function handler1(metadata, response) michael@0: { michael@0: var body = "12345678123456789\r\ndata never reached"; michael@0: michael@0: response.seizePower(); michael@0: response.write("HTTP/1.1 200 OK\r\n"); michael@0: response.write("Content-Type: text/plain\r\n"); michael@0: response.write("Transfer-Encoding: chunked\r\n"); michael@0: response.write("\r\n"); michael@0: response.write(body); michael@0: response.finish(); michael@0: } michael@0: michael@0: function completeTest1(request, data, ctx) michael@0: { michael@0: do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); michael@0: michael@0: run_test_number(2); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 2: FAIL because of non-hex in chunked length michael@0: michael@0: test_flags[2] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; michael@0: michael@0: function handler2(metadata, response) michael@0: { michael@0: var body = "junkintheway 123\r\ndata never reached"; michael@0: michael@0: response.seizePower(); michael@0: response.write("HTTP/1.1 200 OK\r\n"); michael@0: response.write("Content-Type: text/plain\r\n"); michael@0: response.write("Transfer-Encoding: chunked\r\n"); michael@0: response.write("\r\n"); michael@0: response.write(body); michael@0: response.finish(); michael@0: } michael@0: michael@0: function completeTest2(request, data, ctx) michael@0: { michael@0: do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); michael@0: run_test_number(3); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 3: OK in spite of non-hex digits after size in the length field michael@0: michael@0: test_flags[3] = CL_ALLOW_UNKNOWN_CL; michael@0: michael@0: function handler3(metadata, response) michael@0: { michael@0: var body = "c junkafter\r\ndata reached"; michael@0: michael@0: response.seizePower(); michael@0: response.write("HTTP/1.1 200 OK\r\n"); michael@0: response.write("Content-Type: text/plain\r\n"); michael@0: response.write("Transfer-Encoding: chunked\r\n"); michael@0: response.write("\r\n"); michael@0: response.write(body); michael@0: response.finish(); michael@0: } michael@0: michael@0: function completeTest3(request, data, ctx) michael@0: { michael@0: do_check_eq(request.status, 0); michael@0: run_test_number(4); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 4: Verify a fully compliant chunked response. michael@0: michael@0: test_flags[4] = CL_ALLOW_UNKNOWN_CL; michael@0: michael@0: function handler4(metadata, response) michael@0: { michael@0: var body = "c\r\ndata reached\r\n\0\r\n\r\n"; michael@0: michael@0: response.seizePower(); michael@0: response.write("HTTP/1.1 200 OK\r\n"); michael@0: response.write("Content-Type: text/plain\r\n"); michael@0: response.write("Transfer-Encoding: chunked\r\n"); michael@0: response.write("\r\n"); michael@0: response.write(body); michael@0: response.finish(); michael@0: } michael@0: michael@0: function completeTest4(request, data, ctx) michael@0: { michael@0: do_check_eq(request.status, 0); michael@0: run_test_number(5); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // Test 5: A chunk size larger than 32 bit but smaller than 64bit also fails michael@0: // This is probabaly subject to get improved at some point. michael@0: michael@0: test_flags[5] = CL_EXPECT_LATE_FAILURE|CL_ALLOW_UNKNOWN_CL; michael@0: michael@0: function handler5(metadata, response) michael@0: { michael@0: var body = "123456781\r\ndata never reached"; michael@0: michael@0: response.seizePower(); michael@0: response.write("HTTP/1.1 200 OK\r\n"); michael@0: response.write("Content-Type: text/plain\r\n"); michael@0: response.write("Transfer-Encoding: chunked\r\n"); michael@0: response.write("\r\n"); michael@0: response.write(body); michael@0: response.finish(); michael@0: } michael@0: michael@0: function completeTest5(request, data, ctx) michael@0: { michael@0: do_check_eq(request.status, Components.results.NS_ERROR_UNEXPECTED); michael@0: endTests(); michael@0: // run_test_number(6); michael@0: }