-
Notifications
You must be signed in to change notification settings - Fork 9
/
xmlhttprequest-cookie.js
117 lines (105 loc) · 4.09 KB
/
xmlhttprequest-cookie.js
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
/*
** xmlhttprequest-cookie -- Cookie-aware XMLHttpRequest Wrapper
** Copyright (c) 2013-2019 Dr. Ralf S. Engelschall <rse@engelschall.com>
**
** Permission is hereby granted, free of charge, to any person obtaining
** a copy of this software and associated documentation files (the
** "Software"), to deal in the Software without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Software, and to
** permit persons to whom the Software is furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**
** xmlhttprequest-cookie.js: the wrapper
*/
/* external requirements */
var Url = require("url");
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
/* internal requirements */
var Cookie = require("./xmlhttprequest-cookie-obj");
var CookieJar = require("./xmlhttprequest-cookie-jar");
/* create singleton cookie jar */
var cookieJar = new CookieJar();
/* receive cookies via HTTP "Set-Cookie" header(s) */
var cookie_recv = function (url, xhr) {
xhr.setDisableHeaderCheck(true);
var cookies = xhr.getResponseHeader("Set-Cookie");
if (typeof cookies === "object" && cookies !== null && cookies.length > 0) {
for (var i = 0; i < cookies.length; i++) {
var cookie = Cookie.build(cookies[i], url);
cookieJar.insert(cookie);
if (xhr.debug)
console.log("XMLHttpRequest-Cookie: received cookie: ", cookie);
}
}
xhr.setDisableHeaderCheck(false);
};
/* send cookies via HTTP "Cookie" header */
var cookie_send = function (url, xhr) {
xhr.setDisableHeaderCheck(true);
var cookie = xhr.getRequestHeader("Cookie") || "";
var cookies = cookieJar.findFuzzy(url.hostname, url.pathname);
for (var i = 0; i < cookies.length; i++) {
if (cookies[i].secure && url.protocol !== "https:")
continue;
if (cookies[i].httponly && url.protocol.match(/^https?:$/i) === null)
continue;
if (cookie !== "")
cookie += "; ";
cookie += cookies[i].name + "=" + cookies[i].value;
}
if (cookie !== "") {
if (xhr.debug)
console.log("XMLHttpRequest-Cookie: send cookie(s): ", cookie);
xhr.setRequestHeader("Cookie", cookie);
}
xhr.setDisableHeaderCheck(false);
};
/* define XMLHttpRequest wrapper constructor */
var XMLHttpRequestWrapper = function () {
/* create object with original constructor */
var xhr = new XMLHttpRequest();
/* intercept "open" method to gather URL */
var url = null;
var open_orig = xhr.open;
xhr.open = function () {
url = Url.parse(arguments[1]);
return open_orig.apply(xhr, arguments);
};
/* hook into the processing */
var openedOnce = false;
xhr.addEventListener("readystatechange", function () {
switch (xhr.readyState) {
case this.OPENED:
if (!openedOnce) {
cookie_send(url, xhr);
openedOnce = true;
}
break;
case this.HEADERS_RECEIVED:
cookie_recv(url, xhr);
break;
default:
break;
}
});
/* provide a simple way to control debug messages */
xhr.debug = false;
return xhr;
};
/* export XMLHttpRequest wrapper constructor and the cookie jar */
module.exports = {
XMLHttpRequest: XMLHttpRequestWrapper,
CookieJar: cookieJar
};