default.proc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. {% autoescape false %}
  2. /**
  3. * Set up page and script parameters.
  4. */
  5. var page = require('webpage').create(),
  6. system = require('system'),
  7. headers = {{ request.getHeaders('json') }},
  8. delay = {{ request.getDelay() }},
  9. vpWidth = {{ request.getViewportWidth() }},
  10. vpHeight = {{ request.getViewportHeight() }},
  11. response = {},
  12. debug = [],
  13. logs = [],
  14. procedure = {};
  15. /**
  16. * Set viewport size.
  17. */
  18. if(vpWidth && vpHeight) {
  19. debug.push(new Date().toISOString().slice(0, -5) + ' [INFO] PhantomJS - Set viewport size ~ width: ' + vpWidth + ' height: ' + vpHeight);
  20. page.viewportSize = {
  21. width: vpWidth,
  22. height: vpHeight
  23. };
  24. }
  25. /**
  26. * Define custom headers.
  27. */
  28. page.customHeaders = headers ? headers : {};
  29. /**
  30. * Set timeout.
  31. */
  32. page.settings.resourceTimeout = {{ request.getTimeout() }};
  33. /**
  34. * Set error in response on timeout.
  35. */
  36. page.onResourceTimeout = function (e) {
  37. response = e;
  38. response.status = e.errorCode;
  39. };
  40. /**
  41. * Set response from resource.
  42. */
  43. page.onResourceReceived = function (r) {
  44. if(!response.status) response = r;
  45. };
  46. /**
  47. * Add page errors to logs.
  48. */
  49. page.onError = function (msg, trace) {
  50. var error = {
  51. message: msg,
  52. trace: []
  53. };
  54. trace.forEach(function(t) {
  55. error.trace.push((t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : ''));
  56. });
  57. logs.push(error);
  58. };
  59. /**
  60. * Global error handling.
  61. */
  62. phantom.onError = function(msg, trace) {
  63. var stack = [];
  64. trace.forEach(function(t) {
  65. stack.push((t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function + ')' : ''));
  66. });
  67. response.status = 500;
  68. response.content = msg;
  69. response.console = stack;
  70. console.log(JSON.stringify(response, undefined, 4));
  71. phantom.exit(1);
  72. };
  73. /**
  74. * Open page.
  75. *
  76. * @param string $url
  77. * @param string $method
  78. * @param string $parameters
  79. * @param callable $callback
  80. */
  81. page.open ('{{ request.getUrl() }}', '{{ request.getMethod() }}', '{{ request.getBody() }}', function (status) {
  82. if(!delay) {
  83. return procedure.execute(status);
  84. }
  85. debug.push(new Date().toISOString().slice(0, -5) + ' [INFO] PhantomJS - Delaying page render for ' + delay + ' second(s)');
  86. window.setTimeout(function () {
  87. debug.push(new Date().toISOString().slice(0, -5) + ' [INFO] PhantomJS - Rendering page after delaying for ' + delay + ' second(s)');
  88. procedure.execute(status);
  89. }, (delay * 1000));
  90. });
  91. /**
  92. * Command to execute on page load.
  93. */
  94. procedure.execute = function (status) {
  95. if (status === 'success') {
  96. try {
  97. response.content = page.evaluate(function () {
  98. return document.getElementsByTagName('html')[0].innerHTML
  99. });
  100. } catch(e) {
  101. response.status = 500;
  102. response.content = e.message;
  103. }
  104. }
  105. response.console = logs;
  106. system.stderr.write(debug.join('\n') + '\n');
  107. console.log(JSON.stringify(response, undefined, 4));
  108. phantom.exit();
  109. };
  110. {% endautoescape %}