httputils.js


'use strict';

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

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 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 makeDoGetTo(targetHost, targetPort) {
    return (uri, cOpts) => {
        return new Promise((resolve, reject) => {
            let opts = {
                hostname: targetHost,
                port: targetPort,
                path: uri,
                method: 'GET',
                headers: {
                    Cookie: packCookie(cOpts)
                }
            };
            let req = http.request(opts, getResDo((res, rs) => resolve({
                response: rs,
                cookie: parseCookies(res),
                oldCookie: cOpts
            })));
            req.end();
        });
    }
}


function makeDoPostTo(targetHost, targetPort) {
    return (uri, postdata, cOpts) => {
        return new Promise((resolve, reject) => {
            let data = querystring.stringify(postdata);
            let postOpts = {
                hostname: targetHost,
                port: targetPort,
                path: uri,
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Content-Length': data.length,
                    Cookie: packCookie(cOpts)
                }
            };
            let req = http.request(postOpts, getResDo(
                (res, rs) => resolve({
                    response: rs,
                    cookie: parseCookies(res),
                    oldCookie: cOpts
                })
            ));
            req.end(data);
        });
    }
}

module.exports = {
    makeDoGetTo,
    makeDoPostTo
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值