blob: 60da71420645c866e0c85f26554a26b3f8c6aa79 [file] [log] [blame]
// 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.
#include "services/http_server/http_server_factory_impl.h"
#include "base/stl_util.h"
#include "mojo/services/http_server/interfaces/http_server.mojom.h"
#include "services/http_server/http_server_impl.h"
namespace http_server {
HttpServerFactoryImpl::HttpServerFactoryImpl(mojo::ApplicationImpl* app) {
app_ = app;
}
HttpServerFactoryImpl::~HttpServerFactoryImpl() {
// Free the http servers.
STLDeleteContainerPairSecondPointers(port_indicated_servers_.begin(),
port_indicated_servers_.end());
STLDeleteContainerPointers(port_any_servers_.begin(),
port_any_servers_.end());
}
void HttpServerFactoryImpl::AddBinding(
mojo::InterfaceRequest<HttpServerFactory> request) {
bindings_.AddBinding(this, request.Pass());
}
void HttpServerFactoryImpl::DeleteServer(HttpServerImpl* server,
mojo::NetAddress* requested_address) {
ServerKey key = GetServerKey(requested_address);
if (key.second) { // If the port is non-zero.
DCHECK(port_indicated_servers_.count(key));
DCHECK_EQ(server, port_indicated_servers_[key]);
delete server;
port_indicated_servers_.erase(key);
} else {
DCHECK(port_any_servers_.count(server));
delete server;
port_any_servers_.erase(server);
}
}
HttpServerFactoryImpl::ServerKey HttpServerFactoryImpl::GetServerKey(
mojo::NetAddress* local_address) {
DCHECK(local_address);
if (local_address->family == mojo::NetAddressFamily::IPV6) {
return ServerKey(local_address->ipv6->addr, local_address->ipv6->port);
} else if (local_address->family == mojo::NetAddressFamily::IPV4) {
return ServerKey(local_address->ipv4->addr, local_address->ipv4->port);
} else {
return ServerKey();
}
}
void HttpServerFactoryImpl::CreateHttpServer(
mojo::InterfaceRequest<HttpServer> server_request,
mojo::NetAddressPtr local_address) {
if (!local_address) {
local_address = mojo::NetAddress::New();
local_address->family = mojo::NetAddressFamily::IPV4;
local_address->ipv4 = mojo::NetAddressIPv4::New();
local_address->ipv4->addr.resize(4);
local_address->ipv4->addr[0] = 0;
local_address->ipv4->addr[1] = 0;
local_address->ipv4->addr[2] = 0;
local_address->ipv4->addr[3] = 0;
local_address->ipv4->port = 0;
}
ServerKey key = GetServerKey(local_address.get());
if (key.second) { // If the port is non-zero.
if (!port_indicated_servers_.count(key)) {
port_indicated_servers_[key] =
new HttpServerImpl(app_, this, local_address.Pass());
}
port_indicated_servers_[key]->AddBinding(server_request.Pass());
} else {
HttpServerImpl* server =
new HttpServerImpl(app_, this, local_address.Pass());
server->AddBinding(server_request.Pass());
port_any_servers_.insert(server);
}
}
} // namespace http_server