Skip to content

Instantly share code, notes, and snippets.

@cyrilis
Created March 19, 2014 15:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cyrilis/9644051 to your computer and use it in GitHub Desktop.
Save cyrilis/9644051 to your computer and use it in GitHub Desktop.
an proxy for resolve crossdomain problem of json api .usage : node api_proxy -d www.sample_domain.com -p 4000
var server = require('http');
var remoteServer = process.argv.indexOf('-d')>0 ? process.argv[process.argv.indexOf('-d')+1]:"www.douban.com";
var listenPort = process.argv.indexOf('-p')>0 ? +process.argv[process.argv.indexOf('-p')+1]: process.env.PORT || 4000;
var http = require('http');
server.createServer(function(q,s){
// console.dir(q);
var headers = q.headers;
headers.host = remoteServer;
q.method === "GET" ? delete headers['Content-length']: console.log('Content-length:',headers['Content-lenght']);
var options = {
hostname: remoteServer,
host: remoteServer,
path: q.url,
port: 80,
method: q.method,
headers: headers
};
// console.log(options);
var request = http.request(options, function(res){
console.log(options.hostname+options.path);
res.setEncoding('binary');
s.setHeader("Access-Control-Allow-Origin", "*");
s.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
s.writeHead(res.statusCode,res.headers);
res.on('data', function (chunk) {
s.write(chunk,'binary');
});
res.on('end', function(){
s.end();
request.end();
});
res.on('error', function ( e ){
console.log( 'Error with client ', e );
request.end();
console.log('DATA-ERROR');
});
});
request.on('error', function(e) {
console.log(e);
s.end('<h1>ERROR WHILE REQUEST REMOTE URL... =_=</h1>');
console.log('REQUEST-ERROR');
});
if(q.method==='GET'){
request.write('\n');
}
var request_data = "";
q.on('data', function ( chunk ){
console.log( 'Write to server ', chunk.length );
console.log( chunk.toString( 'utf8' ) );
request_data = request_data + chunk;
request.write( chunk, 'binary' );
} );
q.on( 'end', function(){
console.log( 'End chunk write to server' );
} );
q.on( 'error', function ( e ){
console.log( 'Problem with request ', e );
} );
}).listen(listenPort);
console.log( 'Proxy started on port ' + listenPort +", API domain is set to: "+ remoteServer );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment