1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

add multipart/form-data support to http request node

This commit is contained in:
Nick Kasten 2019-03-05 09:55:21 -06:00
parent a6ef755139
commit a9bf3d0226
2 changed files with 35 additions and 18 deletions

View File

@ -129,7 +129,18 @@
<p>If <code>msg.payload</code> is an Object, the node will automatically set the content type <p>If <code>msg.payload</code> is an Object, the node will automatically set the content type
of the request to <code>application/json</code> and encode the body as such.</p> of the request to <code>application/json</code> and encode the body as such.</p>
<p>To encode the request as form data, <code>msg.headers["content-type"]</code> should be set to <code>application/x-www-form-urlencoded</code>.</p> <p>To encode the request as form data, <code>msg.headers["content-type"]</code> should be set to <code>application/x-www-form-urlencoded</code>.</p>
<p>For form-based file uploads, some services require that <code>msg.headers["content-type"]</code> be set to <code>multipart/form-data</code>.
To construct <code>msg.payload</code> for this type of request, use the following structure and substitue the <code>KEY</code>, <code>DATA</code>, and <code>FILENAME</code>
values for your own.
<pre><code>req.formData = {
KEY: {
value: DATA,
options: {
filename: FILENAME
}
}
}
</code></pre>
</script> </script>
<script type="text/javascript"> <script type="text/javascript">

View File

@ -78,6 +78,7 @@ module.exports = function(RED) {
} }
var opts = {}; var opts = {};
opts.url = url; opts.url = url;
opts.formData = {};
opts.timeout = node.reqTimeout; opts.timeout = node.reqTimeout;
opts.method = method; opts.method = method;
opts.headers = {}; opts.headers = {};
@ -144,28 +145,33 @@ module.exports = function(RED) {
var payload = null; var payload = null;
if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") { if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") {
if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { if (opts.headers['content-type'] == 'multipart/form-data' && typeof payload === "object") {
payload = msg.payload; opts.formData = msg.payload;
} else if (typeof msg.payload == "number") {
payload = msg.payload+"";
} else { } else {
if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') { if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) {
payload = querystring.stringify(msg.payload); payload = msg.payload;
} else if (typeof msg.payload == "number") {
payload = msg.payload+"";
} else { } else {
payload = JSON.stringify(msg.payload); if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') {
if (opts.headers['content-type'] == null) { payload = querystring.stringify(msg.payload);
opts.headers[ctSet] = "application/json"; } else {
payload = JSON.stringify(msg.payload);
if (opts.headers['content-type'] == null) {
opts.headers[ctSet] = "application/json";
}
} }
} }
} if (opts.headers['content-length'] == null) {
if (opts.headers['content-length'] == null) { if (Buffer.isBuffer(payload)) {
if (Buffer.isBuffer(payload)) { opts.headers[clSet] = payload.length;
opts.headers[clSet] = payload.length; } else {
} else { opts.headers[clSet] = Buffer.byteLength(payload);
opts.headers[clSet] = Buffer.byteLength(payload); }
} }
} opts.body = payload;
opts.body = payload; }
} }
// revert to user supplied Capitalisation if needed. // revert to user supplied Capitalisation if needed.
if (opts.headers.hasOwnProperty('content-type') && (ctSet !== 'content-type')) { if (opts.headers.hasOwnProperty('content-type') && (ctSet !== 'content-type')) {