Merge pull request #6317 from overleaf/jpa-send-explicit-content-type

[web] send explicit content type in responses

GitOrigin-RevId: d5aeaba57a7d2fc053fbf5adc2299fb46e435341
This commit is contained in:
Jakob Ackermann
2022-01-18 09:03:18 +00:00
committed by Copybot
parent c97e95aeba
commit d720d6affa
43 changed files with 390 additions and 224 deletions
@@ -7,12 +7,15 @@ const Settings = require('@overleaf/settings')
const User = require('./helpers/User').promises
const express = require('express')
const {
plainTextResponse,
} = require('../../../app/src/infrastructure/Response')
const LinkedUrlProxy = express()
LinkedUrlProxy.get('/', (req, res, next) => {
if (req.query.url === 'http://example.com/foo') {
return res.send('foo foo foo')
return plainTextResponse(res, 'foo foo foo')
} else if (req.query.url === 'http://example.com/bar') {
return res.send('bar bar bar')
return plainTextResponse(res, 'bar bar bar')
} else {
return res.sendStatus(404)
}
@@ -6,7 +6,7 @@ class MockChatApi extends AbstractMockApi {
}
getGlobalMessages(req, res) {
res.send(this.projects[req.params.project_id] || [])
res.json(this.projects[req.params.project_id] || [])
}
sendGlobalMessage(req, res) {
@@ -19,7 +19,7 @@ class MockChatApi extends AbstractMockApi {
}
this.projects[projectId] = this.projects[projectId] || []
this.projects[projectId].push(message)
res.sendStatus(201).send(Object.assign({ room_id: projectId }, message))
res.json(Object.assign({ room_id: projectId }, message))
}
applyRoutes() {
@@ -1,8 +1,11 @@
const AbstractMockApi = require('./AbstractMockApi')
const {
plainTextResponse,
} = require('../../../../app/src/infrastructure/Response')
class MockClsiApi extends AbstractMockApi {
static compile(req, res) {
res.status(200).send({
res.json({
compile: {
status: 'success',
error: null,
@@ -36,9 +39,9 @@ class MockClsiApi extends AbstractMockApi {
(req, res) => {
const filename = req.params[0]
if (filename === 'project.pdf') {
res.status(200).send('mock-pdf')
plainTextResponse(res, 'mock-pdf')
} else if (filename === 'project.log') {
res.status(200).send('mock-log')
plainTextResponse(res, 'mock-log')
} else {
res.sendStatus(404)
}
@@ -48,12 +51,12 @@ class MockClsiApi extends AbstractMockApi {
this.app.get(
'/project/:project_id/user/:user_id/build/:build_id/output/:output_path',
(req, res) => {
res.status(200).send('hello')
plainTextResponse(res, 'hello')
}
)
this.app.get('/project/:project_id/status', (req, res) => {
res.status(200).send()
res.sendStatus(200)
})
}
}
@@ -1,4 +1,7 @@
const AbstractMockApi = require('./AbstractMockApi')
const {
plainTextResponse,
} = require('../../../../app/src/infrastructure/Response')
class MockFilestoreApi extends AbstractMockApi {
reset() {
@@ -24,7 +27,7 @@ class MockFilestoreApi extends AbstractMockApi {
this.app.get('/project/:projectId/file/:fileId', (req, res) => {
const { projectId, fileId } = req.params
const { content } = this.files[projectId][fileId]
res.send(content)
plainTextResponse(res, content)
})
// handle file copying
@@ -1,6 +1,9 @@
const AbstractMockApi = require('./AbstractMockApi')
const _ = require('lodash')
const { ObjectId } = require('mongodb')
const {
plainTextResponse,
} = require('../../../../app/src/infrastructure/Response')
class MockProjectHistoryApi extends AbstractMockApi {
reset() {
@@ -64,7 +67,7 @@ class MockProjectHistoryApi extends AbstractMockApi {
const { projectId, version, pathname } = req.params
const key = `${projectId}:${version}:${pathname}`
if (this.oldFiles[key] != null) {
res.send(this.oldFiles[key])
plainTextResponse(res, this.oldFiles[key])
} else {
res.sendStatus(404)
}
@@ -1,5 +1,6 @@
const AbstractMockApi = require('./AbstractMockApi')
const SubscriptionController = require('../../../../app/src/Features/Subscription/SubscriptionController')
const { xmlResponse } = require('../../../../app/src/infrastructure/Response')
class MockRecurlyApi extends AbstractMockApi {
reset() {
@@ -28,9 +29,11 @@ class MockRecurlyApi extends AbstractMockApi {
this.app.get('/subscriptions/:id', (req, res) => {
const subscription = this.getMockSubscriptionById(req.params.id)
if (!subscription) {
res.status(404).end()
res.sendStatus(404)
} else {
res.send(`\
xmlResponse(
res,
`\
<subscription>
<plan><plan_code>${subscription.planCode}</plan_code></plan>
<currency>${subscription.currency}</currency>
@@ -42,22 +45,26 @@ class MockRecurlyApi extends AbstractMockApi {
<account href="accounts/${subscription.account.id}" />
<trial_ends_at type="datetime">${subscription.trial_ends_at}</trial_ends_at>
</subscription>\
`)
`
)
}
})
this.app.get('/accounts/:id', (req, res) => {
const subscription = this.getMockSubscriptionByAccountId(req.params.id)
if (!subscription) {
res.status(404).end()
res.sendStatus(404)
} else {
res.send(`\
xmlResponse(
res,
`\
<account>
<account_code>${req.params.id}</account_code>
<hosted_login_token>${subscription.account.hosted_login_token}</hosted_login_token>
<email>${subscription.account.email}</email>
</account>\
`)
`
)
}
})
@@ -67,15 +74,18 @@ class MockRecurlyApi extends AbstractMockApi {
(req, res) => {
const subscription = this.getMockSubscriptionByAccountId(req.params.id)
if (!subscription) {
res.status(404).end()
res.sendStatus(404)
} else {
Object.assign(subscription.account, req.body.account)
res.send(`\
xmlResponse(
res,
`\
<account>
<account_code>${req.params.id}</account_code>
<email>${subscription.account.email}</email>
</account>\
`)
`
)
}
}
)
@@ -83,15 +93,18 @@ class MockRecurlyApi extends AbstractMockApi {
this.app.get('/coupons/:code', (req, res) => {
const coupon = this.coupons[req.params.code]
if (!coupon) {
res.status(404).end()
res.sendStatus(404)
} else {
res.send(`\
xmlResponse(
res,
`\
<coupon>
<coupon_code>${req.params.code}</coupon_code>
<name>${coupon.name || ''}</name>
<description>${coupon.description || ''}</description>
</coupon>\
`)
`
)
}
})
@@ -107,11 +120,14 @@ class MockRecurlyApi extends AbstractMockApi {
`
}
res.send(`\
xmlResponse(
res,
`\
<redemptions type="array">
${redemptionsListXml}
</redemptions>\
`)
`
)
})
}
}
@@ -1,5 +1,9 @@
const AbstractMockApi = require('./AbstractMockApi')
const { EventEmitter } = require('events')
const {
zipAttachment,
prepareZipAttachment,
} = require('../../../../app/src/infrastructure/Response')
class MockV1HistoryApi extends AbstractMockApi {
reset() {
@@ -13,10 +17,10 @@ class MockV1HistoryApi extends AbstractMockApi {
this.app.get(
'/api/projects/:project_id/version/:version/zip',
(req, res, next) => {
res.header('content-disposition', 'attachment; name=project.zip')
res.header('content-type', 'application/octet-stream')
res.send(
`Mock zip for ${req.params.project_id} at version ${req.params.version}`
zipAttachment(
res,
`Mock zip for ${req.params.project_id} at version ${req.params.version}`,
'project.zip'
)
}
)
@@ -27,13 +31,14 @@ class MockV1HistoryApi extends AbstractMockApi {
if (!(this.fakeZipCall++ > 0)) {
return res.sendStatus(404)
}
res.header('content-disposition', 'attachment; name=project.zip')
res.header('content-type', 'application/octet-stream')
if (req.params.version === '42') {
return res.send(
`Mock zip for ${req.params.project_id} at version ${req.params.version}`
return zipAttachment(
res,
`Mock zip for ${req.params.project_id} at version ${req.params.version}`,
'project.zip'
)
}
prepareZipAttachment(res, 'project.zip')
const writeChunk = () => {
res.write('chunk' + this.sentChunks++)
}