All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openqa.selenium.server.commands.CaptureNetworkTrafficCommand Maven / Gradle / Ivy

Go to download

Selenium automates browsers. That's it! What you do with that power is entirely up to you.

There is a newer version: 3.9.1
Show newest version
package org.openqa.selenium.server.commands;

import org.openqa.jetty.http.HttpRequest;
import org.openqa.jetty.http.HttpResponse;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

public class CaptureNetworkTrafficCommand extends Command {
  private static final List entries = Collections.synchronizedList(new ArrayList());

  public static void clear() {
    entries.clear();
  }

  public static void capture(Entry entry) {
    entries.add(entry);
  }

  private String type; // ie: XML, JSON, plain text, etc

  public CaptureNetworkTrafficCommand(String type) {
    this.type = type;
  }

  @Override
  public String execute() {
    StringBuilder sb = new StringBuilder();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

    if ("json".equalsIgnoreCase(type)) {
      /*
       * 
       * [{ statusCode: 200, method: 'GET', url: 'http://foo.com/index.html', bytes: 12422, start:
       * '2009-03-15T14:23:00.000-0700', end: '2009-03-15T14:23:00.102-0700', timeInMillis: 102,
       * requestHeaders: [{ name: 'Foo', value: 'Bar' }], responseHeaders: [{ name: 'Baz', value:
       * 'Blah' }] },{ ... }]
       */

      sb.append("[");

      synchronized (entries) {
        for (final Iterator iterator = entries.iterator(); iterator.hasNext();) {
          final Entry entry = iterator.next();
          sb.append("{\n");

          sb.append(jsonKey("statusCode")).append(entry.statusCode).append(",\n");
          sb.append(jsonKey("method")).append(json(entry.method)).append(",\n");
          sb.append(jsonKey("url")).append(json(entry.url)).append(",\n");
          sb.append(jsonKey("bytes")).append(entry.bytes).append(",\n");
          sb.append(jsonKey("start")).append(json(sdf.format(entry.start))).append(",\n");
          sb.append(jsonKey("end")).append(json(sdf.format(entry.end))).append(",\n");
          sb.append(jsonKey("timeInMillis")).append((entry.end.getTime() - entry.start.getTime()))
              .append(",\n");

          sb.append(jsonKey("requestHeaders")).append("[");
          jsonHeaders(sb, entry.requestHeaders);
          sb.append("],\n");

          sb.append(jsonKey("responseHeaders")).append("[");
          jsonHeaders(sb, entry.responseHeaders);
          sb.append("]\n");

          sb.append("}");

          if (iterator.hasNext()) {
            sb.append(",\n");
          }
        }
      }

      sb.append("]");
    } else if ("xml".equalsIgnoreCase(type)) {
      /*
       *    
*
*/ sb.append("\n"); synchronized (entries) { for (final Entry entry : entries) { sb.append("\n"); sb.append(" \n"); xmlHeaders(sb, entry.requestHeaders); sb.append(" \n"); sb.append(" \n"); xmlHeaders(sb, entry.responseHeaders); sb.append(" \n"); sb.append("\n"); } } sb.append("\n"); } else { /* * 200 GET http://foo.com/index.html 12422 bytes 102ms (2009-03-15T14:23:00.000-0700 - * 2009-03-15T14:23:00.102-0700) * * Request Headers - Foo => Bar Response Headers - Baz => Blah * ================================================================ */ synchronized (entries) { for (final Entry entry : entries) { sb.append(entry.statusCode).append(" ").append(entry.method).append(" ") .append(entry.url).append("\n"); sb.append(entry.bytes).append(" bytes\n"); sb.append(entry.end.getTime() - entry.start.getTime()).append("ms (") .append(sdf.format(entry.start)).append(" - ").append(sdf.format(entry.end)) .append("\n"); sb.append("\n"); sb.append("Request Headers\n"); for (Header header : entry.requestHeaders) { sb.append(" - ").append(header.name).append(" => ").append(header.value).append("\n"); } sb.append("Response Headers\n"); for (Header header : entry.responseHeaders) { sb.append(" - ").append(header.name).append(" => ").append(header.value).append("\n"); } sb.append("================================================================\n"); sb.append("\n"); } } } clear(); return "OK," + sb.toString(); } private void xmlHeaders(final StringBuilder sb, final List
headers) { for (final Header header : headers) { sb.append("
") .append(xml(header.value)).append("
\n"); } } private void jsonHeaders(final StringBuilder sb, final List
headers) { for (final Iterator
headItr = headers.iterator(); headItr.hasNext();) { final Header header = headItr.next(); sb.append("{\n"); sb.append(" ").append(jsonKey("name")).append(json(header.name)).append(",\n"); sb.append(" ").append(jsonKey("value")).append(json(header.value)).append("\n"); if (headItr.hasNext()) { sb.append(" },"); } else { sb.append(" }"); } } } private String xml(String s) { s = s.replaceAll("&", "&"); s = s.replaceAll("\"", """); s = s.replaceAll("\\<", "<"); s = s.replaceAll("\\>", ">"); return s; } private String jsonKey(final String key) { final StringBuilder ret = new StringBuilder(); ret.append(" \"").append(key).append("\"").append(":"); return ret.toString(); } private Object json(String s) { s = s.replaceAll("\\'", "\\\\'"); s = s.replaceAll("\\\"", "\\\\\""); s = s.replaceAll("\n", "\\\\n"); final StringBuilder ret = new StringBuilder(); ret.append("\"").append(s).append("\""); return ret.toString(); } public static class Entry { private String method; private String url; private int statusCode; private Date start; private Date end; private long bytes; private List
requestHeaders = new ArrayList
(); private List
responseHeaders = new ArrayList
(); public Entry(String method, String url) { this.method = method; this.url = url; this.start = new Date(); } public void finish(int statusCode, long bytes) { this.statusCode = statusCode; this.bytes = bytes; this.end = new Date(); } public void addRequestHeaders(HttpRequest request) { Enumeration names = request.getFieldNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String value = request.getField(name); requestHeaders.add(new Header(name, value)); } } public void addResponseHeader(HttpResponse response) { Enumeration names = response.getFieldNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String value = response.getField(name); responseHeaders.add(new Header(name, value)); } } public void setStart(Date start) { this.start = start; } public void setEnd(Date end) { this.end = end; } @Override public String toString() { return method + "|" + statusCode + "|" + url + "|" + requestHeaders.size() + "|" + responseHeaders.size() + "\n"; } public void addRequestHeader(String key, String value) { this.requestHeaders.add(new Header(key, value)); } } public static class Header { private String name; private String value; public Header(String name, String value) { this.name = name; this.value = value; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy