The idea is very simple:
1. httpserver gets the url that needs to be restored;
2. Use httpclient to recursively request this url until http status not in (302, 301) is found.
3. Return to the restored original url.
Okay, the code is as follows:
var net = require('net'),
http = require('http'),
url = require('url'),
fs = require('fs');
var DEFAULT_PORTS = {
'http:': 80,
'https:': 443
};
var INDEX_TPL = fs.readFileSync('index.html');
function _write( str, res, content_type) {
if(res.jsonp_cb) {
str = res.jsonp_cb '("' str '")';
}
res.writeHead(200, {
'Content-Length': str.length,
'Content-Type': content_type || 'text/plain'
});
res.end(str);
};
function expand(short_url, res) {
var info = url.parse(short_url);
// console.log('info: ' JSON.stringify(info));
if( info.protocol != 'http:') { // Unable to request https url?
_write(short_url, res);
return;
}
var client = http.createClient(info. port || DEFAULT_PORTS[info.protocol], info.hostname);
var path = info.pathname || '/';
if(info.search) {
path = info.search;
}
var headers = {
host: info.hostname,
'User-Agent': 'NodejsSpider/1.0'
};
var request = client.request('GET ', path, headers);
request.end();
request.on('response', function (response) {
if(response.statusCode == 302 || response.statusCode == 301) {
expand(response.headers.location, res);
} else {
_write(short_url, res);
}
});
};
//expand('http://sinaurl.cn/hbMUII');
// http service
http.createServer(function(req, res){
if(req.url.indexOf( '/api?') == 0) {
var params = url.parse(req.url, true);
if(params.query && params.query.u) {
if(params .query.cb) { // Support jsonp cross-domain request
res.jsonp_cb = params.query.cb;
}
expand(params.query.u, res);
} else {
_write('', res);
}
} else {
_write(INDEX_TPL, res, 'text/html');
}
}).listen(1235 );
process.on('uncaughtException', function (err) {
console.log('Caught exception: ' err);
});
Start you Web server:
$ node urlexpand.js
Open the browser to access directly:
http://127.0.0.1:1235/api?u=http://is.gd/imWyT
Or visit my test server:
http://yongwo.de:1235/api?u=http://is.gd/imWyT&cb=foo
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn