Redirect multiple requests in same request instead in web server (#191)
This commit is contained in:
@@ -141,11 +141,13 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
//Metrics
|
//Metrics
|
||||||
const pending = new Set()
|
const pending = new Map()
|
||||||
app.get("/:login/:repository?", ...middlewares, async(req, res) => {
|
app.get("/:login/:repository?", ...middlewares, async(req, res) => {
|
||||||
//Request params
|
//Request params
|
||||||
const login = req.params.login?.replace(/[\n\r]/g, "")
|
const login = req.params.login?.replace(/[\n\r]/g, "")
|
||||||
const repository = req.params.repository?.replace(/[\n\r]/g, "")
|
const repository = req.params.repository?.replace(/[\n\r]/g, "")
|
||||||
|
let solve = null
|
||||||
|
//Check username
|
||||||
if (!/^[-\w]+$/i.test(login)) {
|
if (!/^[-\w]+$/i.test(login)) {
|
||||||
console.debug(`metrics/app/${login} > 400 (invalid username)`)
|
console.debug(`metrics/app/${login} > 400 (invalid username)`)
|
||||||
return res.status(400).send("Bad request: username seems invalid")
|
return res.status(400).send("Bad request: username seems invalid")
|
||||||
@@ -155,6 +157,13 @@
|
|||||||
console.debug(`metrics/app/${login} > 403 (not in allowed users)`)
|
console.debug(`metrics/app/${login} > 403 (not in allowed users)`)
|
||||||
return res.status(403).send("Forbidden: username not in allowed list")
|
return res.status(403).send("Forbidden: username not in allowed list")
|
||||||
}
|
}
|
||||||
|
//Prevent multiples requests
|
||||||
|
if (pending.has(login)) {
|
||||||
|
console.debug(`metrics/app/${login} > awaiting pending request`)
|
||||||
|
await pending.get(login)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pending.set(login, new Promise(_solve => solve = _solve)) //eslint-disable-line no-promise-executor-return
|
||||||
//Read cached data if possible
|
//Read cached data if possible
|
||||||
if ((!debug)&&(cached)&&(cache.get(login))) {
|
if ((!debug)&&(cached)&&(cache.get(login))) {
|
||||||
const {rendered, mime} = cache.get(login)
|
const {rendered, mime} = cache.get(login)
|
||||||
@@ -166,12 +175,6 @@
|
|||||||
console.debug(`metrics/app/${login} > 503 (maximum users reached)`)
|
console.debug(`metrics/app/${login} > 503 (maximum users reached)`)
|
||||||
return res.status(503).send("Service Unavailable: maximum number of users reached, only cached metrics are available")
|
return res.status(503).send("Service Unavailable: maximum number of users reached, only cached metrics are available")
|
||||||
}
|
}
|
||||||
//Prevent multiples requests
|
|
||||||
if (pending.has(login)) {
|
|
||||||
console.debug(`metrics/app/${login} > 409 (multiple requests)`)
|
|
||||||
return res.status(409).send(`Conflict: a request for "${login}" is already being processed, retry later once previous one is finished`)
|
|
||||||
}
|
|
||||||
pending.add(login)
|
|
||||||
//Repository alias
|
//Repository alias
|
||||||
if (repository) {
|
if (repository) {
|
||||||
console.debug(`metrics/app/${login} > compute repository metrics`)
|
console.debug(`metrics/app/${login} > compute repository metrics`)
|
||||||
@@ -216,6 +219,7 @@
|
|||||||
}
|
}
|
||||||
//After rendering
|
//After rendering
|
||||||
finally {
|
finally {
|
||||||
|
solve?.()
|
||||||
pending.delete(login)
|
pending.delete(login)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user