ladjs / superagent

Ajax for Node.js and browsers (JS HTTP client). Maintained for @forwardemail, @ladjs, @spamscanner, @breejs, @cabinjs, and @lassjs.
https://ladjs.github.io/superagent/
MIT License
16.57k stars 1.33k forks source link

[bug] Setting cookies does not take effect #1793

Open gongshun opened 5 months ago

gongshun commented 5 months ago

Describe the bug

Node.js version: v16.20.2 OS version: macOS 14.2.1 Description:

I use set('Cookie',[xxx]), but the cookie was not added to the request header

const request = require('supertest');
const server = require('./server.js');

const agent = request.agent(server);

const postRes = await agent.post('/verify').set('Cookie', [`csrf-token=xxxxx`]);

Actual behavior

Cookie is not added to the request header

Expected behavior

Cookies can be added to request headers

Code to reproduce

My code is as follows,The first time I set cookie, it can be added to the request header correctly.But the second time I set cookie, it was not added to the request header.

const request = require('supertest');
const server = require('./server.js');

const agent = request.agent(server);
const postRes = await agent.post('/verify').set('Cookie', [`csrf-token=xxxxx`]);
const postRes1 = await agent.post('/verify').set('Cookie', [`csrf-token=xxxxx`]);

I briefly checked this problem, It's because my server returned the set-cookie response header. Then the second request will only bring the cookie returned by the first request, but not the cookie I set.like this

Cookie: token=xxx

I hope that both the cookies returned by the first request and the cookies I set are added to the response headers correctly. like this

Cookie: csrf-token=xxxxx;token=xxx

I checked the source code

https://github.com/ladjs/superagent/blob/1c8338b2e0a3b8f604d08acc7f3cbe305be1e571/src/node/index.js#L856

image

hasOwn(this._header, 'cookie') return false, because of my set('Cookie',[xxx]) it will be added as header['Cookie']=[xxx],instead of header['cookie']=xxx

If I write like this, it will add the cookie to the header correctly

const postRes = await agent.post('/verify').set('Cookie', [`csrf-token=xxxxx`]);
const postRes1 = await agent.post('/verify').set('cookie', `csrf-token=xxxxx`);

I don't know if this is a bug or if it's by design

Checklist