Skip to content

Commit df67d20

Browse files
committed
fix: ensure data uri has charset and is base64 encoded
1 parent d1b36a9 commit df67d20

File tree

7 files changed

+265
-83
lines changed

7 files changed

+265
-83
lines changed

.mdeprc

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
{
2-
"node": "9.11.1",
2+
"node": "10.1.0",
33
"repo": "microfleet",
44
"p": "html-to-pdf",
55
"nycCoverage": false,
66
"tests": "__tests__/**/*.spec.js",
77
"test_framework": "jest --coverageDirectory <coverageDirectory> --forceExit",
88
"docker_compose": "__tests__/docker-compose.yml",
9-
"fail": "docker logs ms-files",
10-
"arbitrary_exec": [
11-
"rm -rf node_modules; yarn --frozen-lockfile"
12-
]
9+
"rebuild": ["64"]
1310
}

__tests__/docker-compose.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ services:
1111
hostname: rabbitmq
1212

1313
ms-files:
14-
image: makeomatic/ms-files:9.10.0-11.1.1
14+
image: makeomatic/ms-files:9.11.0-11.1.3
1515
container_name: ms-files
1616
hostname: ms-files
1717
depends_on:
@@ -26,13 +26,14 @@ services:
2626

2727
tester:
2828
container_name: tester
29-
image: makeomatic/node:9.10.0-chrome-tester
29+
image: makeomatic/node:10.1.0-chrome-tester
3030
links:
3131
- redis
3232
- rabbitmq
3333
working_dir: /src
3434
ports:
3535
- "9229:9229"
36+
- "9222:9222"
3637
volumes:
3738
- ${PWD}:/src
3839
environment:
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!DOCTYPE HTML>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
</head>
6+
<body>
7+
<style>
8+
body {
9+
font-family: "Noto Sans", sans-serif;
10+
font-weight: 400;
11+
}
12+
</style>
13+
<div>
14+
Новосельковская 23-74
15+
</div>
16+
</body>
17+
</html>

__tests__/unit/render.spec.js

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,22 @@
11
const Printer = require('../../src');
22
const amqpConfig = require('../configs/amqp');
33

4-
describe('render action', () => {
5-
let send;
4+
describe('render action', async () => {
5+
let service;
6+
let amqpClient;
67

78
// jasmine global var
89
// eslint-disable-next-line no-undef
910
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
1011

11-
beforeAll(() => {
12-
const service = this.service = new Printer({ ...amqpConfig });
12+
function send(route, message, timeout = 15000) {
13+
return amqpClient.publishAndWait(route, message, { timeout });
14+
}
1315

14-
return service
15-
.connect()
16-
.tap(() => {
17-
const amqp = this.amqp = service.amqp;
18-
19-
send = function _send(route, message, timeout = 15000) {
20-
return amqp.publishAndWait(route, message, { timeout });
21-
};
22-
});
16+
beforeAll(async () => {
17+
service = new Printer({ ...amqpConfig });
18+
await service.connect();
19+
amqpClient = service.amqp;
2320
});
2421

2522
it('should render & return documents', async () => {
@@ -31,10 +28,19 @@ describe('render action', () => {
3128
meta: false,
3229
};
3330

34-
return send('pdf.render', message)
35-
.tap((data) => {
36-
expect(data).toMatch(/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/);
37-
});
31+
const data = await send('pdf.render', message);
32+
expect(data).toMatch(/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/);
33+
});
34+
35+
it('should render & return documents: cyrillic', async () => {
36+
const message = {
37+
template: 'font',
38+
context: {},
39+
meta: false,
40+
};
41+
42+
const data = await send('pdf.render', message);
43+
expect(data).toMatch(/^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$/);
3844
});
3945

4046
it('should render & upload document', async () => {
@@ -55,13 +61,31 @@ describe('render action', () => {
5561
},
5662
};
5763

58-
return send('pdf.render', message)
59-
.tap((data) => {
60-
expect(data).toMatch(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i);
61-
});
64+
const data = await send('pdf.render', message);
65+
expect(data).toMatch(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i);
66+
});
67+
68+
it('should render & upload document', async () => {
69+
const message = {
70+
template: 'font',
71+
context: {},
72+
meta: {
73+
meta: {
74+
name: 'font.pdf',
75+
},
76+
username: 'test',
77+
unlisted: true,
78+
access: {
79+
setPublic: true,
80+
},
81+
},
82+
};
83+
84+
const data = await send('pdf.render', message);
85+
expect(data).toMatch(/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i);
6286
});
6387

64-
afterAll(() => {
65-
return this.service.close();
88+
afterAll(async () => {
89+
await service.close();
6690
});
6791
});

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"access": "public"
2424
},
2525
"dependencies": {
26+
"64": "^0.2.0",
2627
"@microfleet/core": "^10.3.1",
2728
"@microfleet/transport-amqp": "^13.0.1",
2829
"bluebird": "^3.5.1",
@@ -40,10 +41,10 @@
4041
"stdout-stream": "^1.4.0"
4142
},
4243
"devDependencies": {
43-
"@makeomatic/deploy": "^6.1.0",
44+
"@makeomatic/deploy": "^6.1.1",
4445
"@semantic-release/changelog": "^2.0.2",
4546
"@semantic-release/exec": "^2.2.4",
46-
"@semantic-release/git": "4.x.x",
47+
"@semantic-release/git": "5.0.0",
4748
"babel-cli": "^6.26.0",
4849
"babel-eslint": "^8.2.3",
4950
"babel-plugin-istanbul": "^4.1.6",

src/utils/chrome.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const Promise = require('bluebird');
22
const noop = require('lodash/noop');
33
const ChromeRemote = require('chrome-remote-interface');
4+
const { encode } = require('64');
45
const { Launcher } = require('chrome-launcher');
56

67
const debug = require('debug')('ms-printer:chrome');
@@ -39,11 +40,13 @@ class Chrome {
3940
// settings
4041
this.settings = Object.assign({
4142
logLevel: 'info',
43+
port: 9222,
4244
chromeFlags: [
4345
'--window-size=1024,768',
4446
'--disable-gpu',
4547
'--no-sandbox',
4648
'--headless',
49+
'--remote-debugging-address=0.0.0.0',
4750
],
4851
handleSIGINT: false,
4952
}, restOpts);
@@ -119,7 +122,9 @@ class Chrome {
119122
*/
120123
printToPdf(html, opts = {}) {
121124
return Promise.using(this.openTab(), ({ Page }) => {
122-
const url = /^(https?|file|data):/i.test(html) ? html : `data:text/html,${html}`;
125+
const url = /^(https?|file|data):/i.test(html)
126+
? html
127+
: `data:text/html;charset=utf-8;base64,${encode(Buffer.from(html))}`;
123128

124129
return Promise
125130
.all([

0 commit comments

Comments
 (0)