summaryrefslogtreecommitdiff
path: root/app/server/proxy.js
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2018-06-02 13:40:43 +0200
committerJules Laplace <julescarbon@gmail.com>2018-06-02 13:40:43 +0200
commit015c9b3e7ec8b20308fc604d925a6e9c188aa42e (patch)
tree54dab9950e6dd73e1333f2e080cb123d4c1d9c1e /app/server/proxy.js
parenta6a529a5757417906f6df60ca7557fac3a380966 (diff)
pull in proxy from stone island
Diffstat (limited to 'app/server/proxy.js')
-rw-r--r--app/server/proxy.js178
1 files changed, 178 insertions, 0 deletions
diff --git a/app/server/proxy.js b/app/server/proxy.js
new file mode 100644
index 0000000..cebffb0
--- /dev/null
+++ b/app/server/proxy.js
@@ -0,0 +1,178 @@
+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 (USE_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.RELAY_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 (! options.headers['x-yoox-cart-token']) {
+ // 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('./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()
+// })
+// */
+// })
+// }