2
0
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:
Dmitriy Mozgovoy
2025-04-23 19:24:08 +03:00
committed by GitHub
parent e61a8934d8
commit f7a3b5e0f7
4 changed files with 55 additions and 7 deletions
+6 -1
View File
@@ -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);
}
+18
View File
@@ -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);
}
+9 -6
View File
@@ -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'
});
});
});
});
+22
View File
@@ -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', () => {