Skip to content

二次设想(轻前端方案) #2

@fritx

Description

@fritx

时间有限 一起来探讨
先暂时给大伙看看最基础的代理部分 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions