summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client.js28
-rw-r--r--package.json2
-rw-r--r--readme.md1
3 files changed, 23 insertions, 8 deletions
diff --git a/client.js b/client.js
index 2748da1..f5c034a 100644
--- a/client.js
+++ b/client.js
@@ -14,8 +14,8 @@ const {CODES, MESSAGES} = require('./lib/statuses')
const HOUR = 60 * 60 * 1000
-const _request = (pathOrUrl, opt, cb) => {
- debug('_request', pathOrUrl, opt)
+const _request = (pathOrUrl, opt, ctx, cb) => {
+ debug('_request', pathOrUrl, ctx, opt)
const {
verifyAlpnId,
@@ -154,6 +154,10 @@ const sendGeminiRequest = (pathOrUrl, opt, done) => {
...opt,
}
+ const shouldFollowRedirect = 'function' === typeof followRedirects
+ ? followRedirects
+ : () => followRedirects
+
if (useClientCerts) {
if (typeof letUserConfirmClientCertUsage !== 'function') {
throw new Error('letUserConfirmClientCertUsage must be a function')
@@ -176,14 +180,24 @@ const sendGeminiRequest = (pathOrUrl, opt, done) => {
if (verifyAlpnId) reqOpt.verifyAlpnId = verifyAlpnId
+ let ctx = {
+ redirectsFollowed: 0,
+ }
+
let cb = (err, res) => {
if (err) return done(err)
// handle redirect
- if (followRedirects && (
+ if ((
res.statusCode === CODES.REDIRECT_TEMPORARY ||
res.statusCode === CODES.REDIRECT_PERMANENT
- )) {
+ ) && shouldFollowRedirect(ctx.redirectsFollowed + 1, res)) {
+ ctx = {
+ ...ctx,
+ redirectsFollowed: ctx.redirectsFollowed + 1
+ }
+ debug('following redirect nr', ctx.redirectsFollowed)
+
// todo: handle empty res.meta
const newTarget = parseUrl(res.meta)
reqOpt = {
@@ -192,7 +206,7 @@ const sendGeminiRequest = (pathOrUrl, opt, done) => {
port: newTarget.port || reqOpt.port,
}
pathOrUrl = res.meta
- _request(res.meta, reqOpt, cb)
+ _request(res.meta, reqOpt, ctx, cb)
return;
}
@@ -229,7 +243,7 @@ const sendGeminiRequest = (pathOrUrl, opt, done) => {
_request(pathOrUrl, {
...reqOpt,
cert, key,
- }, cb)
+ }, ctx, cb)
})
})
return;
@@ -238,7 +252,7 @@ const sendGeminiRequest = (pathOrUrl, opt, done) => {
done(null, res)
}
- _request(pathOrUrl, reqOpt, cb)
+ _request(pathOrUrl, reqOpt, ctx, cb)
}
module.exports = sendGeminiRequest
diff --git a/package.json b/package.json
index 72316c9..20fbdcf 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "@derhuerst/gemini",
"description": "Experimental Gemini server & client.",
- "version": "1.0.4",
+ "version": "1.1.0",
"main": "index.js",
"files": [
"index.js",
diff --git a/readme.md b/readme.md
index 1017738..3179033 100644
--- a/readme.md
+++ b/readme.md
@@ -129,6 +129,7 @@ request(pathOrUrl, opt = {}, cb)
```js
{
// follow redirects automatically
+ // Can also be a function `(nrOfRedirects, response) => boolean`.
followRedirects: false,
// client certificates
useClientCerts: false,