mirror of
https://github.com/fjogeleit/http-request-action.git
synced 2026-02-04 16:45:52 +08:00
@@ -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,
|
||||
|
||||
@@ -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() })
|
||||
|
||||
Reference in New Issue
Block a user