// Copyright (c) 2011 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 "net/tools/flip_server/flip_config.h"
namespace net {
FlipAcceptor::FlipAcceptor(enum FlipHandlerType flip_handler_type,
std::string listen_ip,
std::string listen_port,
std::string ssl_cert_filename,
std::string ssl_key_filename,
std::string http_server_ip,
std::string http_server_port,
std::string https_server_ip,
std::string https_server_port,
int spdy_only,
int accept_backlog_size,
bool disable_nagle,
int accepts_per_wake,
bool reuseport,
bool wait_for_iface,
void *memory_cache)
: flip_handler_type_(flip_handler_type),
listen_ip_(listen_ip),
listen_port_(listen_port),
ssl_cert_filename_(ssl_cert_filename),
ssl_key_filename_(ssl_key_filename),
http_server_ip_(http_server_ip),
http_server_port_(http_server_port),
https_server_ip_(https_server_ip),
https_server_port_(https_server_port),
spdy_only_(spdy_only),
accept_backlog_size_(accept_backlog_size),
disable_nagle_(disable_nagle),
accepts_per_wake_(accepts_per_wake),
memory_cache_(memory_cache),
ssl_session_expiry_(300), // TODO(mbelshe): Hook these up!
ssl_disable_compression_(false),
idle_socket_timeout_s_(300) {
VLOG(1) << "Attempting to listen on " << listen_ip_.c_str() << ":"
<< listen_port_.c_str();
if (!https_server_ip_.size())
https_server_ip_ = http_server_ip_;
if (!https_server_port_.size())
https_server_port_ = http_server_port_;
while (1) {
int ret = CreateListeningSocket(listen_ip_,
listen_port_,
true,
accept_backlog_size_,
true,
reuseport,
wait_for_iface,
disable_nagle_,
&listen_fd_);
if ( ret == 0 ) {
break;
} else if ( ret == -3 && wait_for_iface ) {
// Binding error EADDRNOTAVAIL was encounted. We need
// to wait for the interfaces to raised. try again.
usleep(200000);
} else {
LOG(ERROR) << "Unable to create listening socket for: ret = " << ret
<< ": " << listen_ip_.c_str() << ":"
<< listen_port_.c_str();
return;
}
}
SetNonBlocking(listen_fd_);
VLOG(1) << "Listening on socket: ";
if (flip_handler_type == FLIP_HANDLER_PROXY)
VLOG(1) << "\tType : Proxy";
else if (FLIP_HANDLER_SPDY_SERVER)
VLOG(1) << "\tType : SPDY Server";
else if (FLIP_HANDLER_HTTP_SERVER)
VLOG(1) << "\tType : HTTP Server";
VLOG(1) << "\tIP : " << listen_ip_;
VLOG(1) << "\tPort : " << listen_port_;
VLOG(1) << "\tHTTP Server : " << http_server_ip_ << ":"
<< http_server_port_;
VLOG(1) << "\tHTTPS Server : " << https_server_ip_ << ":"
<< https_server_port_;
VLOG(1) << "\tSSL : "
<< (ssl_cert_filename.size()?"true":"false");
VLOG(1) << "\tCertificate : " << ssl_cert_filename;
VLOG(1) << "\tKey : " << ssl_key_filename;
VLOG(1) << "\tSpdy Only : " << (spdy_only?"true":"flase");
}
FlipAcceptor::~FlipAcceptor() {}
FlipConfig::FlipConfig()
: server_think_time_in_s_(0),
log_destination_(logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG),
wait_for_iface_(false) {
}
FlipConfig::~FlipConfig() {}
void FlipConfig::AddAcceptor(enum FlipHandlerType flip_handler_type,
std::string listen_ip,
std::string listen_port,
std::string ssl_cert_filename,
std::string ssl_key_filename,
std::string http_server_ip,
std::string http_server_port,
std::string https_server_ip,
std::string https_server_port,
int spdy_only,
int accept_backlog_size,
bool disable_nagle,
int accepts_per_wake,
bool reuseport,
bool wait_for_iface,
void *memory_cache) {
// TODO(mbelshe): create a struct FlipConfigArgs{} for the arguments.
acceptors_.push_back(new FlipAcceptor(flip_handler_type,
listen_ip,
listen_port,
ssl_cert_filename,
ssl_key_filename,
http_server_ip,
http_server_port,
https_server_ip,
https_server_port,
spdy_only,
accept_backlog_size,
disable_nagle,
accepts_per_wake,
reuseport,
wait_for_iface,
memory_cache));
}
} // namespace