Skip to content

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

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions