summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_bug812167.js
blob: 8dc3c89e2b7fe67ac961b376e3d9ba9c36e1e12b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
"use strict";

const { HttpServer } = ChromeUtils.import("resource://testing-common/httpd.js");

/*
- get 302 with Cache-control: no-store
- check cache entry for the 302 response is cached only in memory device
- get 302 with Expires: -1
- check cache entry for the 302 response is not cached at all
*/

var httpserver = null;
// Need to randomize, because apparently no one clears our cache
var randomPath1 = "/redirect-no-store/" + Math.random();

XPCOMUtils.defineLazyGetter(this, "randomURI1", function () {
  return "http://localhost:" + httpserver.identity.primaryPort + randomPath1;
});

var randomPath2 = "/redirect-expires-past/" + Math.random();

XPCOMUtils.defineLazyGetter(this, "randomURI2", function () {
  return "http://localhost:" + httpserver.identity.primaryPort + randomPath2;
});

function make_channel(url, callback, ctx) {
  return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
}

const responseBody = "response body";

var redirectHandler_NoStore_calls = 0;
function redirectHandler_NoStore(metadata, response) {
  response.setStatusLine(metadata.httpVersion, 302, "Found");
  response.setHeader(
    "Location",
    "http://localhost:" + httpserver.identity.primaryPort + "/content",
    false
  );
  response.setHeader("Cache-control", "no-store");
  ++redirectHandler_NoStore_calls;
}

var redirectHandler_ExpiresInPast_calls = 0;
function redirectHandler_ExpiresInPast(metadata, response) {
  response.setStatusLine(metadata.httpVersion, 302, "Found");
  response.setHeader(
    "Location",
    "http://localhost:" + httpserver.identity.primaryPort + "/content",
    false
  );
  response.setHeader("Expires", "-1");
  ++redirectHandler_ExpiresInPast_calls;
}

function contentHandler(metadata, response) {
  response.setHeader("Content-Type", "text/plain");
  response.bodyOutputStream.write(responseBody, responseBody.length);
}

function check_response(
  path,
  request,
  buffer,
  expectedExpiration,
  continuation
) {
  Assert.equal(buffer, responseBody);

  // Entry is always there, old cache wrapping code does session->SetDoomEntriesIfExpired(false),
  // just check it's not persisted or is expired (dep on the test).
  asyncOpenCacheEntry(
    path,
    "disk",
    Ci.nsICacheStorage.OPEN_READONLY,
    null,
    function (status, entry) {
      Assert.equal(status, 0);

      // Expired entry is on disk, no-store entry is in memory
      Assert.equal(entry.persistent, expectedExpiration);

      // Do the request again and check the server handler is called appropriately
      var chan = make_channel(path);
      chan.asyncOpen(
        new ChannelListener(function (request, buffer) {
          Assert.equal(buffer, responseBody);

          if (expectedExpiration) {
            // Handler had to be called second time
            Assert.equal(redirectHandler_ExpiresInPast_calls, 2);
          } else {
            // Handler had to be called second time (no-store forces validate),
            // and we are just in memory
            Assert.equal(redirectHandler_NoStore_calls, 2);
            Assert.ok(!entry.persistent);
          }

          continuation();
        }, null)
      );
    }
  );
}

function run_test_no_store() {
  var chan = make_channel(randomURI1);
  chan.asyncOpen(
    new ChannelListener(function (request, buffer) {
      // Cache-control: no-store response should only be found in the memory cache.
      check_response(randomURI1, request, buffer, false, run_test_expires_past);
    }, null)
  );
}

function run_test_expires_past() {
  var chan = make_channel(randomURI2);
  chan.asyncOpen(
    new ChannelListener(function (request, buffer) {
      // Expires: -1 response should not be found in any cache.
      check_response(randomURI2, request, buffer, true, finish_test);
    }, null)
  );
}

function finish_test() {
  httpserver.stop(do_test_finished);
}

function run_test() {
  do_get_profile();

  httpserver = new HttpServer();
  httpserver.registerPathHandler(randomPath1, redirectHandler_NoStore);
  httpserver.registerPathHandler(randomPath2, redirectHandler_ExpiresInPast);
  httpserver.registerPathHandler("/content", contentHandler);
  httpserver.start(-1);

  run_test_no_store();
  do_test_pending();
}