nodejs带Cookie的POST操作

  1. 如何控制cookie是浏览器/客户端的事情.
  2. 设置cookie的套路
  3. 顺带玩玩链式调用

'use strict';

const http = require('http');
const querystring = require('querystring');

const TargetHost = "localhost";
const TargetPort = 10011;

//~ por ejemplo:
//~    name=eric&passwd=goodix

function getResDo(cb) {
    return (res) => {
        res.setEncoding('utf8');
        let rs = '';
        res.on('data', (chunk) => {
            rs += `${chunk}`;
        });
        res.on('end', () => {
            //console.log("response is %s", resJson);
            //console.log(res.headers);
            //console.log("====");
            //console.log(res.headers.cookie);// undefined
            //console.log(res.headers['set-cookie']); // an array 
            //console.log("Is an array: %s", Array.isArray(res.headers['set-cookie']));
            cb(res, rs);
        });
    };
}

function parseCookies(res) {
    let list = {};
    let ra = res.headers['set-cookie'];
    //~ not every response get a `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) => {
            //console.log(res);
            //console.log(parseCookies(res));
            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);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值