File upload (#20)

* Add Support for FileUpload
This commit is contained in:
Frank Jogeleit
2021-01-24 13:14:13 +01:00
committed by GitHub
parent de202bb090
commit b6bb4fa030
8 changed files with 1715 additions and 7 deletions

View File

@@ -1,9 +1,11 @@
const axios = require("axios");
const FormData = require('form-data')
const fs = require('fs')
const METHOD_GET = 'GET'
const METHOD_POST = 'POST'
const request = async({ method, instanceConfig, data, auth, actions, preventFailureOnNoResponse, escapeData }) => {
const request = async({ method, instanceConfig, data, files, auth, actions, preventFailureOnNoResponse, escapeData }) => {
try {
const instance = axios.create(instanceConfig);
@@ -17,6 +19,21 @@ const request = async({ method, instanceConfig, data, auth, actions, preventFail
data = undefined;
}
if (files && files !== '{}') {
filesJson = convertToJSON(files)
dataJson = convertToJSON(data)
if (Object.keys(filesJson).length > 0) {
try {
data = convertToFormData(dataJson, filesJson)
instanceConfig = await updateConfig(instanceConfig, data, actions)
} catch(error) {
actions.setFailed({ message: `Unable to convert Data and Files into FormData: ${error.message}`, data: dataJson, files: filesJson })
return
}
}
}
const requestData = {
auth,
method,
@@ -45,6 +62,54 @@ const request = async({ method, instanceConfig, data, auth, actions, preventFail
}
}
const convertToJSON = (value) => {
try {
return JSON.parse(value)
} catch(e) {
return {}
}
}
const convertToFormData = (data, files) => {
formData = new FormData()
for (const [key, value] of Object.entries(data)) {
formData.append(key, value)
}
for (const [key, value] of Object.entries(files)) {
formData.append(key, fs.createReadStream(value))
}
return formData
}
const updateConfig = async (instanceConfig, formData, actions) => {
try {
return {
...instanceConfig,
headers: {
...instanceConfig.headers,
...formData.getHeaders(),
'Content-Length': await contentLength(formData)
}
}
} catch(error) {
actions.setFailed({ message: `Unable to read Content-Length: ${error.message}`, data, files })
}
}
const contentLength = (formData) => new Promise((resolve, reject) => {
formData.getLength((err, length) => {
if (err) {
reject (err)
return
}
resolve(length)
})
})
module.exports = {
request,
METHOD_POST,

View File

@@ -37,8 +37,9 @@ const instanceConfig = {
core.debug('Instance Configuration: ' + JSON.stringify(instanceConfig))
const data = core.getInput('data') || '{}';
const files = core.getInput('files') || '{}';
const method = core.getInput('method') || METHOD_POST;
const preventFailureOnNoResponse = core.getInput('preventFailureOnNoResponse') === 'true';
const escapeData = core.getInput('escapeData') === 'true';
request({ data, method, instanceConfig, auth, preventFailureOnNoResponse, escapeData, actions: new GithubActions() })
request({ data, method, instanceConfig, auth, preventFailureOnNoResponse, escapeData, files, actions: new GithubActions() })