Trying to proxy an image in node-js/express
As usual, the simple solution is the best. Simply npm install request
and then use it like this:
var request = require('request');app.get('/fileThumbnail', function(req, res) { var url = proxiedURL +"?" + querystring.stringify(req.query); logger.info('/fileThumbnail going to url', url); request.get(url).pipe(res);});
Using pipe() didn't work for my version of Express, however this implemention did. It proxies http and https image urls.
Call with:
http://example.com/image?url=https%3A%2F%2Fwww.google.com%2Fimages%2Fbranding%2Fgooglelogo%2F2x%2Fgooglelogo_color_272x92dp.png
Source:
var url = require('url');var http = require('http');var https = require('https');app.get('/image', function (req, res) { var parts = url.parse(req.url, true); var imageUrl = parts.query.url; parts = url.parse(imageUrl); var filename = parts.pathname.split("/").pop(); var options = { port: (parts.protocol === "https:" ? 443 : 80), host: parts.hostname, method: 'GET', path: parts.path, accept: '*/*' }; var request = (options.port === 443 ? https.request(options) : http.request(options)); request.addListener('response', function (proxyResponse) { var offset = 0; var contentLength = parseInt(proxyResponse.headers["content-length"], 10); var body = new Buffer(contentLength); proxyResponse.setEncoding('binary'); proxyResponse.addListener('data', function(chunk) { body.write(chunk, offset, "binary"); offset += chunk.length; }); proxyResponse.addListener('end', function() { res.contentType(filename); res.write(body); res.end(); }); }); request.end();});