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 = false var server = http.createServer().listen(PORT, function(){ console.log('Proxy listening on: http://lvh.me:%s', PORT) }) server.on('request', function (req, res){ if (DEBUG) { console.log("\n\n___________________________") } 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 if (DEBUG) { console.log(options.headers) console.log(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) cache[req.url] = '' server_res.on('data', function(s){ cache[req.url] += s.toString() }) if (DEBUG) { server_res.on('data', function(s){ console.log( s.toString() ) }) } server_res.resume() }) connector.on('response', function(e){ console.log(">> RESPONSE") }) connector.on('connect', function(e){ console.log(">> CONNECT") }) connector.on('error', function(e){ console.error(e) }) if (DEBUG) { 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-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('./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() }) */ }) }