-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhq-metaredirects.js
40 lines (34 loc) · 1.53 KB
/
hq-metaredirects.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
var hq = require('hyperquext');
var url = require('url');
var attachCheerioToResponse = require('hyperquext-cheerio'),
redirector = hq.devcorators.redirector,
consumeForcedOption = hq.devcorators.consumeForcedOption,
getFinalRequestFromHyperquext = hq.helpers.getFinalRequestFromHyperquext,
getResponseFromClientRequest = hq.helpers.getResponseFromClientRequest;
module.exports = function hyperquextMeDirect(hyperquext) {
var expression = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
var regex = new RegExp(expression);
return redirector(function (uri, opts, cb) {
if (!opts.maxRedirects) return opts;
var req = consumeForcedOption(attachCheerioToResponse(hyperquext), 'cheerio')(uri, opts, cb);
getFinalRequestFromHyperquext(req, function (err, finalRequest) {
getResponseFromClientRequest(finalRequest, function (err, res) {
if (res['$redirect'] || !res.cheerio) return;
var $ = res.cheerio;
var redirectUrl;
$('meta[http-equiv]').each( function () {
redirectUrl = $(this).attr('http-equiv').toLowerCase() == 'refresh' &&
$(this).attr('content') && $(this).attr('content').match(regex);
})
redirectUrl = redirectUrl && redirectUrl.length ? redirectUrl[0] : false;
if (redirectUrl) {
finalRequest.res['$redirect'] = {
statusCode: 'meta-refresh',
redirectUri: url.resolve(req.reqopts.uri, redirectUrl)
}
}
})
})
return req;
});
}