Compare commits

..

2 Commits

Author SHA1 Message Date
Frank Jogeleit
d81c81a128 Merge pull request #124 from fjogeleit/response-mask
mask response as secret if configured
2023-12-18 10:09:48 +01:00
Frank Jogeleit
2d6a2f17dc mask response as secret if configured
Signed-off-by: Frank Jogeleit <frank.jogeleit@lovoo.com>
2023-12-17 15:41:37 +01:00
11 changed files with 137 additions and 2798 deletions

View File

@@ -123,31 +123,21 @@ jobs:
- name: Create Test File
run: |
echo "test" > testfile1.txt
echo "test" > testfile2.txt
echo "test" > testfile.txt
- name: Request Postman Echo POST Multipart
uses: ./
with:
url: 'https://postman-echo.com/post'
method: 'POST'
data: '{ "key": "value" }'
files: '{ "file": "${{ github.workspace }}/testfile1.txt" }'
- name: Request Postman Echo POST Multipart File Array
uses: ./
with:
url: 'https://postman-echo.com/post'
method: 'POST'
data: '{ "key": "value" }'
files: '{ "file": ["${{ github.workspace }}/testfile1.txt", "${{ github.workspace }}/testfile2.txt"] }'
files: '{ "file": "${{ github.workspace }}/testfile.txt" }'
- name: Request Postman Echo POST and persist response
uses: ./
with:
url: 'https://postman-echo.com/post'
method: 'POST'
file: "${{ github.workspace }}/testfile1.txt"
file: "${{ github.workspace }}/testfile.txt"
responseFile: "${{ github.workspace }}/response.json"
- name: Output responseFile
run: |
@@ -158,14 +148,14 @@ jobs:
with:
url: 'https://postman-echo.com/post'
method: 'POST'
files: '{ "file": "${{ github.workspace }}/testfile1.txt" }'
files: '{ "file": "${{ github.workspace }}/testfile.txt" }'
- name: Request Postman Echo POST single file
uses: ./
with:
url: 'https://postman-echo.com/post'
method: 'POST'
file: "${{ github.workspace }}/testfile1.txt"
file: "${{ github.workspace }}/testfile.txt"
- name: Request Postman Echo POST URLEncoded string data
uses: ./

View File

@@ -59,6 +59,10 @@ inputs:
responseFile:
description: 'Persist the response data to the specified file path'
required: false
maskResponse:
description: 'Allows to mark your response as secret and hide the output in the action logs'
required: false
default: 'false'
retry:
description: 'optional amount of retries if the request fails'
required: false

80
dist/index.js vendored
View File

@@ -26561,6 +26561,10 @@ class GithubActions {
core.setOutput(name, output)
}
setSecret(value) {
core.setSecret(value)
}
setFailed(message) {
core.setFailed(message)
}
@@ -26591,6 +26595,57 @@ class LogActions {
module.exports = { GithubActions, LogActions }
/***/ }),
/***/ 8566:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const axios = __nccwpck_require__(8757);
const { GithubActions } = __nccwpck_require__(8169);
/**
* @param {GithubActions} actions
*
* @returns {(response: axios.AxiosResponse) => void}
*/
const createMaskHandler = (actions) => (response) => {
let data = response.data
if (typeof data == 'object') {
data = JSON.stringify(data)
}
actions.setSecret(data)
}
module.exports = { createMaskHandler }
/***/ }),
/***/ 2190:
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict";
const axios = __nccwpck_require__(8757);
const { GithubActions } = __nccwpck_require__(8169);
/**
* @param {GithubActions} actions
*
* @returns {(response: axios.AxiosResponse) => void}
*/
const createOutputHandler = (actions) => (response) => {
actions.setOutput('response', response.data)
actions.setOutput('headers', response.headers)
}
module.exports = { createOutputHandler }
/***/ }),
/***/ 6733:
@@ -26660,7 +26715,7 @@ const convertToJSON = (value) => {
*
* @returns {FormData}
*/
const convertToFormData = async (data, files, convertPaths) => {
const convertToFormData = (data, files, convertPaths) => {
const formData = new FormData();
for (const [key, value] of Object.entries(data)) {
@@ -26668,11 +26723,7 @@ const convertToFormData = async (data, files, convertPaths) => {
}
for (const [key, value] of Object.entries(files)) {
if (Array.isArray(value)) {
value.forEach(v => formData.append(key, fs.createReadStream(v)))
} else {
formData.append(key, fs.createReadStream(value));
}
formData.append(key, fs.createReadStream(value));
}
return formData;
@@ -26844,9 +26895,6 @@ const request = async({ method, instanceConfig, data, files, file, actions, opti
return null
}
actions.setOutput('response', JSON.stringify(response.data))
actions.setOutput('headers', response.headers)
return response
} catch (error) {
if ((typeof error === 'object') && (error.isAxiosError === true)) {
@@ -33184,7 +33232,10 @@ const axios = __nccwpck_require__(8757);
const https = __nccwpck_require__(5687);
const { request, METHOD_POST } = __nccwpck_require__(9082);
const { GithubActions } = __nccwpck_require__(8169);
const { createPersistHandler } = __nccwpck_require__(6733);
const { createOutputHandler } = __nccwpck_require__(2190);
const { createMaskHandler } = __nccwpck_require__(8566);
let customHeaders = {}
@@ -33252,9 +33303,16 @@ if (typeof ignoreStatusCodes === 'string' && ignoreStatusCodes.length > 0) {
ignoredCodes = ignoreStatusCodes.split(',').map(statusCode => parseInt(statusCode.trim()))
}
const handler = [];
const actions = new GithubActions();
const handler = [];
if (core.getBooleanInput('maskResponse')) {
handler.push(createMaskHandler(actions))
}
handler.push(createOutputHandler(actions))
if (!!responseFile) {
handler.push(createPersistHandler(responseFile, actions))
}
@@ -33268,7 +33326,7 @@ const options = {
}
request({ data, method, instanceConfig, files, file, actions, options }).then(response => {
if (typeof response == 'object') {
if (response && typeof response == 'object') {
handler.forEach(h => h(response))
}
})

2761
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -25,9 +25,7 @@
"yargs": "^17.7.2"
},
"dependencies": {
"@actions/core": "^1.10.1",
"install": "^0.13.0",
"npm": "^10.2.4"
"@actions/core": "^1.10.1"
},
"engines": {
"node": ">=16.0.0"

View File

@@ -19,6 +19,10 @@ class GithubActions {
core.setOutput(name, output)
}
setSecret(value) {
core.setSecret(value)
}
setFailed(message) {
core.setFailed(message)
}

21
src/handler/mask.js Normal file
View File

@@ -0,0 +1,21 @@
'use strict'
const axios = require('axios');
const { GithubActions } = require('../githubActions');
/**
* @param {GithubActions} actions
*
* @returns {(response: axios.AxiosResponse) => void}
*/
const createMaskHandler = (actions) => (response) => {
let data = response.data
if (typeof data == 'object') {
data = JSON.stringify(data)
}
actions.setSecret(data)
}
module.exports = { createMaskHandler }

16
src/handler/output.js Normal file
View File

@@ -0,0 +1,16 @@
'use strict'
const axios = require('axios');
const { GithubActions } = require('../githubActions');
/**
* @param {GithubActions} actions
*
* @returns {(response: axios.AxiosResponse) => void}
*/
const createOutputHandler = (actions) => (response) => {
actions.setOutput('response', response.data)
actions.setOutput('headers', response.headers)
}
module.exports = { createOutputHandler }

View File

@@ -24,7 +24,7 @@ const convertToJSON = (value) => {
*
* @returns {FormData}
*/
const convertToFormData = async (data, files, convertPaths) => {
const convertToFormData = (data, files, convertPaths) => {
const formData = new FormData();
for (const [key, value] of Object.entries(data)) {
@@ -32,11 +32,7 @@ const convertToFormData = async (data, files, convertPaths) => {
}
for (const [key, value] of Object.entries(files)) {
if (Array.isArray(value)) {
value.forEach(v => formData.append(key, fs.createReadStream(v)))
} else {
formData.append(key, fs.createReadStream(value));
}
formData.append(key, fs.createReadStream(value));
}
return formData;

View File

@@ -119,9 +119,6 @@ const request = async({ method, instanceConfig, data, files, file, actions, opti
return null
}
actions.setOutput('response', JSON.stringify(response.data))
actions.setOutput('headers', response.headers)
return response
} catch (error) {
if ((typeof error === 'object') && (error.isAxiosError === true)) {

View File

@@ -5,7 +5,10 @@ const axios = require('axios');
const https = require('https');
const { request, METHOD_POST } = require('./httpClient');
const { GithubActions } = require('./githubActions');
const { createPersistHandler } = require('./handler/persist');
const { createOutputHandler } = require('./handler/output');
const { createMaskHandler } = require('./handler/mask');
let customHeaders = {}
@@ -73,9 +76,16 @@ if (typeof ignoreStatusCodes === 'string' && ignoreStatusCodes.length > 0) {
ignoredCodes = ignoreStatusCodes.split(',').map(statusCode => parseInt(statusCode.trim()))
}
const handler = [];
const actions = new GithubActions();
const handler = [];
if (core.getBooleanInput('maskResponse')) {
handler.push(createMaskHandler(actions))
}
handler.push(createOutputHandler(actions))
if (!!responseFile) {
handler.push(createPersistHandler(responseFile, actions))
}
@@ -89,7 +99,7 @@ const options = {
}
request({ data, method, instanceConfig, files, file, actions, options }).then(response => {
if (typeof response == 'object') {
if (response && typeof response == 'object') {
handler.forEach(h => h(response))
}
})