mirror of
https://github.com/tenrok/axios.git
synced 2026-06-08 17:22:34 +03:00
fix(headers): fixed support for setting multiple header values from an iterated source; (#6885)
This commit is contained in:
@@ -101,12 +101,17 @@ class AxiosHeaders {
|
||||
} else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
|
||||
setHeaders(parseHeaders(header), valueOrRewrite);
|
||||
} else if (utils.isObject(header) && utils.isIterable(header)) {
|
||||
let obj = {}, dest, key;
|
||||
for (const entry of header) {
|
||||
if (!utils.isArray(entry)) {
|
||||
throw TypeError('Object iterator must return a key-value pair');
|
||||
}
|
||||
setHeader(entry[1], entry[0], rewrite);
|
||||
|
||||
obj[key = entry[0]] = (dest = obj[key]) ?
|
||||
(utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];
|
||||
}
|
||||
|
||||
setHeaders(obj, valueOrRewrite)
|
||||
} else {
|
||||
header != null && setHeader(valueOrRewrite, header, rewrite);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
|
||||
export const retryNetwork = async (fn, retries = 3, delay = 1000) => {
|
||||
let attempt = 0, sleep;
|
||||
|
||||
do {
|
||||
try {
|
||||
return await fn()
|
||||
} catch (err) {
|
||||
if (err.code === 'ERR_NETWORK' && attempt++ < retries) {
|
||||
sleep = attempt * attempt * delay;
|
||||
console.warn(`[ERR_NETWORK]: Attempt ${attempt}/${retries}${err.config ? ' [' + err.config.url + ']' : ''} sleep [${sleep}ms]`);
|
||||
await new Promise(resolve => setTimeout(resolve, sleep));
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
@@ -1,13 +1,16 @@
|
||||
import {retryNetwork} from "../helpers/retry.js";
|
||||
|
||||
describe('FormData', function() {
|
||||
it('should allow FormData posting', function () {
|
||||
return axios.postForm('http://httpbin.org/post', {
|
||||
a: 'foo',
|
||||
b: 'bar'
|
||||
}).then(({data}) => {
|
||||
expect(data.form).toEqual({
|
||||
it('should allow FormData posting', async () => {
|
||||
await retryNetwork(() => {
|
||||
return axios.postForm('http://httpbin.org/post', {
|
||||
a: 'foo',
|
||||
b: 'bar'
|
||||
}).then(({data}) => {
|
||||
expect(data.form).toEqual({
|
||||
a: 'foo',
|
||||
b: 'bar'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import AxiosHeaders from '../../../lib/core/AxiosHeaders.js';
|
||||
import assert from 'assert';
|
||||
|
||||
const [nodeMajorVersion] = process.versions.node.split('.').map(v => parseInt(v, 10));
|
||||
|
||||
describe('AxiosHeaders', function () {
|
||||
it('should support headers argument', function () {
|
||||
@@ -82,6 +83,27 @@ describe('AxiosHeaders', function () {
|
||||
|
||||
assert.strictEqual(headers.get('x'), '123');
|
||||
});
|
||||
|
||||
it('should support setting multiple header values from an iterable source', function () {
|
||||
if (nodeMajorVersion < 18) {
|
||||
this.skip();
|
||||
return;
|
||||
}
|
||||
|
||||
const headers = new AxiosHeaders();
|
||||
|
||||
const nativeHeaders = new Headers();
|
||||
|
||||
nativeHeaders.append('set-cookie', 'foo');
|
||||
nativeHeaders.append('set-cookie', 'bar');
|
||||
nativeHeaders.append('set-cookie', 'baz');
|
||||
nativeHeaders.append('y', 'qux');
|
||||
|
||||
headers.set(nativeHeaders);
|
||||
|
||||
assert.deepStrictEqual(headers.get('set-cookie'), ['foo', 'bar', 'baz']);
|
||||
assert.strictEqual(headers.get('y'), 'qux');
|
||||
});
|
||||
});
|
||||
|
||||
it('should support uppercase name mapping for names overlapped by class methods', () => {
|
||||
|
||||
Reference in New Issue
Block a user