|
1 // |
|
2 // HTTP headers test |
|
3 // |
|
4 |
|
5 // Note: sets Cc and Ci variables |
|
6 |
|
7 Cu.import("resource://testing-common/httpd.js"); |
|
8 |
|
9 XPCOMUtils.defineLazyGetter(this, "URL", function() { |
|
10 return "http://localhost:" + httpserver.identity.primaryPort; |
|
11 }); |
|
12 |
|
13 var httpserver = new HttpServer(); |
|
14 var testpath = "/simple"; |
|
15 var httpbody = "0123456789"; |
|
16 var channel; |
|
17 var ios; |
|
18 |
|
19 var dbg=0 |
|
20 if (dbg) { print("============== START =========="); } |
|
21 |
|
22 function run_test() { |
|
23 setup_test(); |
|
24 do_test_pending(); |
|
25 } |
|
26 |
|
27 function setup_test() { |
|
28 if (dbg) { print("============== setup_test: in"); } |
|
29 |
|
30 httpserver.registerPathHandler(testpath, serverHandler); |
|
31 httpserver.start(-1); |
|
32 |
|
33 channel = setupChannel(testpath); |
|
34 |
|
35 channel.setRequestHeader("ReplaceMe", "initial value", true); |
|
36 var setOK = channel.getRequestHeader("ReplaceMe"); |
|
37 do_check_eq(setOK, "initial value"); |
|
38 channel.setRequestHeader("ReplaceMe", "replaced", false); |
|
39 setOK = channel.getRequestHeader("ReplaceMe"); |
|
40 do_check_eq(setOK, "replaced"); |
|
41 |
|
42 channel.setRequestHeader("MergeMe", "foo1", true); |
|
43 channel.setRequestHeader("MergeMe", "foo2", true); |
|
44 channel.setRequestHeader("MergeMe", "foo3", true); |
|
45 setOK = channel.getRequestHeader("MergeMe"); |
|
46 do_check_eq(setOK, "foo1, foo2, foo3"); |
|
47 |
|
48 var uri = ios.newURI("http://foo1.invalid:80", null, null); |
|
49 channel.referrer = uri; |
|
50 do_check_true(channel.referrer.equals(uri)); |
|
51 setOK = channel.getRequestHeader("Referer"); |
|
52 do_check_eq(setOK, "http://foo1.invalid/"); |
|
53 |
|
54 uri = ios.newURI("http://foo2.invalid:90/bar", null, null); |
|
55 channel.referrer = uri; |
|
56 setOK = channel.getRequestHeader("Referer"); |
|
57 do_check_eq(setOK, "http://foo2.invalid:90/bar"); |
|
58 |
|
59 // ChannelListener defined in head_channels.js |
|
60 channel.asyncOpen(new ChannelListener(checkRequestResponse, channel), null); |
|
61 |
|
62 if (dbg) { print("============== setup_test: out"); } |
|
63 } |
|
64 |
|
65 function setupChannel(path) { |
|
66 ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); |
|
67 var chan = ios.newChannel(URL + path, "", null); |
|
68 chan.QueryInterface(Ci.nsIHttpChannel); |
|
69 chan.requestMethod = "GET"; |
|
70 return chan; |
|
71 } |
|
72 |
|
73 function serverHandler(metadata, response) { |
|
74 if (dbg) { print("============== serverHandler: in"); } |
|
75 |
|
76 var setOK = metadata.getHeader("ReplaceMe"); |
|
77 do_check_eq(setOK, "replaced"); |
|
78 setOK = metadata.getHeader("MergeMe"); |
|
79 do_check_eq(setOK, "foo1, foo2, foo3"); |
|
80 setOK = metadata.getHeader("Referer"); |
|
81 do_check_eq(setOK, "http://foo2.invalid:90/bar"); |
|
82 |
|
83 response.setHeader("Content-Type", "text/plain", false); |
|
84 response.setStatusLine("1.1", 200, "OK"); |
|
85 |
|
86 // note: httpd.js' "Response" class uses ',' (no space) for merge. |
|
87 response.setHeader("httpdMerge", "bar1", false); |
|
88 response.setHeader("httpdMerge", "bar2", true); |
|
89 response.setHeader("httpdMerge", "bar3", true); |
|
90 // Some special headers like Proxy-Authenticate merge with \n |
|
91 response.setHeader("Proxy-Authenticate", "line 1", true); |
|
92 response.setHeader("Proxy-Authenticate", "line 2", true); |
|
93 response.setHeader("Proxy-Authenticate", "line 3", true); |
|
94 |
|
95 response.bodyOutputStream.write(httpbody, httpbody.length); |
|
96 |
|
97 if (dbg) { print("============== serverHandler: out"); } |
|
98 } |
|
99 |
|
100 function checkRequestResponse(request, data, context) { |
|
101 if (dbg) { print("============== checkRequestResponse: in"); } |
|
102 |
|
103 do_check_eq(channel.responseStatus, 200); |
|
104 do_check_eq(channel.responseStatusText, "OK"); |
|
105 do_check_true(channel.requestSucceeded); |
|
106 |
|
107 var response = channel.getResponseHeader("httpdMerge"); |
|
108 do_check_eq(response, "bar1,bar2,bar3"); |
|
109 channel.setResponseHeader("httpdMerge", "bar", true); |
|
110 do_check_eq(channel.getResponseHeader("httpdMerge"), "bar1,bar2,bar3, bar"); |
|
111 |
|
112 response = channel.getResponseHeader("Proxy-Authenticate"); |
|
113 do_check_eq(response, "line 1\nline 2\nline 3"); |
|
114 |
|
115 channel.contentCharset = "UTF-8"; |
|
116 do_check_eq(channel.contentCharset, "UTF-8"); |
|
117 do_check_eq(channel.contentType, "text/plain"); |
|
118 do_check_eq(channel.contentLength, httpbody.length); |
|
119 do_check_eq(data, httpbody); |
|
120 |
|
121 httpserver.stop(do_test_finished); |
|
122 if (dbg) { print("============== checkRequestResponse: out"); } |
|
123 } |