1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef IOS_WEB_PUBLIC_TEST_HTTP_SERVER_H_
6 #define IOS_WEB_PUBLIC_TEST_HTTP_SERVER_H_
10 #import "base/mac/scoped_nsobject.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/synchronization/lock.h"
15 #include "ios/web/public/test/response_providers/response_provider.h"
22 // A convience class for wrapping a ResponseProvider so that it can be used
23 // inside data structures that operate on ref counted objects. This class is a
24 // ref counted container for a ResponseProvider.
25 // This object exists for legacy reasons since a large part of the code base
26 // still uses ResponseProviders that are not ref counted.
27 class RefCountedResponseProviderWrapper
:
28 public base::RefCounted
<RefCountedResponseProviderWrapper
> {
31 explicit RefCountedResponseProviderWrapper(
32 ResponseProvider
* response_provider
);
33 // Returns the ResponseProvider that backs this object.
34 ResponseProvider
* GetResponseProvider() { return response_provider_
.get(); }
36 friend class base::RefCounted
<RefCountedResponseProviderWrapper
>;
37 // The ResponseProvider that backs this object.
38 scoped_ptr
<ResponseProvider
> response_provider_
;
39 virtual ~RefCountedResponseProviderWrapper();
42 // The HttpServer is an in-process web server that is used to service requests.
43 // It is a singleton and backed by a GCDWebServer.
44 // HttpServer can be configured to serve requests by registering
45 // web::ResponseProviders.
46 // This class is not thread safe on the whole and only certain methods are
50 typedef ScopedVector
<ResponseProvider
> ProviderList
;
52 // Returns the shared HttpServer instance. Thread safe.
53 static HttpServer
& GetSharedInstance();
54 // Returns the shared HttpServer instance and registers the response providers
55 // as well. Takes ownership of the response providers. Must be called from the
57 static HttpServer
& GetSharedInstanceWithResponseProviders(
58 const ProviderList
& response_providers
);
60 // A convenience method for the longer form of
61 // |web::test::HttpServer::GetSharedInstance().MakeUrlForHttpServer|
62 static GURL
MakeUrl(const std::string
& url
);
64 // Starts the server on the default port 8080. CHECKs if the server can not be
66 // Must be called from the main thread.
68 // Starts the server on |port|. Returns true on success, false otherwise.
69 // Must be called from the main thread.
70 bool StartOnPort(NSUInteger port
);
71 // Stops the server and prevents it from accepting new requests.
72 // Must be called from the main thread.
74 // Returns true if the server is running.
75 // Must be called from the main thread.
76 bool IsRunning() const;
78 // Adds a ResponseProvider. Takes ownership of the ResponseProvider.
79 // Note for using URLs inside of the |response_provider|:
80 // The HttpServer cannot run on default HTTP port 80, so URLs used in
81 // ResponseProviders must be converted at runtime after the HttpServer's port
82 // is determined. Please use |MakeUrl| to handle converting URLs.
83 // Must be called from the main thread.
84 void AddResponseProvider(ResponseProvider
* response_provider
);
85 // Removes the |response_provider|. Must be called from the main thread.
86 void RemoveResponseProvider(ResponseProvider
* response_provider
);
87 // Removes all the response providers. Must be called from the main thread.
88 void RemoveAllResponseProviders();
91 // Initializes the server by registering for a GCDWebServer servlet. Must be
92 // called from the main thread.
93 void InitHttpServer();
97 // Sets the port that the server is running on. Thread Safe
98 void SetPort(NSUInteger port
);
99 // Returns the port that the server is running on. Thread Safe
100 NSUInteger
GetPort() const;
102 // Creates a GURL that the server can service based on the |url|
104 // It does not rewrite URLs if the |url| can already be serviced by the
106 // |url| must be a valid URL. Thread safe.
107 GURL
MakeUrlForHttpServer(const std::string
& url
) const;
109 // Returns the response provider that can handle the |request|.
110 // Note: No more than one reponse provider can handle the request.
112 scoped_refptr
<RefCountedResponseProviderWrapper
>
113 GetResponseProviderForRequest(
114 const web::ResponseProvider::Request
& request
);
116 // Lock for serializing access to |provider_|.
117 mutable base::Lock provider_list_lock_
;
118 // Lock for serializing access to |port_|.
119 mutable base::Lock port_lock_
;
120 // The port that the server is running on. 0 if the server is not running.
122 // The GCDWebServer backing the HttpServer.
123 base::scoped_nsobject
<GCDWebServer
> gcd_web_server_
;
124 // The list of providers to service a request.
125 std::vector
<scoped_refptr
<RefCountedResponseProviderWrapper
>> providers_
;
126 DISALLOW_COPY_AND_ASSIGN(HttpServer
);
132 #endif // IOS_WEB_PUBLIC_TEST_HTTP_SERVER_H_