axios.post .put and .patch expect data as the second argument (#393)

* axios.post .put .patch take data as the 2nd arg

* rename formData to form

* add warning about data not being sent

* sort imports properly

* passing an object as data sends it as json, not urlencoded
This commit is contained in:
Boris Verkhovskiy
2022-04-21 15:19:36 -07:00
committed by GitHub
parent 2d9ff6f0aa
commit dda866a741
49 changed files with 786 additions and 524 deletions

View File

@@ -42,25 +42,34 @@ const repr = (value: string | object, indentLevel?: number): string => {
};
// TODO: @
const getDataString = (request: Request): string | null => {
const _getDataString = (request: Request): [string | null, string | null] => {
if (!request.data) {
return null;
return [null, null];
}
const contentType = util.getContentType(request);
if (contentType === "application/json") {
const originalStringRepr = repr(request.data);
const contentType = util.getContentType(request);
// can have things like ; charset=utf-8 which we want to preserve
const exactContentType = util.getHeader(request, "content-type");
if (contentType === "application/json") {
const parsed = JSON.parse(request.data);
const backToString = JSON.stringify(parsed);
const jsonAsJavaScriptString = repr(parsed, 1);
let result = "";
if (request.data !== backToString) {
result += " // data: " + originalStringRepr + ",\n";
// Only arrays and {} can be passed to axios to be encoded as JSON
// TODO: check this in other generators
if (typeof parsed !== "object" || parsed === null) {
return [originalStringRepr, null];
}
result += " data: JSON.stringify(" + jsonAsJavaScriptString + "),\n";
return result;
const roundtrips = JSON.stringify(parsed) === request.data;
const jsonAsJavaScript = repr(parsed, 1);
if (
roundtrips &&
exactContentType === "application/json" &&
util.getHeader(request, "accept") === "application/json, text/plain, */*"
) {
util.deleteHeader(request, "content-type");
util.deleteHeader(request, "accept");
}
return [jsonAsJavaScript, roundtrips ? null : originalStringRepr];
}
if (contentType === "application/x-www-form-urlencoded") {
const query = util.parseQueryString(request.data);
@@ -69,95 +78,48 @@ const getDataString = (request: Request): string | null => {
queryDict &&
Object.values(queryDict).every((v) => typeof v === "string")
) {
return " data: " + repr(queryDict, 1) + ",\n";
// Technically axios sends
// application/x-www-form-urlencoded;charset=utf-8
if (exactContentType === "application/x-www-form-urlencoded") {
util.deleteHeader(request, "content-type");
}
// TODO: check roundtrip, add a comment
return ["new URLSearchParams(" + repr(queryDict, 1) + ")", null];
} else {
return [originalStringRepr, null];
}
}
return null;
return [null, null];
};
const getDataString = (request: Request): [string | null, string | null] => {
if (!request.data) {
return [null, null];
}
let dataString = null;
let commentedOutDataString = null;
try {
[dataString, commentedOutDataString] = _getDataString(request);
} catch {}
if (!dataString) {
dataString = repr(request.data);
}
return [dataString, commentedOutDataString];
};
export const _toNodeAxios = (
const buildConfigObject = (
request: Request,
warnings?: Warnings
): [string, Warnings] => {
warnings = warnings || [];
method: string,
methods: string[],
dataMethods: string[],
hasSearchParams: boolean,
warnings: Warnings
): string => {
let code = "{\n";
let importCode = "const axios = require('axios');\n";
const imports: Set<[string, string]> = new Set();
let code = "";
const needsConfig =
request.query ||
request.queryDict ||
request.headers ||
request.auth ||
request.data ||
request.multipartUploads ||
request.timeout ||
request.proxy;
// TODO: need to add http:// to URL?
const method = request.method.toLowerCase();
if (method === "get" && !needsConfig) {
// TODO: is this actually helpful?
code = "const response = await axios(" + repr(request.url) + ");\n";
return [importCode + "\n" + code, warnings];
}
const hasSearchParams =
request.query &&
(!request.queryDict ||
// https://stackoverflow.com/questions/42898009/multiple-fields-with-same-key-in-query-params-axios-request
Object.values(request.queryDict).some((qv) => Array.isArray(qv)));
if (hasSearchParams && request.query) {
code += "const params = new URLSearchParams();\n";
for (const [key, value] of request.query) {
const val = value ? value : "";
code += "params.append(" + repr(key) + ", " + repr(val) + ");\n";
}
code += "\n";
}
if (request.multipartUploads) {
imports.add(["form-data", "FormData"]);
code += "const formData = new FormData();\n";
for (const {
name,
filename,
content,
contentFile,
} of request.multipartUploads) {
code += "formData.append(" + repr(name) + ", ";
if (contentFile === "-") {
code += "fs.readFileSync(0).toString()";
imports.add(["fs", "fs"]);
} else if (contentFile) {
code += "fs.readFileSync(" + repr(contentFile) + ")";
imports.add(["fs", "fs"]);
} else {
code += repr(content as string);
}
if (filename && filename !== name) {
code += ", " + repr(filename);
}
code += ");\n";
}
code += "\n";
}
const methods = ["get", "delete", "head", "options", "post", "put", "patch"];
const fn = methods.includes(method) ? method : "request";
code += "const response = await axios." + fn + "(";
code += repr(
request.queryDict || hasSearchParams ? request.urlWithoutQuery : request.url
);
if (fn === "request" || needsConfig) {
code += ", {\n";
if (fn === "request") {
// Axios probably uppercases methods
code += " method: " + repr(request.method.toLowerCase()) + ",\n";
if (!methods.includes(method)) {
// Axios uppercases methods
code += " method: " + repr(method) + ",\n";
}
if (hasSearchParams) {
// code += " params,\n";
@@ -166,9 +128,21 @@ export const _toNodeAxios = (
code += " params: " + repr(request.queryDict, 1) + ",\n";
}
if (request.headers) {
code +=
" headers: " + repr(Object.fromEntries(request.headers), 1) + ",\n";
const [dataString, commentedOutDataString] = getDataString(request); // can delete headers
if ((request.headers && request.headers.length) || request.multipartUploads) {
code += " headers: {\n";
if (request.multipartUploads) {
code += " ...form.getHeaders(),\n";
}
for (const [key, value] of request.headers || []) {
code += " " + repr(key) + ": " + repr(value || "") + ",\n";
}
if (code.endsWith(",\n")) {
code = code.slice(0, -2);
code += "\n";
}
code += " },\n";
}
if (request.auth) {
@@ -184,19 +158,22 @@ export const _toNodeAxios = (
code += " },\n";
}
if (!dataMethods.includes(method)) {
if (request.data) {
try {
const dataString = getDataString(request);
if (dataString) {
code += dataString;
} else {
code += " data: " + repr(request.data) + ",\n";
}
} catch {
code += " data: " + repr(request.data) + ",\n";
if (commentedOutDataString) {
code += " // data: " + commentedOutDataString + ",\n";
}
code += " data: " + dataString + ",\n";
} else if (request.multipartUploads) {
code += " data: formData,\n";
code += " data: form,\n";
}
// the only other http method that sends data
if (method !== "options") {
warnings.push([
"bad-method",
"axios doesn't send data: with " + method + " requests",
]);
}
}
if (request.timeout) {
@@ -259,11 +236,157 @@ export const _toNodeAxios = (
code = code.slice(0, -2);
}
code += "\n}";
return code;
};
export const _toNodeAxios = (
request: Request,
warnings?: Warnings
): [string, Warnings] => {
warnings = warnings || [];
let importCode = "const axios = require('axios');\n";
const imports: Set<[string, string]> = new Set();
let code = "";
const hasSearchParams =
request.query &&
(!request.queryDict ||
// https://stackoverflow.com/questions/42898009/multiple-fields-with-same-key-in-query-params-axios-request
Object.values(request.queryDict).some((qv) => Array.isArray(qv)));
if (hasSearchParams && request.query) {
code += "const params = new URLSearchParams();\n";
for (const [key, value] of request.query) {
const val = value ? value : "";
code += "params.append(" + repr(key) + ", " + repr(val) + ");\n";
}
code += "\n";
}
if (request.multipartUploads) {
imports.add(["FormData", "form-data"]);
code += "const form = new FormData();\n";
for (const {
name,
filename,
content,
contentFile,
} of request.multipartUploads) {
code += "form.append(" + repr(name) + ", ";
if (contentFile === "-") {
code += "fs.readFileSync(0).toString()";
imports.add(["fs", "fs"]);
} else if (contentFile) {
code += "fs.readFileSync(" + repr(contentFile) + ")";
imports.add(["fs", "fs"]);
} else {
code += repr(content as string);
}
if (filename && filename !== name) {
code += ", " + repr(filename);
}
code += ");\n";
}
code += "\n";
}
const method = request.method.toLowerCase();
const methods = ["get", "delete", "head", "options", "post", "put", "patch"];
code += "const response = await axios";
if (methods.includes(method)) {
code += "." + method;
}
code += "(";
const url =
request.queryDict || hasSearchParams
? request.urlWithoutQuery
: request.url;
// axios only supports posting data with these HTTP methods
// You can also post data with OPTIONS, but that has to go in the config object
const dataMethods = ["post", "put", "patch"];
let needsConfig = !!(
request.query ||
request.queryDict ||
request.headers ||
request.auth ||
request.multipartUploads ||
(request.data && !dataMethods.includes(method)) ||
request.timeout ||
request.proxy
);
const needsData =
dataMethods.includes(method) &&
(request.data || request.multipartUploads || needsConfig);
let dataString, commentedOutDataString;
if (needsData) {
code += "\n";
code += " " + repr(url) + ",\n";
if (request.data) {
try {
[dataString, commentedOutDataString] = getDataString(request);
if (!dataString) {
dataString = repr(request.data);
}
} catch {
dataString = repr(request.data);
}
if (commentedOutDataString) {
code += " // " + commentedOutDataString + ",\n";
}
code += " " + dataString;
} else if (request.multipartUploads) {
code += " form";
} else if (needsConfig) {
// TODO: this works but maybe undefined would be more correct?
code += " ''";
}
} else {
code += repr(url);
}
// getDataString() can delete a header, so we can end up with an empty config
needsConfig = !!(
request.query ||
request.queryDict ||
(request.headers && request.headers.length) ||
request.auth ||
request.multipartUploads ||
(request.data && !dataMethods.includes(method)) ||
request.timeout ||
request.proxy
);
if (needsConfig) {
const config = buildConfigObject(
request,
method,
methods,
dataMethods,
!!hasSearchParams,
warnings
);
if (needsData) {
code += ",\n";
for (const line of config.split("\n")) {
code += " " + line + "\n";
}
} else {
code += ", ";
code += config;
}
} else if (needsData) {
code += "\n";
}
code += ");\n";
for (const [imp, varName] of Array.from(imports).sort()) {
const bySecondElem = (a: [string, string], b: [string, string]): number =>
a[1].localeCompare(b[1]);
for (const [varName, imp] of Array.from(imports).sort(bySecondElem)) {
importCode += "const " + varName + " = require(" + repr(imp) + ");\n";
}

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('localhost:28139', {
const response = await axios.post(
'localhost:28139',
{},
{
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify({})
});
}
}
);

View File

@@ -1,3 +1,3 @@
const axios = require('axios');
const response = await axios('httpbin.org/test');
const response = await axios.get('httpbin.org/test');

View File

@@ -1,9 +1,12 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/CurlToNode', {
const response = await axios.post(
'http://localhost:28139/CurlToNode',
'18233982904',
{
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
data: JSON.stringify(18233982904)
});
}
}
);

View File

@@ -1,6 +1,9 @@
const axios = require('axios');
const response = await axios.put('http://localhost:28139/v2/alerts_policy_channels.json', {
const response = await axios.put(
'http://localhost:28139/v2/alerts_policy_channels.json',
'',
{
params: {
'policy_id': 'policy_id',
'channel_ids': 'channel_id'
@@ -9,4 +12,5 @@ const response = await axios.put('http://localhost:28139/v2/alerts_policy_channe
'X-Api-Key': '{admin_api_key}',
'Content-Type': 'application/json'
}
});
}
);

View File

@@ -1,15 +1,21 @@
const axios = require('axios');
const FormData = require('form-data');
const formData = new FormData();
formData.append('from', 'test@tester.com');
formData.append('to', 'devs@tester.net');
formData.append('subject', 'Hello');
formData.append('text', 'Testing the converter!');
const form = new FormData();
form.append('from', 'test@tester.com');
form.append('to', 'devs@tester.net');
form.append('subject', 'Hello');
form.append('text', 'Testing the converter!');
const response = await axios.post('http://localhost:28139/v3', {
const response = await axios.post(
'http://localhost:28139/v3',
form,
{
headers: {
...form.getHeaders()
},
auth: {
username: 'test'
},
data: formData
});
}
}
);

View File

@@ -1,12 +1,10 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/post', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
const response = await axios.post(
'http://localhost:28139/post',
new URLSearchParams({
'data1': 'data1',
'data2': 'data2',
'data3': 'data3'
}
});
})
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.patch('http://localhost:28139/patch', {
const response = await axios.patch(
'http://localhost:28139/patch',
'item[]=1&item[]=2&item[]=3',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'item[]=1&item[]=2&item[]=3'
});
}
}
);

View File

@@ -2,9 +2,15 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('file1', fs.readFileSync('./fixtures/curl_commands/delete.sh'), './fixtures/curl_commands/delete.sh');
const form = new FormData();
form.append('file1', fs.readFileSync('./fixtures/curl_commands/delete.sh'), './fixtures/curl_commands/delete.sh');
const response = await axios.patch('http://localhost:28139/patch', {
data: formData
});
const response = await axios.patch(
'http://localhost:28139/patch',
form,
{
headers: {
...form.getHeaders()
}
}
);

View File

@@ -2,11 +2,17 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('file1', fs.readFileSync('./fixtures/curl_commands/delete.sh'), './fixtures/curl_commands/delete.sh');
formData.append('form1', 'form+data+1');
formData.append('form2', 'form_data_2');
const form = new FormData();
form.append('file1', fs.readFileSync('./fixtures/curl_commands/delete.sh'), './fixtures/curl_commands/delete.sh');
form.append('form1', 'form+data+1');
form.append('form2', 'form_data_2');
const response = await axios.patch('http://localhost:28139/patch', {
data: formData
});
const response = await axios.patch(
'http://localhost:28139/patch',
form,
{
headers: {
...form.getHeaders()
}
}
);

View File

@@ -1,12 +1,10 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/post', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
const response = await axios.post(
'http://localhost:28139/post',
new URLSearchParams({
'data1': 'data1',
'data2': 'data2',
'data3': 'data3'
}
});
})
);

View File

@@ -1,10 +1,16 @@
const axios = require('axios');
const FormData = require('form-data');
const formData = new FormData();
formData.append('d1', 'data1');
formData.append('d2', 'data');
const form = new FormData();
form.append('d1', 'data1');
form.append('d2', 'data');
const response = await axios.post('http://localhost:28139/post', {
data: formData
});
const response = await axios.post(
'http://localhost:28139/post',
form,
{
headers: {
...form.getHeaders()
}
}
);

View File

@@ -2,11 +2,10 @@ const axios = require('axios');
const response = await axios.get('http://localhost:28139/echo/html/', {
headers: {
'Origin': 'http://fiddle.jshell.net',
'Content-Type': 'application/x-www-form-urlencoded'
'Origin': 'http://fiddle.jshell.net'
},
data: {
data: new URLSearchParams({
'msg1': 'value1',
'msg2': 'value2'
}
})
});

View File

@@ -2,13 +2,17 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('attributes', '{"name":"tigers.jpeg", "parent":{"id":"11446498"}}');
formData.append('file', fs.readFileSync('myfile.jpg'), 'myfile.jpg');
const form = new FormData();
form.append('attributes', '{"name":"tigers.jpeg", "parent":{"id":"11446498"}}');
form.append('file', fs.readFileSync('myfile.jpg'), 'myfile.jpg');
const response = await axios.post('https://localhost:28139/api/2.0/files/content', {
const response = await axios.post(
'https://localhost:28139/api/2.0/files/content',
form,
{
headers: {
...form.getHeaders(),
'Authorization': 'Bearer ACCESS_TOKEN'
},
data: formData
});
}
}
);

View File

@@ -2,14 +2,18 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('attributes', '{"name":"tigers.jpeg", "parent":{"id":"11446498"}}');
formData.append('file', fs.readFileSync('myfile.jpg'), 'myfile.jpg');
const form = new FormData();
form.append('attributes', '{"name":"tigers.jpeg", "parent":{"id":"11446498"}}');
form.append('file', fs.readFileSync('myfile.jpg'), 'myfile.jpg');
const response = await axios.post('https://localhost:28139/api/2.0/files/content', {
const response = await axios.post(
'https://localhost:28139/api/2.0/files/content',
form,
{
headers: {
...form.getHeaders(),
'Authorization': 'Bearer ACCESS_TOKEN',
'X-Nice': 'Header'
},
data: formData
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('https://localhost:28139/webservices/rest.php', {
const response = await axios.post(
'https://localhost:28139/webservices/rest.php',
'version=1.2&auth_user=fdgxf&auth_pwd=oxfdscds&json_data={ "operation": "core/get", "class": "Software", "key": "key" }',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'version=1.2&auth_user=fdgxf&auth_pwd=oxfdscds&json_data={ "operation": "core/get", "class": "Software", "key": "key" }'
});
}
}
);

29
test/fixtures/node-axios/patch.js generated vendored
View File

@@ -1,16 +1,9 @@
const axios = require('axios');
const response = await axios.patch('http://localhost:28139/go/api/agents/adb9540a-b954-4571-9d9b-2f330739d4da', {
headers: {
'Accept': 'application/vnd.go.cd.v4+json',
'Content-Type': 'application/json'
},
auth: {
username: 'username',
password: 'password'
},
// data: '{\n "hostname": "agent02.example.com",\n "agent_config_state": "Enabled",\n "resources": ["Java","Linux"],\n "environments": ["Dev"]\n }',
data: JSON.stringify({
const response = await axios.patch(
'http://localhost:28139/go/api/agents/adb9540a-b954-4571-9d9b-2f330739d4da',
// '{\n "hostname": "agent02.example.com",\n "agent_config_state": "Enabled",\n "resources": ["Java","Linux"],\n "environments": ["Dev"]\n }',
{
'hostname': 'agent02.example.com',
'agent_config_state': 'Enabled',
'resources': [
@@ -20,5 +13,15 @@ const response = await axios.patch('http://localhost:28139/go/api/agents/adb9540
'environments': [
'Dev'
]
})
});
},
{
headers: {
'Accept': 'application/vnd.go.cd.v4+json',
'Content-Type': 'application/json'
},
auth: {
username: 'username',
password: 'password'
}
}
);

View File

@@ -1,14 +1,14 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/api/oauth/token/', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
const response = await axios.post(
'http://localhost:28139/api/oauth/token/',
new URLSearchParams({
'grant_type': 'client_credentials'
}),
{
auth: {
username: 'foo',
password: 'bar'
},
data: {
'grant_type': 'client_credentials'
}
});
}
);

View File

@@ -1,9 +1,12 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/american-art/query', {
const response = await axios.post(
'http://localhost:28139/american-art/query',
'@./sample.sparql',
{
headers: {
'Content-type': 'application/sparql-query',
'Accept': 'application/sparql-results+json'
},
data: '@./sample.sparql'
});
}
}
);

View File

@@ -1,35 +1,8 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/api/service.svc', {
params: {
'action': 'CreateItem',
'ID': '-37',
'AC': '1'
},
headers: {
'Cookie': 'X-BackEndCookie=S-1-5-21-1234556-56678-12345-2345=alphanumericstring12345/anotheralphanumericstring12345/scsiAdf/P; ClientId=LoremIupsum; PrivateComputer=true; PBack=0; cadata=bx88rrCBehITlBWSozO2l2hlFGu//JjT1/k6dewX5shV32jANUZSMU6GR+M25B6YpBODEgXzxfIHDnvxNC6SJoaE/d8RWX3uDnbkd+m91jNhMXNSYIRYTJHVFdPG06AE; cadataTTL=NfDhBViTJMUdC+ir+6BYvg==; cadataKey=qUY+OLTD9V14CFK6/CUPyrJWMxl1FFqZFjB8/qcS0/q55eqGvP9bWvX+XuSYVv3hIGAn9QNPhIDK6NP9LwCBdu25f2BUFDUWJruGO8MW02izSWzRUnni00xWQq3Y3nNKvpvO+OIR641BPHVZ0+lzCw2Wt8uzEnryCWAjlleozF/XWjpTN4/AaTmcIjEZUDN+fo4494rD0mADtEHv2gmd5mhLe+iyii/L9nAB3UuiJomwbRbKgy22Tj8cyavmLC4ZaViqW9E102NOLU4FYLgdZVET+mbdg==; cadataIV=bTM88YL1zmz7FsBEB0y3nI2SrdSTy+KLxCpx2FRfIZYFo2spN1IHQMSCT76OXrg79sVPhyqXk+N9rOj6M9KsQl4KqMNVBcoXgp24POpgoTwd4FBmKtAYbd9SDErna3jrMO168ML9PDG18K3CnBf6YG1tsIs0gXOEP9LzHVmUPF7KCKqUFiOiZGWuwmPhl85eo77BbEpVN2JkPnzuQWn6tC0cY4f2cJDlr3Z23SrAUVwwXmgRg2DXfOF5MIEkpwYiiI6sABCD9rsSnE6zTXlvZg33hjiD/ywUV1ZWjI2M/4zBixa4s150+dOnMmvtEFs/nOMnvMJui4PEDlTA==; cadataSig=WL3hB+av7sO3bzjL+Efe5b4exnvQxSInH3U5jDvfnPcttSp0XUF3y/NB573C0CTBYuOH/40smFssXlrKhT9tG2ITivdSIIamOmarmC8XwFOv9qQIFMHofcO/jjRDMqF0qRk7WBAC2FgBQrf2Tvq7wk5IX/JHn6zhlgKALAAqH9L9JNC244etnjj9YNaMDYEHV2M2jVTu3FsELqw1rSSqp0hEBlh+aFBvYCBg5hS1mVI76ZCHZVa0OUejiH2yiZyJIKHUI+Sv0rpU3iiQNtIFmGEdwhoo/rga4s4Dc2UsJLQ8c0yGlZgflYs+7Q5gPr74/mTUin60ej/w3M0roUl3FQ==; UC=d8be544621964f3c9865b3ee872fd432; AppcacheVer=15.0.1236.3:en-usbase; X-OWA-CANARY=VOXQP6xtGkiNnv7E4rFt8TrmclqVFtQI4IJqZflrR7Wz9AMPkMsFoyAlquw1YGsTUxIkVouAcvk.',
'Origin': 'https://nih.mail.edu.fr',
'Accept-Encoding': 'gzip, deflate, br',
'X-EWS-TargetVersion': '2.5',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Action': 'CreateItem',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive',
'X-OWA-CANARY': 'VOXQP6xtGkiNnv7E4rFt8TrmclqVFtQI4IJqZflrR7Wz9AMPkMsFoyAlquw1YGsTUxIkVouAcvk.',
'X-OWA-ActionName': 'CreateMessageForComposeSend',
'X-OWA-ActionId': '-37',
'X-OWA-ServiceUnavailableOnTransientError': 'true',
'Content-Type': 'application/json; charset=UTF-8',
'Accept': '*/*',
'Referer': 'https://localhost/api/',
'X-OWA-ClientBuildVersion': '15.0.1236.3',
'X-OWA-CorrelationId': '2f11f8fb-f6c6-43a5-881d-8a1b242a4e70_148023102251337',
'DNT': '1',
'X-OWA-ClientBegin': '2016-11-27T07:17:02.513',
'X-OWA-Attempt': '1'
},
data: JSON.stringify({
const response = await axios.post(
'http://localhost:28139/api/service.svc',
{
'__type': 'CreateItemJsonRequest:#Exchange',
'Header': {
'__type': 'JsonRequestHeaders:#Exchange',
@@ -77,5 +50,35 @@ const response = await axios.post('http://localhost:28139/api/service.svc', {
'MessageDisposition': 'SendAndSaveCopy',
'ComposeOperation': 'newMail'
}
})
});
},
{
params: {
'action': 'CreateItem',
'ID': '-37',
'AC': '1'
},
headers: {
'Cookie': 'X-BackEndCookie=S-1-5-21-1234556-56678-12345-2345=alphanumericstring12345/anotheralphanumericstring12345/scsiAdf/P; ClientId=LoremIupsum; PrivateComputer=true; PBack=0; cadata=bx88rrCBehITlBWSozO2l2hlFGu//JjT1/k6dewX5shV32jANUZSMU6GR+M25B6YpBODEgXzxfIHDnvxNC6SJoaE/d8RWX3uDnbkd+m91jNhMXNSYIRYTJHVFdPG06AE; cadataTTL=NfDhBViTJMUdC+ir+6BYvg==; cadataKey=qUY+OLTD9V14CFK6/CUPyrJWMxl1FFqZFjB8/qcS0/q55eqGvP9bWvX+XuSYVv3hIGAn9QNPhIDK6NP9LwCBdu25f2BUFDUWJruGO8MW02izSWzRUnni00xWQq3Y3nNKvpvO+OIR641BPHVZ0+lzCw2Wt8uzEnryCWAjlleozF/XWjpTN4/AaTmcIjEZUDN+fo4494rD0mADtEHv2gmd5mhLe+iyii/L9nAB3UuiJomwbRbKgy22Tj8cyavmLC4ZaViqW9E102NOLU4FYLgdZVET+mbdg==; cadataIV=bTM88YL1zmz7FsBEB0y3nI2SrdSTy+KLxCpx2FRfIZYFo2spN1IHQMSCT76OXrg79sVPhyqXk+N9rOj6M9KsQl4KqMNVBcoXgp24POpgoTwd4FBmKtAYbd9SDErna3jrMO168ML9PDG18K3CnBf6YG1tsIs0gXOEP9LzHVmUPF7KCKqUFiOiZGWuwmPhl85eo77BbEpVN2JkPnzuQWn6tC0cY4f2cJDlr3Z23SrAUVwwXmgRg2DXfOF5MIEkpwYiiI6sABCD9rsSnE6zTXlvZg33hjiD/ywUV1ZWjI2M/4zBixa4s150+dOnMmvtEFs/nOMnvMJui4PEDlTA==; cadataSig=WL3hB+av7sO3bzjL+Efe5b4exnvQxSInH3U5jDvfnPcttSp0XUF3y/NB573C0CTBYuOH/40smFssXlrKhT9tG2ITivdSIIamOmarmC8XwFOv9qQIFMHofcO/jjRDMqF0qRk7WBAC2FgBQrf2Tvq7wk5IX/JHn6zhlgKALAAqH9L9JNC244etnjj9YNaMDYEHV2M2jVTu3FsELqw1rSSqp0hEBlh+aFBvYCBg5hS1mVI76ZCHZVa0OUejiH2yiZyJIKHUI+Sv0rpU3iiQNtIFmGEdwhoo/rga4s4Dc2UsJLQ8c0yGlZgflYs+7Q5gPr74/mTUin60ej/w3M0roUl3FQ==; UC=d8be544621964f3c9865b3ee872fd432; AppcacheVer=15.0.1236.3:en-usbase; X-OWA-CANARY=VOXQP6xtGkiNnv7E4rFt8TrmclqVFtQI4IJqZflrR7Wz9AMPkMsFoyAlquw1YGsTUxIkVouAcvk.',
'Origin': 'https://nih.mail.edu.fr',
'Accept-Encoding': 'gzip, deflate, br',
'X-EWS-TargetVersion': '2.5',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
'Action': 'CreateItem',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive',
'X-OWA-CANARY': 'VOXQP6xtGkiNnv7E4rFt8TrmclqVFtQI4IJqZflrR7Wz9AMPkMsFoyAlquw1YGsTUxIkVouAcvk.',
'X-OWA-ActionName': 'CreateMessageForComposeSend',
'X-OWA-ActionId': '-37',
'X-OWA-ServiceUnavailableOnTransientError': 'true',
'Content-Type': 'application/json; charset=UTF-8',
'Accept': '*/*',
'Referer': 'https://localhost/api/',
'X-OWA-ClientBuildVersion': '15.0.1236.3',
'X-OWA-CorrelationId': '2f11f8fb-f6c6-43a5-881d-8a1b242a4e70_148023102251337',
'DNT': '1',
'X-OWA-ClientBegin': '2016-11-27T07:17:02.513',
'X-OWA-Attempt': '1'
}
}
);

View File

@@ -1,7 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139', {
const response = await axios.post(
'http://localhost:28139',
'',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo=\\"bar\\"',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo=\\"bar\\"'
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo=\\\'bar\\\'',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo=\\\'bar\\\''
});
}
}
);

View File

@@ -1,10 +1,16 @@
const axios = require('axios');
const FormData = require('form-data');
const formData = new FormData();
formData.append('username', 'davidwalsh');
formData.append('password', 'something');
const form = new FormData();
form.append('username', 'davidwalsh');
form.append('password', 'something');
const response = await axios.post('http://localhost:28139/post-to-me.php', {
data: formData
});
const response = await axios.post(
'http://localhost:28139/post-to-me.php',
form,
{
headers: {
...form.getHeaders()
}
}
);

View File

@@ -2,9 +2,15 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('image', fs.readFileSync('image.jpg'), 'image.jpg');
const form = new FormData();
form.append('image', fs.readFileSync('image.jpg'), 'image.jpg');
const response = await axios.post('http://localhost:28139/targetservice', {
data: formData
});
const response = await axios.post(
'http://localhost:28139/targetservice',
form,
{
headers: {
...form.getHeaders()
}
}
);

View File

@@ -1,12 +1,15 @@
const axios = require('axios');
const response = await axios.post('https://localhost:28139', {
const response = await axios.post(
'https://localhost:28139',
// '{ "drink": "coffe" }',
{
'drink': 'coffe'
},
{
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
// data: '{ "drink": "coffe" }',
data: JSON.stringify({
'drink': 'coffe'
})
});
}
}
);

View File

@@ -1,14 +1,17 @@
const axios = require('axios');
const response = await axios.post('https://localhost:28139/rest/login-sessions', {
headers: {
'Content-Type': 'application/json',
'X-API-Version': '200'
},
// data: '{"userName":"username123","password":"password123", "authLoginDomain":"local"}',
data: JSON.stringify({
const response = await axios.post(
'https://localhost:28139/rest/login-sessions',
// '{"userName":"username123","password":"password123", "authLoginDomain":"local"}',
{
'userName': 'username123',
'password': 'password123',
'authLoginDomain': 'local'
})
});
},
{
headers: {
'Content-Type': 'application/json',
'X-API-Version': '200'
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139', {
const response = await axios.post(
'http://localhost:28139',
'123',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: '123'
});
}
}
);

View File

@@ -1,10 +1,8 @@
const axios = require('axios');
const response = await axios.post('localhost:28139', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: {
const response = await axios.post(
'localhost:28139',
new URLSearchParams({
'field': 'don\'t you like quotes'
}
});
})
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo=bar&foo=&foo=barbar',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo=bar&foo=&foo=barbar'
});
}
}
);

View File

@@ -1,6 +1,9 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/ajax/demo_post.asp', {
const response = await axios.post(
'http://localhost:28139/ajax/demo_post.asp',
'',
{
headers: {
'Origin': 'http://www.w3schools.com',
'Accept-Encoding': 'gzip, deflate',
@@ -12,4 +15,5 @@ const response = await axios.post('http://localhost:28139/ajax/demo_post.asp', {
'Connection': 'keep-alive',
'Content-Length': '0'
}
});
}
);

View File

@@ -1,8 +1,12 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/endpoint', {
const response = await axios.post(
'http://localhost:28139/endpoint',
'',
{
headers: {
'Content-Type': 'application/json',
'key': 'abcdefg'
}
});
}
);

View File

@@ -1,6 +1,12 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/echo/html/', {
const response = await axios.post(
'http://localhost:28139/echo/html/',
new URLSearchParams({
'msg1': 'wow',
'msg2': 'such'
}),
{
headers: {
'Origin': 'http://fiddle.jshell.net',
'Accept-Encoding': 'gzip, deflate',
@@ -11,9 +17,6 @@ const response = await axios.post('http://localhost:28139/echo/html/', {
'Referer': 'http://fiddle.jshell.net/_display/',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive'
},
data: {
'msg1': 'wow',
'msg2': 'such'
}
});
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/post', {
const response = await axios.post(
'http://localhost:28139/post',
'{"title":"china1"}',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: '{"title":"china1"}'
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/post', {
const response = await axios.post(
'http://localhost:28139/post',
'msg1=wow&msg2=such&msg3=@rawmsg',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'msg1=wow&msg2=such&msg3=@rawmsg'
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('https://localhost:28139/post', {
const response = await axios.post(
'https://localhost:28139/post',
'secret=*%5*!',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'secret=*%5*!'
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo="bar"',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo="bar"'
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo="bar"',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo="bar"'
});
}
}
);

View File

@@ -2,17 +2,21 @@ const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');
const formData = new FormData();
formData.append('files', fs.readFileSync('47.htz'), '47.htz');
formData.append('name', '47');
formData.append('oldMediaId', '47');
formData.append('updateInLayouts', '1');
formData.append('deleteOldRevisions', '1');
const form = new FormData();
form.append('files', fs.readFileSync('47.htz'), '47.htz');
form.append('name', '47');
form.append('oldMediaId', '47');
form.append('updateInLayouts', '1');
form.append('deleteOldRevisions', '1');
const response = await axios.post('http://localhost:28139/api/library', {
const response = await axios.post(
'http://localhost:28139/api/library',
form,
{
headers: {
...form.getHeaders(),
'accept': 'application/json',
'Content-Type': 'multipart/form-data'
},
data: formData
});
}
}
);

View File

@@ -1,6 +1,9 @@
const axios = require('axios');
const response = await axios.post('https://localhost:28139', {
const response = await axios.post(
'https://localhost:28139',
'a=b&c="&d=\'',
{
headers: {
'A': '\'\'a\'',
'B': '"',
@@ -10,6 +13,6 @@ const response = await axios.post('https://localhost:28139', {
auth: {
username: 'ol\'',
password: 'asd"'
},
data: 'a=b&c="&d=\''
});
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/', {
const response = await axios.post(
'http://localhost:28139/',
'foo=\'bar\'',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: 'foo=\'bar\''
});
}
}
);

View File

@@ -1,6 +1,12 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/echo/html/', {
const response = await axios.post(
'http://localhost:28139/echo/html/',
new URLSearchParams({
'msg1': 'wow',
'msg2': 'such'
}),
{
headers: {
'Origin': 'http://fiddle.jshell.net',
'Accept-Encoding': 'gzip, deflate',
@@ -11,9 +17,6 @@ const response = await axios.post('http://localhost:28139/echo/html/', {
'Referer': 'http://fiddle.jshell.net/_display/',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive'
},
data: {
'msg1': 'wow',
'msg2': 'such'
}
});
}
);

View File

@@ -1,17 +1,8 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/api/Listing.svc/PropertySearch_Post', {
headers: {
'Origin': 'http://www.realtor.ca',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': '*/*',
'Referer': 'http://www.realtor.ca/Residential/Map.aspx',
'Connection': 'keep-alive'
},
data: {
const response = await axios.post(
'http://localhost:28139/api/Listing.svc/PropertySearch_Post',
new URLSearchParams({
'CultureId': '1',
'ApplicationId': '1',
'RecordsPerPage': '200',
@@ -33,5 +24,17 @@ const response = await axios.post('http://localhost:28139/api/Listing.svc/Proper
'Latitude': '43.6552047278685',
'ZoomLevel': '13',
'CurrentPage': '1'
}),
{
headers: {
'Origin': 'http://www.realtor.ca',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': '*/*',
'Referer': 'http://www.realtor.ca/Residential/Map.aspx',
'Connection': 'keep-alive'
}
});
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.post('http://localhost:28139/api/xxxxxxxxxxxxxxxx', {
const response = await axios.post(
'http://localhost:28139/api/xxxxxxxxxxxxxxxx',
'{"keywords":"php","page":1,"searchMode":1}',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: '{"keywords":"php","page":1,"searchMode":1}'
});
}
}
);

View File

@@ -1,12 +1,15 @@
const axios = require('axios');
const response = await axios.put('http://localhost:28139/test/_security', {
const response = await axios.put(
'http://localhost:28139/test/_security',
'{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
auth: {
username: 'admin',
password: '123'
},
data: '{"admins":{"names":[], "roles":[]}, "readers":{"names":["joe"],"roles":[]}}'
});
}
}
);

View File

@@ -1,15 +1,18 @@
const axios = require('axios');
const response = await axios.put('http://localhost:28139/twitter/_mapping/user?pretty', {
headers: {
'Content-Type': 'application/json'
},
// data: '{"properties": {"email": {"type": "keyword"}}}',
data: JSON.stringify({
const response = await axios.put(
'http://localhost:28139/twitter/_mapping/user?pretty',
// '{"properties": {"email": {"type": "keyword"}}}',
{
'properties': {
'email': {
'type': 'keyword'
}
}
})
});
},
{
headers: {
'Content-Type': 'application/json'
}
}
);

View File

@@ -1,8 +1,11 @@
const axios = require('axios');
const response = await axios.put('http://localhost:28139/upload', {
const response = await axios.put(
'http://localhost:28139/upload',
'@new_file',
{
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
data: '@new_file'
});
}
}
);

19
test/fixtures/node-axios/put_xput.js generated vendored
View File

@@ -1,15 +1,18 @@
const axios = require('axios');
const response = await axios.put('http://localhost:28139/twitter/_mapping/user?pretty', {
headers: {
'Content-Type': 'application/json'
},
// data: '{"properties": {"email": {"type": "keyword"}}}',
data: JSON.stringify({
const response = await axios.put(
'http://localhost:28139/twitter/_mapping/user?pretty',
// '{"properties": {"email": {"type": "keyword"}}}',
{
'properties': {
'email': {
'type': 'keyword'
}
}
})
});
},
{
headers: {
'Content-Type': 'application/json'
}
}
);

View File

@@ -1,5 +1,3 @@
const axios = require('axios');
const response = await axios.request('localhost:28139', {
method: 'what'
});
const response = await axios('localhost:28139');