Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Under concurrent load, child process exit event fires before IO is complete, causing errors fix with tests #2

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/pdf.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,17 @@ PDF.prototype.exec = function PdfExec (callback) {
// Ignore if code has a value of 0 since that means PhantomJS has executed and exited successfully.
// Also, as per your script and standards, having a code value of 1 means one can always assume that
// an error occured.
if (((typeof code !== 'undefined' && code !== null) && code !== 0) || err) {
if (((typeof code !== 'undefined' && code !== null) && code !== 0) || err || (code === 0 && !data)) {
var error = null

if (err) {
// Rudimentary checking if err is an instance of the Error class
error = err instanceof Error ? err : new Error(err)
} else if (code === 0 && !data) {
// This is to catch the edge case of having a exit code value of 0 but having no data (exit can be called before io pipes are closed)
error = new Error('html-pdf: Process exited successfully, but no data received')
} else {
// This is to catch the edge case of having a exit code value of 1 but having no error
// This is to catch the edge case of having an exit code value of 1 but having no error
error = new Error('html-pdf: Unknown Error')
}

Expand All @@ -150,7 +153,7 @@ PDF.prototype.exec = function PdfExec (callback) {

// An exit event is most likely an error because we didn't get any data at this point
child.on('close', respond)
child.on('exit', respond)
// child.on('exit', respond)

var config = JSON.stringify({html: this.html, options: this.options})
child.stdin.write(config + '\n', 'utf8')
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "html-pdf",
"version": "3.0.1",
"version": "3.0.2-kv",
"description": "HTML to PDF converter that uses phantomjs",
"engines": {
"node": ">=4.0.0"
Expand Down
10 changes: 10 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -258,3 +258,13 @@ test('allows local file access with localUrlAccess=true', function (t) {
t.assert(count === 5, 'Renders a page 5 pages as the content is present')
})
})

test('phantomjs exit without file generated does not cause crash', function (t) {
t.plan(2)

pdf.create(`<body>foo</body>`, { phantomPath: './test/phantomMock.js' })
.toBuffer(function (error, buffer) {
t.true(error instanceof Error)
t.false(buffer)
})
})
3 changes: 3 additions & 0 deletions test/phantomMock.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env node

process.exit(0)