diff options
author | hackademix | 2018-07-19 01:04:35 +0200 |
---|---|---|
committer | hackademix | 2018-07-19 01:04:35 +0200 |
commit | 580450b4630087028f93dbeb856b73e16a95a204 (patch) | |
tree | a8612692c82c9a874f239acc8c0a49494a1f745e /src/lib/ResponseMetaData.js | |
parent | 091056692685779a9f4c87f1ec9884fa4804b708 (diff) | |
download | noscript-580450b4630087028f93dbeb856b73e16a95a204.tar.gz noscript-580450b4630087028f93dbeb856b73e16a95a204.tar.xz noscript-580450b4630087028f93dbeb856b73e16a95a204.zip |
Refactor ContentMetadata into ResponseMetaData.
Diffstat (limited to 'src/lib/ResponseMetaData.js')
-rw-r--r-- | src/lib/ResponseMetaData.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/lib/ResponseMetaData.js b/src/lib/ResponseMetaData.js new file mode 100644 index 0000000..17e1608 --- /dev/null +++ b/src/lib/ResponseMetaData.js @@ -0,0 +1,54 @@ +class ResponseMetaData { + constructor(request) { + let {responseHeaders} = request; + this.headers = {}; + this.contentType = this.contentDisposition = null; + for (let h of responseHeaders) { + if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) { + let propertyName = RegExp.$1; + propertyName = `content${propertyName.charAt(0).toUpperCase()}${propertyName.substring(1).toLowerCase()}`; + this[propertyName] = h.value; + this.headers[propertyName] = h; + } + } + this.forcedUTF8 = false; + } + + get charset() { + let charset = ""; + if (this.contentType) { + let m = this.contentType.match(/;\s*charset\s*=\s*(\S+)/); + if (m) { + charset = m[1]; + } + } + Object.defineProperty(this, "charset", { value: charset, writable: false, configurable: true }); + return charset; + } + + get isUTF8() { + return /^utf-8$/i.test(this.charset); + } + + forceUTF8() { + if (!(this.forcedUTF8 || this.isUTF8)) { + let h = this.headers.contentType; + if (h) { + h.value = h.value.replace(/;\s*charset\s*=.*|$/, "; charset=utf8"); + this.forcedUTF8 = true; + } // if the header doesn't exist the browser should default to UTF-8 anyway + } + return this.forcedUTF8; + } + + createDecoder() { + if (this.charset) { + try { + return new TextDecoder(this.charset); + } catch (e) { + console.error(e); + } + } + return new TextDecoder("utf-8"); + } +}; |