| Index: ios/web/public/test/http_server.mm
|
| diff --git a/ios/web/public/test/http_server.mm b/ios/web/public/test/http_server.mm
|
| deleted file mode 100644
|
| index b5789f4a0328fe83c85133b2ab5a7b418e9188e7..0000000000000000000000000000000000000000
|
| --- a/ios/web/public/test/http_server.mm
|
| +++ /dev/null
|
| @@ -1,260 +0,0 @@
|
| -// Copyright 2014 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.
|
| -
|
| -#import "ios/web/public/test/http_server.h"
|
| -
|
| -#import <Foundation/Foundation.h>
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/logging.h"
|
| -#include "base/memory/ref_counted.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/sys_string_conversions.h"
|
| -#import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServer.h"
|
| -#import "ios/third_party/gcdwebserver/src/GCDWebServer/Core/GCDWebServerResponse.h"
|
| -#import "ios/third_party/gcdwebserver/src/GCDWebServer/Requests/GCDWebServerDataRequest.h"
|
| -#import "net/base/mac/url_conversions.h"
|
| -
|
| -#include "url/gurl.h"
|
| -
|
| -namespace {
|
| -
|
| -// The default port on which the GCDWebServer is brought up on.
|
| -const NSUInteger kDefaultPort = 8080;
|
| -
|
| -// Converts a GCDWebServerDataRequest (received from the GCDWebServer servlet)
|
| -// to a request object that the ResponseProvider expects.
|
| -web::ResponseProvider::Request ResponseProviderRequestFromGCDWebServerRequest(
|
| - GCDWebServerDataRequest* request) {
|
| - GURL url(net::GURLWithNSURL(request.URL));
|
| - std::string method(base::SysNSStringToUTF8(request.method));
|
| - base::scoped_nsobject<NSString> body(
|
| - [[NSString alloc] initWithData:request.data
|
| - encoding:NSUTF8StringEncoding]);
|
| - __block net::HttpRequestHeaders headers;
|
| - [[request headers] enumerateKeysAndObjectsUsingBlock:^(NSString* header_key,
|
| - NSString* header_value,
|
| - BOOL*) {
|
| - headers.SetHeader(base::SysNSStringToUTF8(header_key),
|
| - base::SysNSStringToUTF8(header_value));
|
| - }];
|
| - return web::ResponseProvider::Request(url, method,
|
| - base::SysNSStringToUTF8(body), headers);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace web {
|
| -namespace test {
|
| -
|
| -RefCountedResponseProviderWrapper::RefCountedResponseProviderWrapper(
|
| - std::unique_ptr<ResponseProvider> response_provider)
|
| - : response_provider_(std::move(response_provider)) {}
|
| -
|
| -RefCountedResponseProviderWrapper::~RefCountedResponseProviderWrapper() {}
|
| -
|
| -// static
|
| -HttpServer& HttpServer::GetSharedInstance() {
|
| - static web::test::HttpServer* shared_instance = nullptr;
|
| - static dispatch_once_t once;
|
| - dispatch_once(&once, ^{
|
| - shared_instance = new HttpServer();
|
| - });
|
| - return *shared_instance;
|
| -}
|
| -
|
| -// static
|
| -HttpServer& HttpServer::GetSharedInstanceWithResponseProviders(
|
| - ProviderList response_providers) {
|
| - DCHECK([NSThread isMainThread]);
|
| - HttpServer& server = HttpServer::GetSharedInstance();
|
| - // Use non-const reference as the response_provider ownership is transfered.
|
| - for (std::unique_ptr<ResponseProvider>& provider : response_providers)
|
| - server.AddResponseProvider(std::move(provider));
|
| - return server;
|
| -}
|
| -
|
| -void HttpServer::InitHttpServer() {
|
| - DCHECK(gcd_web_server_);
|
| - // Note: This block is called from an arbitrary GCD thread.
|
| - id process_request =
|
| - ^GCDWebServerResponse*(GCDWebServerDataRequest* request) {
|
| - // Relax the cross-thread access restriction to non-thread-safe RefCount.
|
| - // TODO(crbug.com/707010): Remove ScopedAllowCrossThreadRefCountAccess.
|
| - base::ScopedAllowCrossThreadRefCountAccess
|
| - allow_cross_thread_ref_count_access;
|
| -
|
| - ResponseProvider::Request provider_request =
|
| - ResponseProviderRequestFromGCDWebServerRequest(request);
|
| - scoped_refptr<RefCountedResponseProviderWrapper>
|
| - ref_counted_response_provider = GetResponseProviderForRequest(
|
| - provider_request);
|
| -
|
| - if (!ref_counted_response_provider) {
|
| - return [GCDWebServerResponse response];
|
| - }
|
| - ResponseProvider* response_provider =
|
| - ref_counted_response_provider->GetResponseProvider();
|
| - if (!response_provider) {
|
| - return [GCDWebServerResponse response];
|
| - }
|
| -
|
| - return response_provider->GetGCDWebServerResponse(provider_request);
|
| - };
|
| - [gcd_web_server_ removeAllHandlers];
|
| - // Register a servlet for all HTTP GET, POST methods.
|
| - [gcd_web_server_ addDefaultHandlerForMethod:@"GET"
|
| - requestClass:[GCDWebServerDataRequest class]
|
| - processBlock:process_request];
|
| - [gcd_web_server_ addDefaultHandlerForMethod:@"POST"
|
| - requestClass:[GCDWebServerDataRequest class]
|
| - processBlock:process_request];
|
| -}
|
| -
|
| -HttpServer::HttpServer() : port_(0) {
|
| - gcd_web_server_.reset([[GCDWebServer alloc] init]);
|
| - InitHttpServer();
|
| -}
|
| -
|
| -HttpServer::~HttpServer() {
|
| -}
|
| -
|
| -bool HttpServer::StartOnPort(NSUInteger port) {
|
| - DCHECK([NSThread isMainThread]);
|
| - DCHECK(!IsRunning()) << "The server is already running."
|
| - << " Please stop it before starting it again.";
|
| - BOOL success = [gcd_web_server_ startWithPort:port bonjourName:@""];
|
| - if (success) {
|
| - SetPort(port);
|
| - }
|
| - return success;
|
| -}
|
| -
|
| -void HttpServer::StartOrDie() {
|
| - DCHECK([NSThread isMainThread]);
|
| - StartOnPort(kDefaultPort);
|
| - CHECK(IsRunning());
|
| -}
|
| -
|
| -void HttpServer::Stop() {
|
| - DCHECK([NSThread isMainThread]);
|
| - DCHECK(IsRunning()) << "Cannot stop an already stopped server.";
|
| - RemoveAllResponseProviders();
|
| - [gcd_web_server_ stop];
|
| - SetPort(0);
|
| -}
|
| -
|
| -bool HttpServer::IsRunning() const {
|
| - DCHECK([NSThread isMainThread]);
|
| - return [gcd_web_server_ isRunning];
|
| -}
|
| -
|
| -NSUInteger HttpServer::GetPort() const {
|
| - base::AutoLock autolock(port_lock_);
|
| - return port_;
|
| -}
|
| -
|
| -// static
|
| -GURL HttpServer::MakeUrl(const std::string &url) {
|
| - return HttpServer::GetSharedInstance().MakeUrlForHttpServer(url);
|
| -}
|
| -
|
| -GURL HttpServer::MakeUrlForHttpServer(const std::string& url) const {
|
| - GURL result(url);
|
| - DCHECK(result.is_valid());
|
| - const std::string kLocalhostHost = std::string("localhost");
|
| - if (result.port() == base::IntToString(GetPort()) &&
|
| - result.host() == kLocalhostHost) {
|
| - return result;
|
| - }
|
| -
|
| - GURL::Replacements replacements;
|
| - replacements.SetHostStr(kLocalhostHost);
|
| -
|
| - const std::string port = std::string(
|
| - base::IntToString(static_cast<int>(GetPort())));
|
| - replacements.SetPortStr(port);
|
| -
|
| - // It is necessary to prepend the host of the input URL so that URLs such
|
| - // as http://origin/foo, http://destination/foo can be disamgiguated.
|
| - const std::string new_path = std::string(result.host() + result.path());
|
| - replacements.SetPathStr(new_path);
|
| -
|
| - return result.ReplaceComponents(replacements);
|
| -}
|
| -
|
| -scoped_refptr<RefCountedResponseProviderWrapper>
|
| - HttpServer::GetResponseProviderForRequest(
|
| - const web::ResponseProvider::Request& request) {
|
| - base::AutoLock autolock(provider_list_lock_);
|
| - // Relax the cross-thread access restriction to non-thread-safe RefCount.
|
| - // The lock above protects non-thread-safe RefCount in HTTPServer.
|
| - base::ScopedAllowCrossThreadRefCountAccess
|
| - allow_cross_thread_ref_count_access;
|
| - scoped_refptr<RefCountedResponseProviderWrapper> result;
|
| - for (const auto& ref_counted_response_provider : providers_) {
|
| - ResponseProvider* response_provider =
|
| - ref_counted_response_provider.get()->GetResponseProvider();
|
| - if (response_provider->CanHandleRequest(request)) {
|
| - DCHECK(!result) <<
|
| - "No more than one response provider can handle the same request.";
|
| - result = ref_counted_response_provider;
|
| - }
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -void HttpServer::AddResponseProvider(
|
| - std::unique_ptr<ResponseProvider> response_provider) {
|
| - DCHECK([NSThread isMainThread]);
|
| - DCHECK(IsRunning()) << "Can add a response provider only when the server is "
|
| - << "running.";
|
| - base::AutoLock autolock(provider_list_lock_);
|
| - // Relax the cross-thread access restriction to non-thread-safe RefCount.
|
| - // The lock above protects non-thread-safe RefCount in HTTPServer.
|
| - base::ScopedAllowCrossThreadRefCountAccess
|
| - allow_cross_thread_ref_count_access;
|
| - scoped_refptr<RefCountedResponseProviderWrapper>
|
| - ref_counted_response_provider(
|
| - new RefCountedResponseProviderWrapper(std::move(response_provider)));
|
| - providers_.push_back(ref_counted_response_provider);
|
| -}
|
| -
|
| -void HttpServer::RemoveResponseProvider(ResponseProvider* response_provider) {
|
| - DCHECK([NSThread isMainThread]);
|
| - base::AutoLock autolock(provider_list_lock_);
|
| - // Relax the cross-thread access restriction to non-thread-safe RefCount.
|
| - // The lock above protects non-thread-safe RefCount in HTTPServer.
|
| - base::ScopedAllowCrossThreadRefCountAccess
|
| - allow_cross_thread_ref_count_access;
|
| - auto found_iter = providers_.end();
|
| - for (auto it = providers_.begin(); it != providers_.end(); ++it) {
|
| - if ((*it)->GetResponseProvider() == response_provider) {
|
| - found_iter = it;
|
| - break;
|
| - }
|
| - }
|
| - if (found_iter != providers_.end()) {
|
| - providers_.erase(found_iter);
|
| - }
|
| -}
|
| -
|
| -void HttpServer::RemoveAllResponseProviders() {
|
| - DCHECK([NSThread isMainThread]);
|
| - base::AutoLock autolock(provider_list_lock_);
|
| - // Relax the cross-thread access restriction to non-thread-safe RefCount.
|
| - // The lock above protects non-thread-safe RefCount in HTTPServer.
|
| - base::ScopedAllowCrossThreadRefCountAccess
|
| - allow_cross_thread_ref_count_access;
|
| - providers_.clear();
|
| -}
|
| -
|
| -void HttpServer::SetPort(NSUInteger port) {
|
| - base::AutoLock autolock(port_lock_);
|
| - port_ = port;
|
| -}
|
| -
|
| -} // namespace test
|
| -} // namespace web
|
|
|