| Index: chrome_frame/test/test_server.h
|
| diff --git a/chrome_frame/test/test_server.h b/chrome_frame/test/test_server.h
|
| deleted file mode 100644
|
| index 80ffdd575a0463da31029e5be45d0484a9cf263d..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/test/test_server.h
|
| +++ /dev/null
|
| @@ -1,449 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#ifndef CHROME_FRAME_TEST_TEST_SERVER_H_
|
| -#define CHROME_FRAME_TEST_TEST_SERVER_H_
|
| -
|
| -// Implementation of an HTTP server for tests.
|
| -// To instantiate the server, make sure you have a message loop on the
|
| -// current thread and then create an instance of the SimpleWebServer class.
|
| -// The server uses two basic concepts, a request and a response.
|
| -// The Response interface represents an item (e.g. a document) available from
|
| -// the server. A Request object represents a request from a client (e.g. a
|
| -// browser). There are several basic Response classes implemented in this file,
|
| -// all derived from the Response interface.
|
| -//
|
| -// Here's a simple example that starts a web server that can serve up
|
| -// a single document (http://<server.host()>:1337/foo).
|
| -// All other requests will get a 404.
|
| -//
|
| -// MessageLoopForUI loop;
|
| -// test_server::SimpleWebServer server(1337);
|
| -// test_server::SimpleResponse document("/foo", "Hello World!");
|
| -// test_server.AddResponse(&document);
|
| -// loop.MessageLoop::Run();
|
| -//
|
| -// To close the web server, just go to http://<server.host()>:1337/quit.
|
| -//
|
| -// All Response classes count how many times they have been accessed. Just
|
| -// call Response::accessed().
|
| -//
|
| -// To implement a custom response object (e.g. to match against a request
|
| -// based on some data, serve up dynamic content or take some action on the
|
| -// server), just inherit from one of the response classes or directly from the
|
| -// Response interface and add your response object to the server's list of
|
| -// response objects.
|
| -
|
| -#include <list>
|
| -#include <string>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/memory_mapped_file.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "net/socket/stream_listen_socket.h"
|
| -
|
| -namespace test_server {
|
| -
|
| -class Request {
|
| - public:
|
| - Request() : content_length_(0) {
|
| - }
|
| -
|
| - void ParseHeaders(const std::string& headers);
|
| -
|
| - const std::string& method() const {
|
| - return method_;
|
| - }
|
| -
|
| - const std::string& path() const {
|
| - return path_;
|
| - }
|
| -
|
| - // Returns the argument section of a GET path.
|
| - // Note: does currently not work for POST request.
|
| - std::string arguments() const {
|
| - std::string ret;
|
| - std::string::size_type pos = path_.find('?');
|
| - if (pos != std::string::npos)
|
| - ret = path_.substr(pos + 1);
|
| - return ret;
|
| - }
|
| -
|
| - const std::string& headers() const {
|
| - return headers_;
|
| - }
|
| -
|
| - const std::string& content() const {
|
| - return content_;
|
| - }
|
| -
|
| - size_t content_length() const {
|
| - return content_length_;
|
| - }
|
| -
|
| - bool AllContentReceived() const {
|
| - return method_.length() && content_.size() >= content_length_;
|
| - }
|
| -
|
| - void OnDataReceived(const std::string& data);
|
| -
|
| - protected:
|
| - std::string method_;
|
| - std::string path_;
|
| - std::string version_;
|
| - std::string headers_;
|
| - std::string content_;
|
| - size_t content_length_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(Request);
|
| -};
|
| -
|
| -// Manages request headers for a single request.
|
| -// For each successful request that's made, the server will keep an instance
|
| -// of this class so that they can be checked even after the server has been
|
| -// shut down.
|
| -class Connection {
|
| - public:
|
| - explicit Connection(scoped_ptr<net::StreamListenSocket> sock)
|
| - : socket_(sock.Pass()) {
|
| - }
|
| -
|
| - ~Connection() {
|
| - }
|
| -
|
| - bool IsSame(const net::StreamListenSocket* socket) const {
|
| - return socket_ == socket;
|
| - }
|
| -
|
| - const Request& request() const {
|
| - return request_;
|
| - }
|
| -
|
| - Request& request() {
|
| - return request_;
|
| - }
|
| -
|
| - void OnSocketClosed() {
|
| - socket_.reset();
|
| - }
|
| -
|
| - protected:
|
| - scoped_ptr<net::StreamListenSocket> socket_;
|
| - Request request_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(Connection);
|
| -};
|
| -
|
| -// Abstract interface with default implementations for some of the methods and
|
| -// a counter for how many times the response object has served requests.
|
| -class Response {
|
| - public:
|
| - Response() : accessed_(0) {
|
| - }
|
| -
|
| - virtual ~Response() {
|
| - }
|
| -
|
| - // Returns true if this response object should be used for a given request.
|
| - virtual bool Matches(const Request& r) const = 0;
|
| -
|
| - // Response objects can optionally supply their own HTTP headers, completely
|
| - // bypassing the default ones.
|
| - virtual bool GetCustomHeaders(std::string* headers) const {
|
| - return false;
|
| - }
|
| -
|
| - // Optionally provide a content type. Return false if you don't specify
|
| - // a content type.
|
| - virtual bool GetContentType(std::string* content_type) const {
|
| - return false;
|
| - }
|
| -
|
| - virtual size_t ContentLength() const {
|
| - return 0;
|
| - }
|
| -
|
| - virtual void WriteContents(net::StreamListenSocket* socket) const {
|
| - }
|
| -
|
| - virtual void IncrementAccessCounter() {
|
| - accessed_++;
|
| - }
|
| -
|
| - size_t accessed() const {
|
| - return accessed_;
|
| - }
|
| -
|
| - protected:
|
| - size_t accessed_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(Response);
|
| -};
|
| -
|
| -// Partial implementation of Response that matches a request's path.
|
| -// This is just a convenience implementation for the boilerplate implementation
|
| -// of Matches(). Don't instantiate directly.
|
| -class ResponseForPath : public Response {
|
| - public:
|
| - explicit ResponseForPath(const char* request_path)
|
| - : request_path_(request_path) {
|
| - }
|
| -
|
| - virtual ~ResponseForPath();
|
| -
|
| - virtual bool Matches(const Request& r) const {
|
| - std::string path = r.path();
|
| - std::string::size_type pos = path.find('?');
|
| - if (pos != std::string::npos)
|
| - path = path.substr(0, pos);
|
| - return path.compare(request_path_) == 0;
|
| - }
|
| -
|
| - protected:
|
| - std::string request_path_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(ResponseForPath);
|
| -};
|
| -
|
| -// A very basic implementation of a response.
|
| -// A simple response matches a single document path on the server
|
| -// (e.g. "/foo") and returns a document in the form of a string.
|
| -class SimpleResponse : public ResponseForPath {
|
| - public:
|
| - SimpleResponse(const char* request_path, const std::string& contents)
|
| - : ResponseForPath(request_path), contents_(contents) {
|
| - }
|
| -
|
| - virtual ~SimpleResponse();
|
| -
|
| - virtual void WriteContents(net::StreamListenSocket* socket) const {
|
| - socket->Send(contents_.c_str(), contents_.length(), false);
|
| - }
|
| -
|
| - virtual size_t ContentLength() const {
|
| - return contents_.length();
|
| - }
|
| -
|
| - protected:
|
| - std::string contents_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SimpleResponse);
|
| -};
|
| -
|
| -// To serve up files from the web server, create an instance of FileResponse
|
| -// and add it to the server's list of responses. The content type of the
|
| -// file will be determined by calling FindMimeFromData which examines the
|
| -// contents of the file and performs registry lookups.
|
| -class FileResponse : public ResponseForPath {
|
| - public:
|
| - FileResponse(const char* request_path, const base::FilePath& file_path)
|
| - : ResponseForPath(request_path), file_path_(file_path) {
|
| - }
|
| -
|
| - virtual bool GetContentType(std::string* content_type) const;
|
| - virtual void WriteContents(net::StreamListenSocket* socket) const;
|
| - virtual size_t ContentLength() const;
|
| -
|
| - protected:
|
| - base::FilePath file_path_;
|
| - mutable scoped_ptr<base::MemoryMappedFile> file_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(FileResponse);
|
| -};
|
| -
|
| -// Returns a 302 (temporary redirect) to redirect the client from a path
|
| -// on the test server to a different URL.
|
| -class RedirectResponse : public ResponseForPath {
|
| - public:
|
| - RedirectResponse(const char* request_path, const std::string& redirect_url)
|
| - : ResponseForPath(request_path), redirect_url_(redirect_url) {
|
| - }
|
| -
|
| - virtual bool GetCustomHeaders(std::string* headers) const;
|
| -
|
| - protected:
|
| - std::string redirect_url_;
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(RedirectResponse);
|
| -};
|
| -
|
| -// typedef for a list of connections. Used by SimpleWebServer.
|
| -typedef std::list<Connection*> ConnectionList;
|
| -
|
| -// Implementation of a simple http server.
|
| -// Before creating an instance of the server, make sure the current thread
|
| -// has a message loop.
|
| -class SimpleWebServer : public net::StreamListenSocket::Delegate {
|
| - public:
|
| - // Constructs a server listening at the given port on a local IPv4 address.
|
| - // An address on a NIC is preferred over the loopback address.
|
| - explicit SimpleWebServer(int port);
|
| -
|
| - // Constructs a server listening at the given address:port.
|
| - SimpleWebServer(const std::string& address, int port);
|
| - virtual ~SimpleWebServer();
|
| -
|
| - void AddResponse(Response* response);
|
| -
|
| - // Ownership of response objects is by default assumed to be outside
|
| - // of the SimpleWebServer class.
|
| - // However, if the caller doesn't wish to maintain a list of response objects
|
| - // but rather let this class hold the only references to those objects,
|
| - // the caller can call this method to delete the objects as part of
|
| - // the cleanup process.
|
| - void DeleteAllResponses();
|
| -
|
| - // StreamListenSocket::Delegate overrides.
|
| - virtual void DidAccept(net::StreamListenSocket* server,
|
| - scoped_ptr<net::StreamListenSocket> connection);
|
| - virtual void DidRead(net::StreamListenSocket* connection,
|
| - const char* data,
|
| - int len);
|
| - virtual void DidClose(net::StreamListenSocket* sock);
|
| -
|
| - // Returns the host on which the server is listening. This is suitable for
|
| - // use in URLs for resources served by this instance.
|
| - const std::string& host() const {
|
| - return host_;
|
| - }
|
| -
|
| - const ConnectionList& connections() const {
|
| - return connections_;
|
| - }
|
| -
|
| - protected:
|
| - class QuitResponse : public SimpleResponse {
|
| - public:
|
| - QuitResponse()
|
| - : SimpleResponse("/quit", "So long and thanks for all the fish.") {
|
| - }
|
| -
|
| - virtual void WriteContents(net::StreamListenSocket* socket) const {
|
| - SimpleResponse::WriteContents(socket);
|
| - base::MessageLoop::current()->Quit();
|
| - }
|
| - };
|
| -
|
| - Response* FindResponse(const Request& request) const;
|
| - Connection* FindConnection(const net::StreamListenSocket* socket) const;
|
| -
|
| - std::string host_;
|
| - scoped_ptr<net::StreamListenSocket> server_;
|
| - ConnectionList connections_;
|
| - std::list<Response*> responses_;
|
| - QuitResponse quit_;
|
| -
|
| - private:
|
| - void Construct(const std::string& address, int port);
|
| - DISALLOW_COPY_AND_ASSIGN(SimpleWebServer);
|
| -};
|
| -
|
| -// Simple class holding incoming HTTP request. Can send the HTTP response
|
| -// at different rate - small chunks, on regular interval.
|
| -class ConfigurableConnection : public base::RefCounted<ConfigurableConnection> {
|
| - public:
|
| - struct SendOptions {
|
| - enum Speed { IMMEDIATE, DELAYED, IMMEDIATE_HEADERS_DELAYED_CONTENT };
|
| - SendOptions() : speed_(IMMEDIATE), chunk_size_(0), timeout_(0) { }
|
| - SendOptions(Speed speed, int chunk_size, int64 timeout)
|
| - : speed_(speed), chunk_size_(chunk_size), timeout_(timeout) {
|
| - }
|
| -
|
| - Speed speed_;
|
| - int chunk_size_;
|
| - int64 timeout_;
|
| - };
|
| -
|
| - explicit ConfigurableConnection(scoped_ptr<net::StreamListenSocket> sock)
|
| - : socket_(sock.Pass()),
|
| - cur_pos_(0) {}
|
| -
|
| - // Send HTTP response with provided |headers| and |content|. Appends
|
| - // "Context-Length:" header if the |content| is not empty.
|
| - void Send(const std::string& headers, const std::string& content);
|
| -
|
| - // Send HTTP response with provided |headers| and |content|. Appends
|
| - // "Context-Length:" header if the |content| is not empty.
|
| - // Use the |options| to tweak the network speed behaviour.
|
| - void SendWithOptions(const std::string& headers, const std::string& content,
|
| - const SendOptions& options);
|
| -
|
| - private:
|
| - friend class HTTPTestServer;
|
| - // Sends a chunk of the response and queues itself as a task for sending
|
| - // next chunk of |data_|.
|
| - void SendChunk();
|
| -
|
| - // Closes the connection by releasing this instance's reference on its socket.
|
| - void Close();
|
| -
|
| - scoped_ptr<net::StreamListenSocket> socket_;
|
| - Request r_;
|
| - SendOptions options_;
|
| - std::string data_;
|
| - int cur_pos_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ConfigurableConnection);
|
| -};
|
| -
|
| -// Simple class used as a base class for mock webserver.
|
| -// Override virtual functions Get and Post and use passed ConfigurableConnection
|
| -// instance to send the response.
|
| -class HTTPTestServer : public net::StreamListenSocket::Delegate {
|
| - public:
|
| - HTTPTestServer(int port, const std::wstring& address,
|
| - base::FilePath root_dir);
|
| - virtual ~HTTPTestServer();
|
| -
|
| - // HTTP GET request is received. Override in derived classes.
|
| - // |connection| can be used to send the response.
|
| - virtual void Get(ConfigurableConnection* connection,
|
| - const std::wstring& path, const Request& r) = 0;
|
| -
|
| - // HTTP POST request is received. Override in derived classes.
|
| - // |connection| can be used to send the response
|
| - virtual void Post(ConfigurableConnection* connection,
|
| - const std::wstring& path, const Request& r) = 0;
|
| -
|
| - // Return the appropriate url with the specified path for this server.
|
| - std::wstring Resolve(const std::wstring& path);
|
| -
|
| - base::FilePath root_dir() { return root_dir_; }
|
| -
|
| - protected:
|
| - int port_;
|
| - std::wstring address_;
|
| - base::FilePath root_dir_;
|
| -
|
| - private:
|
| - typedef std::list<scoped_refptr<ConfigurableConnection> > ConnectionList;
|
| - ConnectionList::iterator FindConnection(
|
| - const net::StreamListenSocket* socket);
|
| - scoped_refptr<ConfigurableConnection> ConnectionFromSocket(
|
| - const net::StreamListenSocket* socket);
|
| -
|
| - // StreamListenSocket::Delegate overrides.
|
| - virtual void DidAccept(net::StreamListenSocket* server,
|
| - scoped_ptr<net::StreamListenSocket> socket);
|
| - virtual void DidRead(net::StreamListenSocket* socket,
|
| - const char* data, int len);
|
| - virtual void DidClose(net::StreamListenSocket* socket);
|
| -
|
| - scoped_ptr<net::StreamListenSocket> server_;
|
| - ConnectionList connection_list_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(HTTPTestServer);
|
| -};
|
| -
|
| -} // namespace test_server
|
| -
|
| -#endif // CHROME_FRAME_TEST_TEST_SERVER_H_
|
|
|