Skip to content

Commit 5da02c9

Browse files
authored
fix: broken dnslink at /ipns/ipfs.io/blog/foo (#844)
Context: https://github.com/ipfs/blog/issues/360
1 parent 4fcdfb2 commit 5da02c9

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

add-on/src/lib/ipfs-request.js

+10
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,16 @@ function createRequestModifier (getState, dnslinkResolver, ipfsPathValidator, ru
450450
const state = getState()
451451
if (!state.active) return
452452
if (request.statusCode === 200) return // finish if no error to recover from
453+
454+
// Seamlessly fix canonical link when DNSLink breaks ipfs.io/blog/*
455+
/// https://github.com/ipfs/blog/issues/360
456+
if (request.type === 'main_frame' &&
457+
request.statusCode === 404 &&
458+
request.url.match(/\/\/[^/]+\/ipns\/ipfs\.io\/blog\//)) {
459+
log('onCompleted: fixing /ipns/ipfs.io/blog → /ipns/blog.ipfs.io')
460+
return browser.tabs.update({ url: request.url.replace('/ipns/ipfs.io/blog', '/ipns/blog.ipfs.io') })
461+
}
462+
453463
let redirectUrl
454464
if (isRecoverable(request, state, ipfsPathValidator)) {
455465
// if subdomain request redirect to default public subdomain url

test/functional/lib/ipfs-request-workarounds.test.js

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
'use strict'
22
const { describe, it, before, beforeEach, after } = require('mocha')
3-
const { expect } = require('chai')
3+
const { expect, assert } = require('chai')
44
const { URL } = require('url') // URL implementation with support for .origin attribute
55
const browser = require('sinon-chrome')
66
const { initState } = require('../../../add-on/src/lib/state')
77
const { createRuntimeChecks } = require('../../../add-on/src/lib/runtime-checks')
88
const { createRequestModifier } = require('../../../add-on/src/lib/ipfs-request')
9-
const createDnslinkResolver = require('../../../add-on/src/lib/dnslink')
9+
const createDNSLinkResolver = require('../../../add-on/src/lib/dnslink')
1010
const { createIpfsPathValidator } = require('../../../add-on/src/lib/ipfs-path')
1111
const { optionDefaults } = require('../../../add-on/src/lib/options')
1212

@@ -33,7 +33,7 @@ describe('modifyRequest processing', function () {
3333
state = initState(optionDefaults)
3434
getState = () => state
3535
const getIpfs = () => {}
36-
dnslinkResolver = createDnslinkResolver(getState)
36+
dnslinkResolver = createDNSLinkResolver(getState)
3737
runtime = Object.assign({}, await createRuntimeChecks(browser)) // make it mutable for tests
3838
ipfsPathValidator = createIpfsPathValidator(getState, getIpfs, dnslinkResolver)
3939
modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime)
@@ -159,6 +159,30 @@ describe('modifyRequest processing', function () {
159159
})
160160
})
161161

162+
// We've moved blog to blog.ipfs.io but links to ipfs.io/blog/*
163+
// are still around due to the way Discourse integration was done for comments.
164+
// https://github.com/ipfs/blog/issues/360
165+
describe('a failed main_frame request to /ipns/ipfs.io/blog', function () {
166+
it('should be updated to /ipns/blog.ipfs.io', async function () {
167+
const brokenDNSLinkUrl = 'http://example.com/ipns/ipfs.io/blog/some-post'
168+
const fixedDNSLinkUrl = 'http://example.com/ipns/blog.ipfs.io/some-post'
169+
// ensure clean modifyRequest
170+
runtime = Object.assign({}, await createRuntimeChecks(browser)) // make it mutable for tests
171+
modifyRequest = createRequestModifier(getState, dnslinkResolver, ipfsPathValidator, runtime)
172+
// test
173+
const request = {
174+
statusCode: 404,
175+
type: 'main_frame',
176+
url: brokenDNSLinkUrl
177+
}
178+
browser.tabs.update.flush()
179+
assert.ok(browser.tabs.update.notCalled)
180+
modifyRequest.onCompleted(request)
181+
assert.ok(browser.tabs.update.withArgs({ url: fixedDNSLinkUrl }).calledOnce)
182+
browser.tabs.update.flush()
183+
})
184+
})
185+
162186
after(function () {
163187
delete global.URL
164188
delete global.browser

0 commit comments

Comments
 (0)