1
0
mirror of synced 2025-12-22 19:34:15 -05:00

Record redirect events (#16181)

* Record redirect events

* Update index.js

* Update record-redirect.js

* Only run when it can send to Hydro

* Update record-redirect.js
This commit is contained in:
Kevin Heis
2020-10-26 10:18:42 -07:00
committed by GitHub
parent 222d419e0f
commit 93849795e0
3 changed files with 37 additions and 2 deletions

View File

@@ -21,6 +21,13 @@ module.exports = class Hydro {
this.schemas = SCHEMAS
}
/**
* Can check if it can actually send to Hydro
*/
maySend () {
return Boolean(this.secret && this.endpoint)
}
/**
* Generate a SHA256 hash of the payload using the secret
* to authenticate with Hydro

View File

@@ -16,6 +16,9 @@ module.exports = function (app) {
app.use(require('morgan')('dev', { skip: (req, res) => !isDevelopment }))
app.use(require('./rate-limit'))
if (isDevelopment) app.use(require('./webpack'))
app.use(require('./cookie-parser'))
app.use(require('./req-utils'))
app.use(require('./record-redirect'))
app.use(require('./redirects/external'))
app.use(require('./redirects/help-to-docs'))
app.use(require('./set-fastly-cache-headers'))
@@ -24,9 +27,7 @@ module.exports = function (app) {
app.use(require('./cors'))
app.use(require('./csp'))
app.use(require('helmet')())
app.use(require('./req-utils'))
app.use(require('./robots'))
app.use(require('./cookie-parser'))
app.use(express.json()) // Must come before ./csrf
app.use(require('./csrf'))
app.use(require('./handle-csrf-errors'))

View File

@@ -0,0 +1,27 @@
const { v4: uuidv4 } = require('uuid')
const { inRange } = require('lodash')
module.exports = function (req, res, next) {
if (!req.hydro.maySend()) return next()
res.on('finish', async function recordRedirect () {
if (!inRange(res.statusCode, 300, 400)) return
const schemaName = req.hydro.schemas.redirect
const redirectEvent = {
context: {
user: req.cookies['_docs-events'] || uuidv4(),
event_id: uuidv4(),
version: '1.0.0',
created: new Date().toISOString(),
path: req.path,
referrer: req.get('referer')
},
redirect_from: req.originalUrl,
redirect_to: res.get('location')
}
const hydroRes = await req.hydro.publish(schemaName, redirectEvent)
if (!hydroRes.ok) console.log('Failed to record redirect to Hydro')
})
return next()
}