Skip to content

Commit

Permalink
Using content-disposition pkg for non-US font titles in reporting (#…
Browse files Browse the repository at this point in the history
…30895) (#31713)

* Using content-disposition for non-US font titles in reporting
  • Loading branch information
joelgriffith authored Feb 21, 2019
1 parent b486404 commit bab8325
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
1 change: 1 addition & 0 deletions x-pack/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@
"classnames": "2.2.5",
"concat-stream": "1.5.1",
"constate": "^0.9.0",
"content-disposition": "0.5.3",
"copy-to-clipboard": "^3.0.8",
"cronstrue": "^1.51.0",
"d3": "3.5.6",
Expand Down
81 changes: 81 additions & 0 deletions x-pack/plugins/reporting/server/routes/lib/get_document_payload.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

// @ts-ignore
import contentDisposition from 'content-disposition';
// @ts-ignore
import { oncePerServer } from '../../lib/once_per_server';

const DEFAULT_TITLE = 'report';

const getTitle = (exportType: any, title?: string): string =>
`${title || DEFAULT_TITLE}.${exportType.jobContentExtension}`;

function getDocumentPayloadFn(server: any) {
const exportTypesRegistry = server.plugins.reporting.exportTypesRegistry;

function encodeContent(content: string, exportType: any) {
switch (exportType.jobContentEncoding) {
case 'base64':
return Buffer.from(content, 'base64');
default:
return content;
}
}

function getCompleted(output: any, jobType: string, title: any) {
const exportType = exportTypesRegistry.get((item: any) => item.jobType === jobType);
const filename = getTitle(exportType, title);

return {
statusCode: 200,
content: encodeContent(output.content, exportType),
contentType: output.content_type,
headers: {
'Content-Disposition': contentDisposition(filename, { type: 'inline' }),
},
};
}

function getFailure(output: any) {
return {
statusCode: 500,
content: {
message: 'Reporting generation failed',
reason: output.content,
},
contentType: 'application/json',
};
}

function getIncomplete(status: any) {
return {
statusCode: 503,
content: status,
contentType: 'application/json',
headers: {
'retry-after': 30,
},
};
}

return function getDocumentPayload(doc: any) {
const { status, output, jobtype: jobType, payload: { title } = { title: '' } } = doc._source;

if (status === 'completed') {
return getCompleted(output, jobType, title);
}

if (status === 'failed') {
return getFailure(output);
}

// send a 503 indicating that the report isn't completed yet
return getIncomplete(status);
};
}

export const getDocumentPayloadFactory = oncePerServer(getDocumentPayloadFn);
7 changes: 7 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5973,6 +5973,13 @@ [email protected]:
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ=

[email protected]:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
dependencies:
safe-buffer "5.1.2"

content-type-parser@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
Expand Down

0 comments on commit bab8325

Please sign in to comment.