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 server = http.createServer().listen(PORT, function(){ console.log('Proxy listening on: http://lvh.me:%s', PORT) }) server.on('request', function (req, res){ if ( req.method == 'GET' && ! req.url.match(/API/) ) { // public... return stream(req, res) } console.log(req.method, req.url) if (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 = 443 options.hostname = 'secure.api.yoox.biz' options.path = req.url req.pause() var connector = https.request(options, function(server_res) { console.log('>> GOT', server_res.statusCode) server_res.pause() res.writeHeader(server_res.statusCode, server_res.headers) server_res.pipe(res) if (req.method == 'GET') { cache[req.url] = '' server_res.on('data', function(s){ cache[req.url] += s.toString() }) } server_res.resume() }) // req.on('data', function(s){ console.log('>>', s.toString()) }) req.on('error', function(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] }) 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-woff', } function stream (req, res) { var url = req.url.toLowerCase().split('?')[0] var ext_partz = url.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('./StoneIsland/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() }) */ }) }