summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/ContentMetaData.js31
-rw-r--r--src/lib/ResponseMetaData.js54
2 files changed, 54 insertions, 31 deletions
diff --git a/src/lib/ContentMetaData.js b/src/lib/ContentMetaData.js
deleted file mode 100644
index 002a212..0000000
--- a/src/lib/ContentMetaData.js
+++ /dev/null
@@ -1,31 +0,0 @@
-class ContentMetaData {
- constructor(request, defaultCharset = "utf-8") {
- this.defaultCharset = defaultCharset;
- let {responseHeaders} = request;
- for (let h of responseHeaders) {
- if (/^\s*Content-(Type|Disposition)\s*$/i.test(h.name)) {
- this[RegExp.$1.toLowerCase()] = h.value;
- }
- }
- }
-
- get charset() {
- let charset = this.defaultCharset;
- if (this.type) {
- let m = this.type.match(/;\s*charset\s*=\s*(\S+)/);
- if (m) {
- charset = m[1];
- }
- }
- Object.defineProperty(this, "charset", { value: charset, writable: false, configurable: true });
- return charset;
- }
-
- createDecoder() {
- try {
- return new TextDecoder(this.charset);
- } catch (e) {
- return new TextDecoder(this.defaultCharset);
- }
- }
-};
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");
+ }
+};