michael@0: // michael@0: // HTTP headers test michael@0: // michael@0: michael@0: // Note: sets Cc and Ci variables 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 testpath = "/simple"; michael@0: var httpbody = "0123456789"; michael@0: var channel; michael@0: var ios; michael@0: michael@0: var dbg=0 michael@0: if (dbg) { print("============== START =========="); } michael@0: michael@0: function run_test() { michael@0: setup_test(); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function setup_test() { michael@0: if (dbg) { print("============== setup_test: in"); } michael@0: michael@0: httpserver.registerPathHandler(testpath, serverHandler); michael@0: httpserver.start(-1); michael@0: michael@0: channel = setupChannel(testpath); michael@0: michael@0: channel.setRequestHeader("ReplaceMe", "initial value", true); michael@0: var setOK = channel.getRequestHeader("ReplaceMe"); michael@0: do_check_eq(setOK, "initial value"); michael@0: channel.setRequestHeader("ReplaceMe", "replaced", false); michael@0: setOK = channel.getRequestHeader("ReplaceMe"); michael@0: do_check_eq(setOK, "replaced"); michael@0: michael@0: channel.setRequestHeader("MergeMe", "foo1", true); michael@0: channel.setRequestHeader("MergeMe", "foo2", true); michael@0: channel.setRequestHeader("MergeMe", "foo3", true); michael@0: setOK = channel.getRequestHeader("MergeMe"); michael@0: do_check_eq(setOK, "foo1, foo2, foo3"); michael@0: michael@0: var uri = ios.newURI("http://foo1.invalid:80", null, null); michael@0: channel.referrer = uri; michael@0: do_check_true(channel.referrer.equals(uri)); michael@0: setOK = channel.getRequestHeader("Referer"); michael@0: do_check_eq(setOK, "http://foo1.invalid/"); michael@0: michael@0: uri = ios.newURI("http://foo2.invalid:90/bar", null, null); michael@0: channel.referrer = uri; michael@0: setOK = channel.getRequestHeader("Referer"); michael@0: do_check_eq(setOK, "http://foo2.invalid:90/bar"); michael@0: michael@0: // ChannelListener defined in head_channels.js michael@0: channel.asyncOpen(new ChannelListener(checkRequestResponse, channel), null); michael@0: michael@0: if (dbg) { print("============== setup_test: out"); } michael@0: } michael@0: michael@0: function setupChannel(path) { michael@0: ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); michael@0: var chan = ios.newChannel(URL + path, "", null); michael@0: chan.QueryInterface(Ci.nsIHttpChannel); michael@0: chan.requestMethod = "GET"; michael@0: return chan; michael@0: } michael@0: michael@0: function serverHandler(metadata, response) { michael@0: if (dbg) { print("============== serverHandler: in"); } michael@0: michael@0: var setOK = metadata.getHeader("ReplaceMe"); michael@0: do_check_eq(setOK, "replaced"); michael@0: setOK = metadata.getHeader("MergeMe"); michael@0: do_check_eq(setOK, "foo1, foo2, foo3"); michael@0: setOK = metadata.getHeader("Referer"); michael@0: do_check_eq(setOK, "http://foo2.invalid:90/bar"); michael@0: michael@0: response.setHeader("Content-Type", "text/plain", false); michael@0: response.setStatusLine("1.1", 200, "OK"); michael@0: michael@0: // note: httpd.js' "Response" class uses ',' (no space) for merge. michael@0: response.setHeader("httpdMerge", "bar1", false); michael@0: response.setHeader("httpdMerge", "bar2", true); michael@0: response.setHeader("httpdMerge", "bar3", true); michael@0: // Some special headers like Proxy-Authenticate merge with \n michael@0: response.setHeader("Proxy-Authenticate", "line 1", true); michael@0: response.setHeader("Proxy-Authenticate", "line 2", true); michael@0: response.setHeader("Proxy-Authenticate", "line 3", true); michael@0: michael@0: response.bodyOutputStream.write(httpbody, httpbody.length); michael@0: michael@0: if (dbg) { print("============== serverHandler: out"); } michael@0: } michael@0: michael@0: function checkRequestResponse(request, data, context) { michael@0: if (dbg) { print("============== checkRequestResponse: in"); } michael@0: michael@0: do_check_eq(channel.responseStatus, 200); michael@0: do_check_eq(channel.responseStatusText, "OK"); michael@0: do_check_true(channel.requestSucceeded); michael@0: michael@0: var response = channel.getResponseHeader("httpdMerge"); michael@0: do_check_eq(response, "bar1,bar2,bar3"); michael@0: channel.setResponseHeader("httpdMerge", "bar", true); michael@0: do_check_eq(channel.getResponseHeader("httpdMerge"), "bar1,bar2,bar3, bar"); michael@0: michael@0: response = channel.getResponseHeader("Proxy-Authenticate"); michael@0: do_check_eq(response, "line 1\nline 2\nline 3"); michael@0: michael@0: channel.contentCharset = "UTF-8"; michael@0: do_check_eq(channel.contentCharset, "UTF-8"); michael@0: do_check_eq(channel.contentType, "text/plain"); michael@0: do_check_eq(channel.contentLength, httpbody.length); michael@0: do_check_eq(data, httpbody); michael@0: michael@0: httpserver.stop(do_test_finished); michael@0: if (dbg) { print("============== checkRequestResponse: out"); } michael@0: }