This repository has been archived by the owner on Mar 22, 2018. It is now read-only.
/
rasterizer.js
109 lines (103 loc) · 3.4 KB
/
rasterizer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
* phantomjs rasteriser server
*
* Usage:
* phantomjs rasterizer.js [basePath] [port] [defaultViewportSize]
*
* This starts an HTTP server waiting for screenshot requests
*/
var basePath = phantom.args[0] || '/tmp/';
var port = phantom.args[1] || 3001;
var defaultViewportSize = phantom.args[2] || '';
defaultViewportSize = defaultViewportSize.split('x');
defaultViewportSize = {
width: ~~defaultViewportSize[0] || 1024,
height: ~~defaultViewportSize[1] || 600
};
var pageSettings = ['javascriptEnabled', 'loadImages', 'localToRemoteUrlAccessEnabled', 'userAgent', 'userName', 'password'];
var server, service;
server = require('webserver').create();
/*
* Screenshot service
*
* Generate a screenshot file on the server under the basePath
*
* Usage:
* GET /
* url: http://www.google.com
*
* Optional headers:
* filename: google.png
* width: 1024
* height: 600
* clipRect: { "top": 14, "left": 3, "width": 400, "height": 300 }
*
* If path is omitted, the service creates it based on the url, removing the
* protocol and replacing all slashes with dots, e.g
* http://www.google.com => www.google.com.png
*
* width and height represent the viewport size. If the content exceeds these
* boundaries and has a non-elastic style, the screenshot may have greater size.
* Use clipRect to ensure the final size of the screenshot in pixels.
*
* All settings of the WebPage object can also be set using headers, e.g.:
* javascriptEnabled: false
* userAgent: Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+
*/
service = server.listen(port, function(request, response) {
if (request.url == '/healthCheck') {
response.statusCode = 200;
response.write('up');
response.close();
return;
}
if (!request.headers.url) {
response.statusCode = 400;
response.write('Error: Request must contain an url header' + "\n");
response.close();
return;
}
var url = request.headers.url;
var path = basePath + (request.headers.filename || (url.replace(new RegExp('https?://'), '').replace(/\//g, '.') + '.png'));
var page = new WebPage();
page.onResourceError = function(resourceError) {
page.error_reason = resourceError.errorString;
};
var delay = request.headers.delay || 0;
try {
page.viewportSize = {
width: request.headers.width || defaultViewportSize.width,
height: request.headers.height || defaultViewportSize.height
};
if (request.headers.clipRect) {
page.clipRect = JSON.parse(request.headers.clipRect);
}
for (name in pageSettings) {
if (value = request.headers[pageSettings[name]]) {
value = (value == 'false') ? false : ((value == 'true') ? true : value);
page.settings[pageSettings[name]] = value;
}
}
} catch (err) {
response.statusCode = 500;
response.write('Error while parsing headers: ' + err.message);
return response.close();
}
page.open(url, function(status) {
if (status == 'success') {
window.setTimeout(function () {
page.render(path);
response.write('Success: Screenshot saved to ' + path + "\n");
page.release();
response.close();
}, delay);
} else {
response.write('Error: Url returned status ' + status + ' - ' + page.error_reason + "\n");
page.release();
response.close();
}
});
// must start the response now, or phantom closes the connection
response.statusCode = 200;
response.write('');
});