fixes to get it working
This commit is contained in:
		| @@ -18,14 +18,14 @@ export default class CookieJar { | ||||
|         } | ||||
|         else if(cookies instanceof Cookie) | ||||
|             this.cookies.set(cookies.name, cookies); | ||||
|         else | ||||
|         else if(cookies) | ||||
|             throw new TypeError("Third parameter is neither an array nor a cookie!"); | ||||
|         if(this.cookies.size === 0 && this.file.length !== 0 && fs.existsSync(this.file)) | ||||
|             this.cookies = new Map(JSON.parse(fs.readFileSync(this.file))); | ||||
|             this.cookies = new Map(JSON.parse(fs.readFileSync(this.file)).map(([k, v]) => [k, Cookie.fromObject(v)])); | ||||
|     } | ||||
|     addCookie(c) { | ||||
|     addCookie(c, fromURL) { | ||||
|         if(typeof c === "string") | ||||
|             c = new Cookie(c); | ||||
|             c = new Cookie(c, fromURL); | ||||
|         this.cookies.set(c.name, c); | ||||
|     } | ||||
|     forEach(callback) { | ||||
|   | ||||
| @@ -1,12 +1,16 @@ | ||||
| import urlParser from "url"; | ||||
|  | ||||
| const validateHostname = (cookieHostname, requestHostname, subdomains) => { | ||||
|     cookieHostname = cookieHostname.toLowerCase(); | ||||
|     requestHostname = requestHostname.toLowerCase(); | ||||
|     if(requestHostname === cookieHostname || (subdomains && requestHostname.endsWith("." + cookieHostname))) | ||||
|         return true; | ||||
|     return false; | ||||
| }; | ||||
|  | ||||
| const validatePath = (cookiePath, requestPath) => { | ||||
|     cookiePath = cookiePath.toLowerCase(); | ||||
|     requestPath = requestPath.toLowerCase(); | ||||
|     if(cookiePath.endsWith("/")) | ||||
|         cookiePath = cookiePath.slice(0, -1); | ||||
|     if(requestPath.endsWith("/")) | ||||
| @@ -32,14 +36,14 @@ export default class Cookie { | ||||
|                 if(k === "expires") { | ||||
|                     if(this.expiry) // max-age has precedence over expires | ||||
|                         continue; | ||||
|                     if(!/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4} \d{2}:\d{2}:\d{2} GMT$/.test(v) | ||||
|                     if(!/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \d{2}[ -](?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ -]\d{2,4} \d{2}:\d{2}:\d{2} GMT$/.test(v) | ||||
|                         || (this.expiry = new Date(v)) === "Invalid Date") | ||||
|                         throw new TypeError("Invalid value for Expires \"" + v + "\"!"); | ||||
|                 } | ||||
|                 else if(k === "max-age") { | ||||
|                     const seconds = parseInt(v); | ||||
|                     if(seconds.toString() !== v) | ||||
|                         throw new TypeError("Invalid value for Max-Age \"" + v + "\"!") | ||||
|                         throw new TypeError("Invalid value for Max-Age \"" + v + "\"!"); | ||||
|                     this.expiry = new Date(); | ||||
|                     this.expiry.setSeconds(this.expiry.getSeconds() + seconds); | ||||
|                 } | ||||
| @@ -78,13 +82,16 @@ export default class Cookie { | ||||
|             throw new TypeError("Cookie has \"__Host-\" prefix but \"Secure\" isn't set, the cookie is not set via https, \"Domain\" is set or \"Path\" is not equal to \"/\"!"); | ||||
|     } | ||||
|     static fromObject(obj) { | ||||
|         return Object.assign(Object.create(this.prototype), obj); | ||||
|         let c = Object.assign(Object.create(this.prototype), obj); | ||||
|         if(c.expiry && typeof c.expiry === "string") | ||||
|             c.expiry = new Date(c.expiry); | ||||
|         return c; | ||||
|     } | ||||
|     serialize() { | ||||
|         return this.name + "=" + this.value; | ||||
|     } | ||||
|     isValidForRequest(url) { | ||||
|         if(this.expiry && this.expiry > new Date()) | ||||
|         if(this.expiry && this.expiry < new Date()) | ||||
|             return false; | ||||
|         const parsedURL = urlParser.parse(url); | ||||
|         if(parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") | ||||
|   | ||||
| @@ -9,16 +9,30 @@ export default { | ||||
|             cookieJars.forEach(jar => { | ||||
|                 if(!jar.flags.includes("r")) | ||||
|                     return; | ||||
|                 jar.forEach(c => c.isValidForRequest(url) && (cookies += c.serialize() + "; ")); | ||||
|                 jar.forEach(c => { | ||||
|                     if(c.isValidForRequest(url)) | ||||
|                         cookies += c.serialize() + "; "; | ||||
|                 }); | ||||
|             }); | ||||
|         } | ||||
|         else if(cookieJars instanceof CookieJar && cookieJars.flags.includes("r")) { | ||||
|             cookieJars.forEach(c => c.isValidForRequest(url) && (cookies += c.serialize() + "; ")); | ||||
|             cookieJars.forEach(c => { | ||||
|                 if(c.isValidForRequest(url)) | ||||
|                     cookies += c.serialize() + "; "; | ||||
|             }); | ||||
|         } | ||||
|         else | ||||
|             throw new TypeError("Third paramter is neither a cookie jar nor an array of cookie jars!"); | ||||
|         if(cookies.length !== 0) | ||||
|             options.headers["Cookie"] = cookies.slice(0, -2); | ||||
|         if(cookies.length !== 0) { | ||||
|             if(!options) { | ||||
|                 options = { | ||||
|                     headers: {} | ||||
|                 }; | ||||
|             } | ||||
|             if(!options.headers) | ||||
|                 options.headers = {}; | ||||
|             options.headers.cookie = cookies.slice(0, -2); | ||||
|         } | ||||
|         const result = await fetch(url, options); | ||||
|         // i cannot use headers.get() here because it joins the cookies to a string | ||||
|         cookies = result.headers[Object.getOwnPropertySymbols(result.headers)[0]]["set-cookie"]; | ||||
| @@ -27,13 +41,14 @@ export default { | ||||
|                 cookieJars.forEach(jar => { | ||||
|                     if(!jar.flags.includes("w")) | ||||
|                         return; | ||||
|                     cookies.forEach(c => jar.addCookie(c)); | ||||
|                     cookies.forEach(c => jar.addCookie(c, url)); | ||||
|                 }); | ||||
|             } | ||||
|             else if(cookieJars.flags.includes("w")) { | ||||
|                 cookies.forEach(c => cookieJars.addCookie(c)); | ||||
|                 cookies.forEach(c => cookieJars.addCookie(c, url)); | ||||
|             } | ||||
|         } | ||||
|         return result; | ||||
|     }, | ||||
|     CookieJar: CookieJar, | ||||
|     Cookie: Cookie | ||||
|   | ||||
		Reference in New Issue
	
	Block a user