summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_multipart_set_cookie.js
blob: c8943cf3ccb5e358cdc95281f915d0a1ec3f3a6b (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
"use strict";

const { HttpServer } = ChromeUtils.importESModule(
  "resource://testing-common/httpd.sys.mjs"
);

var httpserver = null;

ChromeUtils.defineLazyGetter(this, "uri", function () {
  return "http://localhost:" + httpserver.identity.primaryPort + "/multipart";
});

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

var multipartBody =
  "--boundary\r\nSet-Cookie: foo=bar\r\n\r\nSome text\r\n--boundary--";

function contentHandler(metadata, response) {
  response.setHeader(
    "Content-Type",
    'multipart/x-mixed-replace; boundary="boundary"'
  );
  response.bodyOutputStream.write(multipartBody, multipartBody.length);
}

let first = true;

function responseHandler(request, buffer) {
  let channel = request.QueryInterface(Ci.nsIChannel);
  Assert.equal(buffer, "Some text");
  Assert.equal(channel.contentType, "text/plain");

  // two runs: pref on and off
  if (first) {
    // foo=bar should not be visible here
    Assert.equal(
      Services.cookies.getCookieStringFromHttp(channel.URI, channel),
      ""
    );
    first = false;
    Services.prefs.setBoolPref(
      "network.cookie.prevent_set_cookie_from_multipart",
      false
    );
    createConverterAndRequest();
  } else {
    // validate that the pref is working
    Assert.equal(
      Services.cookies.getCookieStringFromHttp(channel.URI, channel),
      "foo=bar"
    );
    httpserver.stop(do_test_finished);
  }
}

var multipartListener = {
  _buffer: "",

  QueryInterface: ChromeUtils.generateQI([
    "nsIStreamListener",
    "nsIRequestObserver",
  ]),

  onStartRequest(request) {
    this._buffer = "";
  },

  onDataAvailable(request, stream, offset, count) {
    try {
      this._buffer = this._buffer.concat(read_stream(stream, count));
      dump("BUFFEEE: " + this._buffer + "\n\n");
    } catch (ex) {
      do_throw("Error in onDataAvailable: " + ex);
    }
  },

  onStopRequest(request, status) {
    try {
      responseHandler(request, this._buffer);
    } catch (ex) {
      do_throw("Error in closure function: " + ex);
    }
  },
};

function createConverterAndRequest() {
  var streamConv = Cc["@mozilla.org/streamConverters;1"].getService(
    Ci.nsIStreamConverterService
  );
  var conv = streamConv.asyncConvertData(
    "multipart/x-mixed-replace",
    "*/*",
    multipartListener,
    null
  );

  var chan = make_channel(uri);
  chan.asyncOpen(conv);
}

function run_test() {
  Services.prefs.setBoolPref(
    "network.cookieJarSettings.unblocked_for_testing",
    true
  );

  httpserver = new HttpServer();
  httpserver.registerPathHandler("/multipart", contentHandler);
  httpserver.start(-1);

  createConverterAndRequest();

  do_test_pending();
}