# Prerequisites
* A Mac running OS X 10.6 ("Snow Leopard") or Linux (tested with Ubuntu
Lucid). Support for Windows is still experimental
* [Python 2.6](http://www.python.org/download/releases/2.6.6/)

# Install
Only do this the first time.

1. Open the Terminal application and download the source.
```
$ git clone https://github.com/chromium/web-page-replay.git
```
2. Move to the newly created directory.
```
$ cd web-page-replay
```
## Network simulation
For network simulation, you can use https://github.com/WPO-Foundation/tsproxy
which works on most platforms. More realistic network simulation options can be
achieved through using tools like dummynet, but those only support limited
platforms.

# Record
First you must record the web page or pages that you wish to replay.

1. Open the web browser you wish to use and clear its cache so that all
resources will be requested from the network.
2. Switch to the Terminal application and start the program in record mode.
All HTTP requests performed on the machine while it is running will be
saved into the archive.
```
$ sudo ./replay.py --record ~/archive.wpr
```
3. Load the web page or pages in the open web browser. Be sure to wait
until each is fully loaded.
4. Stop recording by killing the replay.py process with Ctrl+c. The archive
will be saved to ~/archive.wpr.

# Replay
After you have created an archive, you may later replay it at any time.

1. Start the program in replay mode with a previously recorded archive.
```
$ sudo ./replay.py ~/archive.wpr
```
2. Load recorded pages in a web browser. A 404 will be served for any pages
or resources not in the recorded archive.
3. Stop replaying by killing the replay.py process with Ctrl+c.

## Network simulation examples
During replay, you may simulate desired network conditions. This is
useful for benchmarking.

* 128KByte/s uplink bandwidth, 4Mbps/s downlink bandwidth with 100ms RTT
time
```
$ sudo ./replay.py --up 128KByte/s --down 4Mbit/s --delay_ms=100 archive.wpr
```
* 1% packet loss rate
```
$ sudo ./replay.py --packet_loss_rate=0.01 ~/archive.wpr
```

## Using browser proxy settings
You may choose to disable the forwarding of DNS requests to the local
replay server. If DNS request forwarding is disabled, an external
mechanism must be used to forward traffic to the replay server.

* Disable DNS forwarding
```
$ ./replay.py --no-dns_forwarding --record ~/archive.wpr
```
* Forwarding traffic to replay server (via Google Chrome on linux)
1. Go to Chrome Preferences -> Under the Hood -> Change Proxy Settings
2. Under Manual Proxy configuration -> HTTP proxy, enter 127.0.0.1 for IP
and the port that web page replay is configured to listen to (default
80).

Alternatively, traffic forwarding may also be configured via command
line flags.
```
$ google-chrome --host-resolver-rules="MAP * 127.0.0.1:80,EXCLUDE localhost"
```

# HTTPS/SSL support
By default, Web Page Replay, creates a self-signed certificate to serve
SSL traffic. In order for it to work, browsers need to be configured to
ignore certificate errors. Be aware that doing so opens a giant security
hole.

```
$ google-chrome --ignore-certificate-errors
```

Firefox has [a configuration file for
exceptions](https://developer.mozilla.org/En/Cert_override.txt). That requires listing
each host that gets used. If you have a better solution, please add it
to the comments below. IE and Safari options are also needed.

To turn off SSL support, run replay.py with "--no-ssl".

# Troubleshooting

## Permission errors

On Linux, either of the following two errors are permission problems:

```
python: can't open file './replay.py': [Errno 13] Permission denied
```
```
Traceback (most recent call last):
  File "./replay.py", line 50, in <module>
    import dnsproxy
  File "/home/slamm/p/wpr/dnsproxy.py", line 19, in <module>
    import platformsettings
ImportError: No module named platformsettings
```
This can happen if you checkout the files to an NFS directory. Either
move the files to a local directory, or make them world
readable/executable.

## Unable to access auto mounted directories
WPR can cause autofs to hang. On Ubuntu, the following command fixes it:

```
$ sudo restart autofs
```

# Help

For full usage instructions and advanced options, see the program's
help.

```
$ ./replay.py --help
```
