123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- if (!Date.prototype.toISOString) {
- Date.prototype.toISOString = function () {
- function pad(n) { return n < 10 ? '0' + n : n; }
- function ms(n) { return n < 10 ? '00'+ n : n < 100 ? '0' + n : n }
- return this.getFullYear() + '-' +
- pad(this.getMonth() + 1) + '-' +
- pad(this.getDate()) + 'T' +
- pad(this.getHours()) + ':' +
- pad(this.getMinutes()) + ':' +
- pad(this.getSeconds()) + '.' +
- ms(this.getMilliseconds()) + 'Z';
- }
- }
- function createHAR(address, title, startTime, resources)
- {
- var entries = [];
- resources.forEach(function (resource) {
- var request = resource.request,
- startReply = resource.startReply,
- endReply = resource.endReply;
- if (!request || !startReply || !endReply) {
- return;
- }
- // Exclude Data URI from HAR file because
- // they aren't included in specification
- if (request.url.match(/(^data:image\/.*)/i)) {
- return;
- }
- entries.push({
- startedDateTime: request.time.toISOString(),
- time: endReply.time - request.time,
- request: {
- method: request.method,
- url: request.url,
- httpVersion: "HTTP/1.1",
- cookies: [],
- headers: request.headers,
- queryString: [],
- headersSize: -1,
- bodySize: -1
- },
- response: {
- status: endReply.status,
- statusText: endReply.statusText,
- httpVersion: "HTTP/1.1",
- cookies: [],
- headers: endReply.headers,
- redirectURL: "",
- headersSize: -1,
- bodySize: startReply.bodySize,
- content: {
- size: startReply.bodySize,
- mimeType: endReply.contentType
- }
- },
- cache: {},
- timings: {
- blocked: 0,
- dns: -1,
- connect: -1,
- send: 0,
- wait: startReply.time - request.time,
- receive: endReply.time - startReply.time,
- ssl: -1
- },
- pageref: address
- });
- });
- return {
- log: {
- version: '1.2',
- creator: {
- name: "PhantomJS",
- version: phantom.version.major + '.' + phantom.version.minor +
- '.' + phantom.version.patch
- },
- pages: [{
- startedDateTime: startTime.toISOString(),
- id: address,
- title: title,
- pageTimings: {
- onLoad: page.endTime - page.startTime
- }
- }],
- entries: entries
- }
- };
- }
- var page = require('webpage').create(),
- system = require('system');
- if (system.args.length === 1) {
- console.log('Usage: netsniff.js <some URL>');
- phantom.exit(1);
- } else {
- page.address = system.args[1];
- page.resources = [];
- page.onLoadStarted = function () {
- page.startTime = new Date();
- };
- page.onResourceRequested = function (req) {
- page.resources[req.id] = {
- request: req,
- startReply: null,
- endReply: null
- };
- };
- page.onResourceReceived = function (res) {
- if (res.stage === 'start') {
- page.resources[res.id].startReply = res;
- }
- if (res.stage === 'end') {
- page.resources[res.id].endReply = res;
- }
- };
- page.open(page.address, function (status) {
- var har;
- if (status !== 'success') {
- console.log('FAIL to load the address');
- phantom.exit(1);
- } else {
- page.endTime = new Date();
- page.title = page.evaluate(function () {
- return document.title;
- });
- har = createHAR(page.address, page.title, page.startTime, page.resources);
- console.log(JSON.stringify(har, undefined, 4));
- phantom.exit();
- }
- });
- }
|