diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 9e6f6157..ea095649 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -126,6 +126,7 @@ const Categories = [ { name: "Networking", ops: [ + "HTTP request", "Strip HTTP headers", "Parse User Agent", "Parse IP range", @@ -288,6 +289,8 @@ const Categories = [ "Scan for Embedded Files", "Generate UUID", "Render Image", + "Remove EXIF", + "Extract EXIF", "Numberwang", ] }, diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index ddb67d28..a22bc9e2 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -3370,7 +3370,7 @@ const OperationConfig = { "

", "EXIF data from photos usually contains information about the image file itself as well as the device used to create it.", ].join("\n"), - run: Image.runEXIF, + run: Image.runExtractEXIF, inputType: "byteArray", outputType: "string", args: [], @@ -3388,9 +3388,20 @@ const OperationConfig = { } ] }, + "Remove EXIF": { + description: [ + "Removes EXIF data from a JPEG image.", + "

", + "EXIF data embedded in photos usually contains information about the image file itself as well as the device used to create it.", + ].join("\n"), + run: Image.runRemoveEXIF, + inputType: "byteArray", + outputType: "byteArray", + args: [] + }, "HTTP request": { description: [ - "Makes a HTTP request and returns the response body.", + "Makes an HTTP request and returns the response.", "

", "This operation supports different HTTP verbs like GET, POST, PUT, etc.", "

", @@ -3401,24 +3412,33 @@ const OperationConfig = { run: HTTP.runHTTPRequest, inputType: "string", outputType: "string", + manualBake: true, args: [ { name: "Method", type: "option", value: HTTP.METHODS, - }, { + }, + { name: "URL", type: "string", value: "", - }, { + }, + { name: "Headers", type: "text", value: "", - }, { - name: "Ignore status code", + }, + { + name: "Mode", + type: "option", + value: HTTP.MODE, + }, + { + name: "Show response metadata", type: "boolean", value: false, - }, + } ] }, }; diff --git a/src/core/operations/HTTP.js b/src/core/operations/HTTP.js index e80c0fb3..fd90f455 100755 --- a/src/core/operations/HTTP.js +++ b/src/core/operations/HTTP.js @@ -11,6 +11,7 @@ import {UAS_parser as UAParser} from "../lib/uas_parser.js"; * @namespace */ const HTTP = { + /** * @constant * @default @@ -18,8 +19,10 @@ const HTTP = { METHODS: [ "GET", "POST", "HEAD", "PUT", "PATCH", "DELETE", + "CONNECT", "TRACE", "OPTIONS" ], + /** * Strip HTTP headers operation. * @@ -60,9 +63,31 @@ const HTTP = { }, + /** + * @constant + * @default + */ + MODE: [ + "Cross-Origin Resource Sharing", + "No CORS (limited to HEAD, GET or POST)", + ], + + /** + * Lookup table for HTTP modes + * + * @private + * @constant + */ + _modeLookup: { + "Cross-Origin Resource Sharing": "cors", + "No CORS (limited to HEAD, GET or POST)": "no-cors", + }, + /** * HTTP request operation. * + * @author tlwr [toby@toby.codes] + * @author n1474335 [n1474335@gmail.com] * @param {string} input * @param {Object[]} args * @returns {string} @@ -71,7 +96,8 @@ const HTTP = { const method = args[0], url = args[1], headersText = args[2], - ignoreStatusCode = args[3]; + mode = args[3], + showResponseMetadata = args[4]; if (url.length === 0) return ""; @@ -88,9 +114,9 @@ const HTTP = { }); let config = { - method, - headers, - mode: "cors", + method: method, + headers: headers, + mode: HTTP._modeLookup[mode], cache: "no-cache", }; @@ -100,11 +126,23 @@ const HTTP = { return fetch(url, config) .then(r => { - if (ignoreStatusCode || r.status === 200) { - return r.text(); - } else { - throw `HTTP response code was ${r.status}.`; + if (showResponseMetadata) { + let headers = ""; + for (let pair of r.headers.entries()) { + headers += " " + pair[0] + ": " + pair[1] + "\n"; + } + return r.text().then(b => { + return "####\n Status: " + r.status + " " + r.statusText + + "\n Exposed headers:\n" + headers + "####\n\n" + b; + }); } + return r.text(); + }) + .catch(e => { + return e.toString() + + "\n\nThis error could be caused by one of the following:\n" + + " - An invalid URL\n" + + " - Making a cross-origin request to a server which does not support CORS\n"; }); },