-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
时间有限 一起来探讨
先暂时给大伙看看最基础的代理部分 preweb/server.js
/* server.js */
var express = require('express')
//var httpProxy = require('http-proxy')
var _ = require('lodash')
var needle = require('needle')
var urllib = require('url')
var cookieParser = require('cookie-parser')
var session = require('express-session')
//var cookie = require('cookie')
var cookielib = require('./lib/cookie')
//var proxy = httpProxy.createProxyServer({})
//proxy.on('error', function(e){
// console.error('proxy error:', e)
//})
var app = express()
app.use(cookieParser('my secret here'))
app.use(session({
name: 'preweb.sid',
resave: false, // don't save session if unmodified
saveUninitialized: false, // don't create session until something stored
secret: 'keyboard cat'
}))
//var cookieclient = new cookielib.CookieClient()
// todo: cookie store
// todo: header lower/uppercase
app.use('/', function(req, res, next){
var host = req.query['_host']
if (host) return mirror(req, res, next)
next()
})
app.use('/', function(req, res){
res.status(400).send()
})
app.listen(9111)
function mirror(req, res, next){
var method = req.method
var urlobj = req._parsedUrl
var host = req.query['_host']
var domain = host.replace(/:.+$/, '')
var pathn = urlobj.pathname
//proxy.web(req, res, { target: 'http://localhost:9112' })
var myurlobj = _.clone(urlobj)
if (!myurlobj['protocol']) myurlobj['protocol'] = 'http:'
myurlobj['host'] = host
delete myurlobj['_host']
var headers = _.clone(req.headers)
headers['host'] = host
//console.log(cookieclient._list)
//console.log([domain, pathn, cookieclient.getCookie(domain, pathn)])
headers['cookie'] = decookie(domain, headers['cookie'])
//headers['cookie'] = cookieclient.getCookie(domain, pathn)
var options = {
headers: headers
}
var url = urllib.format(myurlobj)
//needle.request(method, url, null, options).pipe(res)
needle.request(method, url, null, options, function(err, myres){
//console.log(_.keys(myres))
//console.log(myres.headers)
if (err) return next(err)
var headers = _.clone(myres.headers)
var setcookie = headers['set-cookie']
headers['set-cookie'] = encookie(domain, headers['set-cookie'])
//cookieclient.setCookie(domain, setcookie)
res.header(headers)
// note: maybe no stream support
res.status(myres.statusCode).send(myres.body)
})
}
function encookie(domain, setcookie){
var prefix = d2prefix(domain)
var arr = cookielib.parseSetCookie(setcookie)
arr = _.map(arr, function(o){
o.key = prefix + o.key
return o
})
return cookielib.toSetCookie(arr)
}
function decookie(domain, cookie){
var prefix = d2prefix(domain)
var cookieobj = cookielib.parseCookie(cookie)
cookieobj = _.reduce(cookieobj, function(m, v, k){
if (k.indexOf(prefix) === 0) {
k = k.replace(prefix, '')
m[k] = v
}
return m
}, {})
return cookielib.toCookie(cookieobj)
}
function d2prefix(domain){
return 'pw::' + domain + '::'
}Metadata
Metadata
Assignees
Labels
No labels