test_multipart_set_cookie.js (2721B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 var httpserver = null; 8 9 ChromeUtils.defineLazyGetter(this, "uri", function () { 10 return "http://localhost:" + httpserver.identity.primaryPort + "/multipart"; 11 }); 12 13 function make_channel(url) { 14 return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true }); 15 } 16 17 var multipartBody = 18 "--boundary\r\nSet-Cookie: foo=bar\r\n\r\nSome text\r\n--boundary--"; 19 20 function contentHandler(metadata, response) { 21 response.setHeader( 22 "Content-Type", 23 'multipart/x-mixed-replace; boundary="boundary"' 24 ); 25 response.bodyOutputStream.write(multipartBody, multipartBody.length); 26 } 27 28 let first = true; 29 30 function responseHandler(request, buffer) { 31 let channel = request.QueryInterface(Ci.nsIChannel); 32 Assert.equal(buffer, "Some text"); 33 Assert.equal(channel.contentType, "text/plain"); 34 35 // two runs: pref on and off 36 if (first) { 37 // foo=bar should not be visible here 38 Assert.equal( 39 Services.cookies.getCookieStringFromHttp(channel.URI, channel), 40 "" 41 ); 42 first = false; 43 Services.prefs.setBoolPref( 44 "network.cookie.prevent_set_cookie_from_multipart", 45 false 46 ); 47 createConverterAndRequest(); 48 } else { 49 // validate that the pref is working 50 Assert.equal( 51 Services.cookies.getCookieStringFromHttp(channel.URI, channel), 52 "foo=bar" 53 ); 54 httpserver.stop(do_test_finished); 55 } 56 } 57 58 var multipartListener = { 59 _buffer: "", 60 61 QueryInterface: ChromeUtils.generateQI([ 62 "nsIStreamListener", 63 "nsIRequestObserver", 64 ]), 65 66 onStartRequest() { 67 this._buffer = ""; 68 }, 69 70 onDataAvailable(request, stream, offset, count) { 71 try { 72 this._buffer = this._buffer.concat(read_stream(stream, count)); 73 dump("BUFFEEE: " + this._buffer + "\n\n"); 74 } catch (ex) { 75 do_throw("Error in onDataAvailable: " + ex); 76 } 77 }, 78 79 onStopRequest(request) { 80 try { 81 responseHandler(request, this._buffer); 82 } catch (ex) { 83 do_throw("Error in closure function: " + ex); 84 } 85 }, 86 }; 87 88 function createConverterAndRequest() { 89 var streamConv = Cc["@mozilla.org/streamConverters;1"].getService( 90 Ci.nsIStreamConverterService 91 ); 92 var conv = streamConv.asyncConvertData( 93 "multipart/x-mixed-replace", 94 "*/*", 95 multipartListener, 96 null 97 ); 98 99 var chan = make_channel(uri); 100 chan.asyncOpen(conv); 101 } 102 103 function run_test() { 104 Services.prefs.setBoolPref( 105 "network.cookieJarSettings.unblocked_for_testing", 106 true 107 ); 108 109 httpserver = new HttpServer(); 110 httpserver.registerPathHandler("/multipart", contentHandler); 111 httpserver.start(-1); 112 113 createConverterAndRequest(); 114 115 do_test_pending(); 116 }