forked from afeld/jsonp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
76 lines (60 loc) · 1.97 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
var express = require('express'),
url = require('url'),
request = require('request'),
u = require('underscore');
var app = express.createServer(
express.logger(),
express.static(__dirname + '/public')
);
function except(obj /*, properties */){
var result = u.extend({}, obj),
properties = u.rest(arguments);
properties.forEach(function(prop){
delete result[prop];
});
return result;
}
app.get('/', function(req, res) {
var params = url.parse(req.url, true).query,
apiUrl = params.url || params.src;
if (!apiUrl){
res.render('index.ejs', {
layout: false,
host: req.headers.host
});
} else {
var externalReqHeaders = except(req.headers, 'accept-encoding', 'connection', 'cookie', 'host', 'user-agent');
externalReqHeaders.accept = 'application/json';
request({
uri: apiUrl,
strictSSL: false,
headers: externalReqHeaders
}, function(error, response, body){
// copy headers from the external request, but remove those that node should generate
var finalHeaders = except(response.headers, 'content-length', 'connection', 'server'),
callbackName = params.callback || params.jsonp,
status, json, finalBody;
finalHeaders['access-control-allow-origin'] = '*'; // allow cross-domain AJAX (CORS)
if (error){
status = 502; // bad gateway
json = JSON.stringify({ error: error.message || body });
} else {
status = response.statusCode;
json = body;
}
if (callbackName) {
finalHeaders['content-type'] = 'text/javascript';
finalBody = callbackName + '(' + json + ');';
} else {
// treat as an AJAX request
finalHeaders['content-type'] = 'application/json';
finalBody = json;
}
res.writeHead(status, finalHeaders);
res.end(finalBody);
});
}
});
var apiPort = process.argv[2] || 8000;
app.listen(apiPort);
console.log('Server running at http://127.0.0.1:' + apiPort);