luci-base: luci.js: allow overriding response type for requests
authorJo-Philipp Wich <jo@mein.io>
Thu, 30 Jan 2020 10:45:46 +0000 (11:45 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 30 Jan 2020 10:45:46 +0000 (11:45 +0100)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-base/htdocs/luci-static/resources/luci.js

index 3b861bfc186f63803c284c3ee0dbabe873777095..2cb346c81b8276bcb264f0409dc47426c4be3ddb 100644 (file)
                        /* privates */
                        this.xhr = xhr;
 
-                       if (content != null && typeof(content) == 'object') {
+                       if (content instanceof Blob) {
+                               this.responseBlob = content;
+                               this.responseJSON = null;
+                               this.responseText = null;
+                       }
+                       else if (content != null && typeof(content) == 'object') {
+                               this.responseBlob = null;
                                this.responseJSON = content;
                                this.responseText = null;
                        }
                        else if (content != null) {
+                               this.responseBlob = null;
                                this.responseJSON = null;
                                this.responseText = String(content);
                        }
                        else {
                                this.responseJSON = null;
-                               this.responseText = xhr.responseText;
+
+                               if (xhr.responseType == 'blob') {
+                                       this.responseBlob = xhr.response;
+                                       this.responseText = null;
+                               }
+                               else {
+                                       this.responseBlob = null;
+                                       this.responseText = xhr.responseText;
+                               }
                        }
                },
 
                                this.responseText = JSON.stringify(this.responseJSON);
 
                        return this.responseText;
+               },
+
+               /**
+                * Access the response content as blob.
+                *
+                * @instance
+                * @memberof LuCI.Response
+                * @returns {Blob}
+                * The response content as blob.
+                */
+               blob: function() {
+                       return this.responseBlob;
                }
        });
 
                 * @property {boolean} [credentials=false]
                 * Whether to include credentials such as cookies in the request.
                 *
+                * @property {string} [responseType=text]
+                * Overrides the request response type. Valid values or `text` to
+                * interpret the response as UTF-8 string or `blob` to handle the
+                * response as binary `Blob` data.
+                *
                 * @property {*} [content]
                 * Specifies the HTTP message body to send along with the request.
                 * If the value is a function, it is invoked and the return value
                                else
                                        opt.xhr.open(opt.method, opt.url, true);
 
-                               opt.xhr.responseType = 'text';
+                               opt.xhr.responseType = opt.responseType || 'text';
 
                                if ('overrideMimeType' in opt.xhr)
                                        opt.xhr.overrideMimeType('application/octet-stream');