- 如何控制cookie是浏览器/客户端的事情.
- 设置cookie的套路
- 顺带玩玩链式调用
'use strict';
const http = require('http');
const querystring = require('querystring');
const TargetHost = "localhost";
const TargetPort = 10011;
function getResDo(cb) {
return (res) => {
res.setEncoding('utf8');
let rs = '';
res.on('data', (chunk) => {
rs += `${chunk}`;
});
res.on('end', () => {
cb(res, rs);
});
};
}
function parseCookies(res) {
let list = {};
let ra = res.headers['set-cookie'];
if (ra) {
ra.forEach((rc) => {
rc && rc.split(';').forEach((cookie) => {
let parts = cookie.split('=');
list[parts.shift().trim()] = parts.join('=');
});
});
}
return list;
}
function packCookie(opts) {
let ar = [];
for (let k in opts) {
ar.push(`${k}=${opts[k]}`);
}
return ar.join("; ");
}
function doShutdown(cOpts) {
return new Promise((resolve, reject) => {
let req = http.request({
hostname: TargetHost,
port: TargetPort,
path: "/shutdown",
method: 'GET',
headers: {
Cookie: packCookie(cOpts)
}
}, getResDo((res, rs) => {
resolve(rs);
}));
req.end();
});
}
function makeLoginOptions(dataToPost) {
return {
hostname: TargetHost,
port: TargetPort,
path: '/login',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': dataToPost.length,
}
};
}
function doLogin() {
return new Promise((resolve, reject) => {
let postdata = querystring.stringify({
username: 'cartman',
password: 'poder'
});
let req = http.request(makeLoginOptions(postdata), getResDo((res, rs) => {
resolve(parseCookies(res));
}));
req.end(postdata);
});
}
doLogin().then((cookie) => {
console.log("before moving to next:\n%s", JSON.stringify(cookie, null, 4));
return doShutdown(cookie);
}).then((response) => {
console.log("She told me: %s", response);
});