mirror of
https://github.com/tenrok/axios.git
synced 2026-06-20 20:00:40 +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)) {
|
} else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
|
||||||
setHeaders(parseHeaders(header), valueOrRewrite);
|
setHeaders(parseHeaders(header), valueOrRewrite);
|
||||||
} else if (utils.isObject(header) && utils.isIterable(header)) {
|
} else if (utils.isObject(header) && utils.isIterable(header)) {
|
||||||
|
let obj = {}, dest, key;
|
||||||
for (const entry of header) {
|
for (const entry of header) {
|
||||||
if (!utils.isArray(entry)) {
|
if (!utils.isArray(entry)) {
|
||||||
throw TypeError('Object iterator must return a key-value pair');
|
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 {
|
} else {
|
||||||
header != null && setHeader(valueOrRewrite, header, rewrite);
|
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() {
|
describe('FormData', function() {
|
||||||
it('should allow FormData posting', function () {
|
it('should allow FormData posting', async () => {
|
||||||
return axios.postForm('http://httpbin.org/post', {
|
await retryNetwork(() => {
|
||||||
a: 'foo',
|
return axios.postForm('http://httpbin.org/post', {
|
||||||
b: 'bar'
|
|
||||||
}).then(({data}) => {
|
|
||||||
expect(data.form).toEqual({
|
|
||||||
a: 'foo',
|
a: 'foo',
|
||||||
b: 'bar'
|
b: 'bar'
|
||||||
|
}).then(({data}) => {
|
||||||
|
expect(data.form).toEqual({
|
||||||
|
a: 'foo',
|
||||||
|
b: 'bar'
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import AxiosHeaders from '../../../lib/core/AxiosHeaders.js';
|
import AxiosHeaders from '../../../lib/core/AxiosHeaders.js';
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
|
|
||||||
|
const [nodeMajorVersion] = process.versions.node.split('.').map(v => parseInt(v, 10));
|
||||||
|
|
||||||
describe('AxiosHeaders', function () {
|
describe('AxiosHeaders', function () {
|
||||||
it('should support headers argument', function () {
|
it('should support headers argument', function () {
|
||||||
@@ -82,6 +83,27 @@ describe('AxiosHeaders', function () {
|
|||||||
|
|
||||||
assert.strictEqual(headers.get('x'), '123');
|
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', () => {
|
it('should support uppercase name mapping for names overlapped by class methods', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user