var http = require('http') var https = require('https') var path = require('path') var fs = require('fs') var url = require('url') var PORT = 9090 var cache = {} var DEBUG = !!process.env.DEBUG_PROXY // var USE_CACHE = true export const attach = server => { console.log('attaching proxy') var evs = server.listeners('request').slice(0) server.removeAllListeners('request') server.on('request', function(req, res) { if (0 === req.url.indexOf('/api')) { serve(req, res) } else { for (var i = 0; i < evs.length; i++) { evs[i].call(server, req, res) } } }) } function serve(req, res) { if (DEBUG) { console.log("\n\n___________________________") } console.log(req.method, req.url) if (process.env.PROXY_CACHE && req.method == 'GET' && req.url in cache) { res.writeHeader(200, { 'Content-type': 'application/json' }) res.end(cache[req.url]) return } // console.log(req.headers) var options = {} options.headers = get_headers(req.headers) options.method = req.method options.port = process.env.SECURE_PROXY ? 443 : 80 options.hostname = process.env.PROXY_REMOTE options.path = req.url if (DEBUG) { console.log(options.headers) console.log(req.url) } req.pause() var connector = (process.env.SECURE_PROXY ? https : http).request(options, server_res => { console.log('>> GOT', server_res.statusCode) server_res.pause() res.writeHeader(server_res.statusCode, server_res.headers) server_res.pipe(res) if (process.env.PROXY_CACHE) { cache[req.url] = '' server_res.on('data', function(s){ cache[req.url] += s.toString() }) } if (DEBUG) { // server_res.on('data', s => console.log(s.toString())) } server_res.resume() }) connector.on('error', e => console.error(e)) if (DEBUG) { // req.on('data', s => console.log('>>', s.toString())) } req.on('error', s => { console.log('/!\\ ERROR /!\\'); console.log(s) }) req.pipe(connector) req.resume() } /* headers: { 'x-yoox-appname': auth.appname, 'x-yoox-account-token': auth.access_token, 'x-yoox-device': auth.device, 'x-yoox-api-key': auth.apikey, 'x-yoox-cart-token': cart.token, }, */ function get_headers (h){ var hh = {} // 'appname account-token device api-key cart-token'.split(' ').forEach(function(s){ // var key = 'x-yoox-' + s // if (key in h) hh[key] = h[key] // }) 'cookie'.split(' ').forEach(key => { if (key in h) hh[key] = h[key] }) hh['Content-Type'] = 'application/json' // h['content-type'] if ('content-length' in h) hh['Content-Length'] = h['content-length'] // if ('connection' in h) hh['Connection'] = h['connection'] return hh } // var mimes = { // 'gif': 'image/gif', // 'png': 'image/png', // 'jpg': 'image/jpeg', // 'jpeg': 'image/jpeg', // 'html': 'text/html', // 'js': 'application/javascript', // 'css': 'text/css', // 'woff': 'application/font-woff', // 'ttf': 'application/font-sfnt', // 'otf': 'application/font-sfnt', // 'svg': 'image/svg+xml', // } // function stream (req, res) { // var url = req.url.split('?')[0] // var ext_partz = url.toLowerCase().split('.'), ext = ext_partz[ext_partz.length-1] // var mime = mimes[ext] || 'application/octet-stream' // if (! url || url == '/') { // url = 'index.html' // mime = 'text/html' // } // if (url == '/cordova.js' || url == '/favicon.ico') { // res.writeHead(200, 'OK', { 'Content-type': 'application/javascript' }) // res.end('{}') // return // } // var file = path.resolve('./public/www/' + url) // fs.stat(file, function(err, stats) { // if (! stats) { // // console.log(404) // res.writeHead(404) // res.end('404') // return // } // var headers = { // 'Content-Length': stats.size, // 'Content-Type': mime, // } // res.writeHead(200, 'OK', headers) // var stream = fs.createReadStream(file, { start: 0, end: stats.size }) // stream.on('open', function() { // stream.pipe(res) // }) // stream.on('error', function(err) { // console.log(err) // stream.destroy() // res.end() // }) // stream.on('close', function(){ // stream.destroy() // res.end() // }) // /* // req.connection.setMaxListeners(50) // req.connection.on('close', function(){ // stream.destroy() // res.end() // }) // */ // }) // }