SPDY Proxy with Firefox for Android
===================================
This document describes how to use SPDY proxy from Android device
using Firefox for Android. No root privilege is required. It may be
possible to use other Web browser/software if they provide the ability
to specify HTTP proxy. Because we don't use the features only
available in latest Android devices, this method works on relatively
old but still used versions, e.g., Andriod 2.3 series.
Setting up SPDY Proxy
---------------------
If you have VPS, then you can setup SPDY proxy there. You can use
``shrpx`` with ``-s`` option + Squid as SPDY proxy. Alternatively,
`node-spdyproxy `_ may
also work. If you don't have VPS, but your home internet connection
has global IP address which can be accessible from Android device, you
can use your home PC as SPDY proxy temporarily for the experiment.
The self-signed certificate is OK because we will run ``shrpx`` with
``-k`` option on Android in this example. Alternatively, you can store
your certificate in Android device and specify it using ``--cacert``
option. If you think these are insecure, obtain valid certificate.
Building spdylay library and shrpx
----------------------------------
First Android NDK must be installed on your system. Refer
:doc:`package_README` to see how to install NDK. In the following document, We
use ``ANDROID_HOME`` environment variable.
To make it easier to run Android cross-compiler tools (and for the
sake of this document), include the path to those commands to
``PATH``::
$ export PATH=$ANDROID_HOME/toolchain/bin:$PATH
We need to build dependent libraries: OpenSSL and libevent.
To configure OpenSSL, use the following script::
#!/bin/sh
if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
./Configure --prefix=$PREFIX android
Then run ``make install`` to build and install library.
For libevent, use the following script to configure::
#!/bin/sh
if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
./configure \
--host=arm-linux-androideabi \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--prefix=$PREFIX \
--disable-shared \
--enable-static \
CPPFLAGS=-I$PREFIX/include \
LDFLAGS=-L$PREFIX/lib
Then run ``make install`` to
build and install library.
To build spdylay, use ``android-config`` to configure and
``android-make`` to build as described in :doc:`package_README`.
If all went well, ``shrpx`` binary is created in src directory. Strip
debugging information from the binary using the following command::
$ arm-linux-androideabi-strip src/shrpx
Setup shrpx on Android device
-----------------------------
There may be several ways to run ``shrpx`` on Android. I describe the
way to use `Android Terminal Emulator
`_. It can be
installed from Google Play. Copy ``shrpx`` binary to the location
where the Android-Terminal-Emulator is installed (In case of my phone,
it is ``/data/data/jackpal.androidterm``) and give the executable
permission to ``shrpx`` using ``chmod``::
$ chmod 755 shrpx
Then run ``shrpx`` in client-mode like this::
$ ./shrpx -k -p -f localhost,8000 -b SPDY-PROXY-ADDR,SPDY-PROXY-PORT
Substitute ``SPDY-PROXY-ADDR`` and ``SPDY-PROXY-PORT`` with the SPDY
proxy address and port you have setup respectively. The ``-k`` option
tells ``shrpx`` not to complain the self-signed certificate for SPDY
proxy. The ``-p`` option makes ``shrpx`` run so called client mode.
In that mode, ``shrpx`` acts like ordinary HTTP forward proxy in
frontend connection, it forwards the requests from the client to
backend in encrypted SPDY connection. The ``-f`` option specify the
address and port ``shrpx`` listens to. In this setup, the web browser
should be setup to use HTTP proxy localhost:8000. The ``-b`` option
specify the SPDY proxy address and port ``shrpx`` forwards the
requests from the client. The configuration looks like this::
+----Android------------------------+ +---SPDY-Proxy------+
| [Firefox] <-- HTTP --> [shrpx] <--=-- SPDY --=-->[shrpx,squid]<--=-- SPDY --> ...
+-----------------------------------+ +-------------------+ HTTP
With the above command-line option, ``shrpx`` only opens 1 connection
to SPDY proxy. Of course, Firefox will use multiple connections to
neighboring ``shrpx``. ``shrpx`` coalesces all the requests in 1
backend connection, that is the benefit SPDY proxy brings in.
Setup Firefox to use SPDY proxy
-------------------------------
If you have not installed, Firefox for Android, install it. Enter
``about:config`` in URL bar in Firefox and locate proxy
settings. Setup those values like this::
network.proxy.http = localhost
network.proxy.http_port = 8000
network.proxy.ssl = localhost
network.proxy.ssl_port = 8000
network.proxy.type = 1
You also need to tweak the following settings to increase in-flight
requests to circumvent latency::
network.http.max-persistent-connections-per-proxy
network.http.max-connections
network.http.max-connections-per-server
Since ``shrpx`` handles maximum 100 concurrent streams, it is
reasonable to set
``network.http.max-persistent-connections-per-proxy`` to ``100``.
Now borwse the sites with Firefox. The all HTTP requests are now sent
via internal ``shrpx`` to SPDY proxy in 1 connection. SPDY proxy will
get resources on behalf of the client and sent back the response.