| Index: net/test/android/javatests/src/org/chromium/net/test/HttpTestServer.java
|
| diff --git a/net/test/android/javatests/src/org/chromium/net/test/HttpTestServer.java b/net/test/android/javatests/src/org/chromium/net/test/HttpTestServer.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ced7b64e5f3e24dea983f905336186321e4012df
|
| --- /dev/null
|
| +++ b/net/test/android/javatests/src/org/chromium/net/test/HttpTestServer.java
|
| @@ -0,0 +1,139 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.net.test;
|
| +
|
| +import android.os.Environment;
|
| +import android.util.Log;
|
| +
|
| +import org.apache.http.HttpEntityEnclosingRequest;
|
| +import org.apache.http.HttpException;
|
| +import org.apache.http.HttpRequest;
|
| +import org.apache.http.HttpResponse;
|
| +import org.apache.http.HttpStatus;
|
| +import org.apache.http.HttpVersion;
|
| +import org.apache.http.entity.StringEntity;
|
| +import org.apache.http.message.BasicHttpResponse;
|
| +
|
| +import java.io.File;
|
| +import java.io.IOException;
|
| +import java.net.Socket;
|
| +import java.net.URI;
|
| +import java.net.URISyntaxException;
|
| +import java.util.ArrayList;
|
| +import java.util.List;
|
| +
|
| +import javax.net.ServerSocketFactory;
|
| +
|
| +/**
|
| + * An HTTP server used for testing Android builds of Chrome.
|
| + *
|
| + * This will eventually handle all of the HTTP functionality provided by
|
| + * //net/tools/testserver/testserver.py that is required for tests on Android.
|
| + */
|
| +public class HttpTestServer extends BaseHttpTestServer {
|
| + private static final String TAG = "HttpTestServer";
|
| +
|
| + private final File mDataDir;
|
| +
|
| + private final List<Handler> mGetHandlers;
|
| + private final List<Handler> mPostHandlers;
|
| + private final List<Handler> mPutHandlers;
|
| +
|
| + /**
|
| + * Creates an HTTP test server.
|
| + *
|
| + * @param serverFactory The factory to use to create the server socket.
|
| + * @param port The port to listen on for incoming connections.
|
| + * @param acceptTimeoutMs The timeout for accepting an incoming connection, in milliseconds.
|
| + * @param dataDir The relative directory from which files should be served.
|
| + */
|
| + public HttpTestServer(ServerSocketFactory serverFactory, int port, int acceptTimeoutMs,
|
| + String dataDir) throws IOException {
|
| + super(serverFactory, port, acceptTimeoutMs);
|
| +
|
| + File externalStorage = Environment.getExternalStorageDirectory();
|
| + mDataDir = new File(externalStorage, dataDir);
|
| + if (!mDataDir.getAbsolutePath().startsWith(externalStorage.getAbsolutePath())) {
|
| + throw new IOException("Attempted to set a data directory outside of "
|
| + + externalStorage.getAbsolutePath());
|
| + }
|
| +
|
| + mGetHandlers = new ArrayList<Handler>();
|
| + mGetHandlers.add(new DefaultResponseHandler());
|
| +
|
| + mPostHandlers = new ArrayList<Handler>();
|
| + mPostHandlers.addAll(mGetHandlers);
|
| +
|
| + mPutHandlers = new ArrayList<Handler>();
|
| + mPutHandlers.addAll(mGetHandlers);
|
| + }
|
| +
|
| + @Override
|
| + protected boolean validateSocket(Socket sock) {
|
| + return sock.getInetAddress().isLoopbackAddress();
|
| + }
|
| +
|
| + @Override
|
| + protected HttpResponse handleGet(HttpRequest request) throws HttpException {
|
| + return handleRequest(request, mGetHandlers);
|
| + }
|
| +
|
| + @Override
|
| + protected HttpResponse handlePost(HttpEntityEnclosingRequest request) throws HttpException {
|
| + return handleRequest(request, mPostHandlers);
|
| + }
|
| +
|
| + @Override
|
| + protected HttpResponse handlePut(HttpEntityEnclosingRequest request) throws HttpException {
|
| + return handleRequest(request, mPutHandlers);
|
| + }
|
| +
|
| + private static class ParsedHttpRequest {
|
| + public final URI mUri;
|
| +
|
| + public ParsedHttpRequest(HttpRequest request) throws IOException, URISyntaxException {
|
| + mUri = new URI(request.getRequestLine().getUri());
|
| + }
|
| + }
|
| +
|
| + private HttpResponse handleRequest(HttpRequest request, List<Handler> handlers)
|
| + throws HttpException {
|
| + try {
|
| + ParsedHttpRequest parsedRequest = new ParsedHttpRequest(request);
|
| + for (Handler h : handlers) {
|
| + if (h.shouldHandle(parsedRequest)) {
|
| + return h.handle(parsedRequest);
|
| + }
|
| + }
|
| + } catch (URISyntaxException e) {
|
| + Log.e(TAG, "Error parsing the URI", e);
|
| + return new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_BAD_REQUEST, "");
|
| + } catch (IOException e) {
|
| + Log.e(TAG, "Error while handling a request", e);
|
| + }
|
| +
|
| + return new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_INTERNAL_SERVER_ERROR, "");
|
| + }
|
| +
|
| + private interface Handler {
|
| + public boolean shouldHandle(ParsedHttpRequest request);
|
| +
|
| + public HttpResponse handle(ParsedHttpRequest request) throws IOException;
|
| + }
|
| +
|
| + private static class DefaultResponseHandler implements Handler {
|
| + public boolean shouldHandle(ParsedHttpRequest request) {
|
| + return true;
|
| + }
|
| +
|
| + public HttpResponse handle(ParsedHttpRequest request) throws IOException {
|
| + HttpResponse response =
|
| + new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "");
|
| + response.setEntity(
|
| + new StringEntity("Default response for given path: " + request.mUri.getPath()));
|
| + return response;
|
| + }
|
| + }
|
| +}
|
|
|