Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86806ce1 authored by Patrick Scott's avatar Patrick Scott
Browse files

Process synchronous requests in the same RequestQueue.

Use a dedicated Connection to process a synchronous request using the main
RequestQueue and on the WebCore thread.

HttpConnection, HttpsConnection, Connection:
    No need for ConnectionManager, just pass the proxy host to
    HttpsConnection. In Connection.clearPipe, empty should be set to true if the
    RequestFeeder does _not_ have a request for the host. I don't think that
    broke anything but it is incorrect.
ConnectionThread:
    Refactor the proxy selection into ConnectionManager.getConnection
RequestHandle:
    Add a new constructor that takes a Connection argument. Add processRequest
    to process a single request on that Connection.
RequestQueue:
    Add determine host to select between the request's host and the proxy. Add
    queueSynchronousRequest to make a new request that operates on a private
    connection. Add SyncFeeder to handle RequestFeeder.requeueRequest if the
    request fails.
Network: Use the new RequestQueue api to handle a synchronous request.

Bug: 1315832
parent 18d1255e
Loading
Loading
Loading
Loading
+4 −10
Original line number Diff line number Diff line
@@ -94,7 +94,6 @@ abstract class Connection {
     */
    private static final String HTTP_CONNECTION = "http.connection";

    RequestQueue.ConnectionManager mConnectionManager;
    RequestFeeder mRequestFeeder;

    /**
@@ -104,11 +103,9 @@ abstract class Connection {
    private byte[] mBuf;

    protected Connection(Context context, HttpHost host,
                         RequestQueue.ConnectionManager connectionManager,
                         RequestFeeder requestFeeder) {
        mContext = context;
        mHost = host;
        mConnectionManager = connectionManager;
        mRequestFeeder = requestFeeder;

        mCanPersist = false;
@@ -124,18 +121,15 @@ abstract class Connection {
     * necessary
     */
    static Connection getConnection(
            Context context, HttpHost host,
            RequestQueue.ConnectionManager connectionManager,
            Context context, HttpHost host, HttpHost proxy,
            RequestFeeder requestFeeder) {

        if (host.getSchemeName().equals("http")) {
            return new HttpConnection(context, host, connectionManager,
                                      requestFeeder);
            return new HttpConnection(context, host, requestFeeder);
        }

        // Otherwise, default to https
        return new HttpsConnection(context, host, connectionManager,
                                   requestFeeder);
        return new HttpsConnection(context, host, proxy, requestFeeder);
    }

    /**
@@ -338,7 +332,7 @@ abstract class Connection {
                mRequestFeeder.requeueRequest(tReq);
                empty = false;
            }
            if (empty) empty = mRequestFeeder.haveRequest(mHost);
            if (empty) empty = !mRequestFeeder.haveRequest(mHost);
        }
        return empty;
    }
+3 −16
Original line number Diff line number Diff line
@@ -108,24 +108,11 @@ class ConnectionThread extends Thread {
                if (HttpLog.LOGV) HttpLog.v("ConnectionThread: new request " +
                                            request.mHost + " " + request );

                HttpHost proxy = mConnectionManager.getProxyHost();

                HttpHost host;
                if (false) {
                    // Allow https proxy
                    host = proxy == null ? request.mHost : proxy;
                } else {
                    // Disallow https proxy -- tmob proxy server
                    // serves a request loop for https reqs
                    host = (proxy == null ||
                            request.mHost.getSchemeName().equals("https")) ?
                            request.mHost : proxy;
                }
                mConnection = mConnectionManager.getConnection(mContext, host);
                mConnection = mConnectionManager.getConnection(mContext,
                        request.mHost);
                mConnection.processRequests(request);
                if (mConnection.getCanPersist()) {
                    if (!mConnectionManager.recycleConnection(host,
                                mConnection)) {
                    if (!mConnectionManager.recycleConnection(mConnection)) {
                        mConnection.closeConnection();
                    }
                } else {
+1 −2
Original line number Diff line number Diff line
@@ -35,9 +35,8 @@ import org.apache.http.params.HttpConnectionParams;
class HttpConnection extends Connection {

    HttpConnection(Context context, HttpHost host,
                   RequestQueue.ConnectionManager connectionManager,
                   RequestFeeder requestFeeder) {
        super(context, host, connectionManager, requestFeeder);
        super(context, host, requestFeeder);
    }

    /**
+8 −6
Original line number Diff line number Diff line
@@ -131,13 +131,16 @@ public class HttpsConnection extends Connection {
     */
    private boolean mAborted = false;

    // Used when connecting through a proxy.
    private HttpHost mProxyHost;

    /**
     * Contructor for a https connection.
     */
    HttpsConnection(Context context, HttpHost host,
                    RequestQueue.ConnectionManager connectionManager,
    HttpsConnection(Context context, HttpHost host, HttpHost proxy,
                    RequestFeeder requestFeeder) {
        super(context, host, connectionManager, requestFeeder);
        super(context, host, requestFeeder);
        mProxyHost = proxy;
    }

    /**
@@ -159,8 +162,7 @@ public class HttpsConnection extends Connection {
    AndroidHttpClientConnection openConnection(Request req) throws IOException {
        SSLSocket sslSock = null;

        HttpHost proxyHost = mConnectionManager.getProxyHost();
        if (proxyHost != null) {
        if (mProxyHost != null) {
            // If we have a proxy set, we first send a CONNECT request
            // to the proxy; if the proxy returns 200 OK, we negotiate
            // a secure connection to the target server via the proxy.
@@ -172,7 +174,7 @@ public class HttpsConnection extends Connection {
            Socket proxySock = null;
            try {
                proxySock = new Socket
                    (proxyHost.getHostName(), proxyHost.getPort());
                    (mProxyHost.getHostName(), mProxyHost.getPort());

                proxySock.setSoTimeout(60 * 1000);

+21 −4
Original line number Diff line number Diff line
@@ -42,15 +42,13 @@ public class RequestHandle {
    private WebAddress    mUri;
    private String        mMethod;
    private Map<String, String> mHeaders;

    private RequestQueue  mRequestQueue;

    private Request       mRequest;

    private InputStream   mBodyProvider;
    private int           mBodyLength;

    private int           mRedirectCount = 0;
    // Used only with synchronous requests.
    private Connection    mConnection;

    private final static String AUTHORIZATION_HEADER = "Authorization";
    private final static String PROXY_AUTHORIZATION_HEADER = "Proxy-Authorization";
@@ -80,6 +78,19 @@ public class RequestHandle {
        mRequest = request;
    }

    /**
     * Creates a new request session with a given Connection. This connection
     * is used during a synchronous load to handle this request.
     */
    public RequestHandle(RequestQueue requestQueue, String url, WebAddress uri,
            String method, Map<String, String> headers,
            InputStream bodyProvider, int bodyLength, Request request,
            Connection conn) {
        this(requestQueue, url, uri, method, headers, bodyProvider, bodyLength,
                request);
        mConnection = conn;
    }

    /**
     * Cancels this request
     */
@@ -262,6 +273,12 @@ public class RequestHandle {
        mRequest.waitUntilComplete();
    }

    public void processRequest() {
        if (mConnection != null) {
            mConnection.processRequests(mRequest);
        }
    }

    /**
     * @return Digest-scheme authentication response.
     */
Loading