
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.
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