OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
http_server.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "http/http_server.h"
6 
7 #include "http/http_session.h"
8 #include "io/event_manager.h"
9 
10 using namespace std;
11 
12 HttpServer::HttpServer(EventManager *evm, const SslConfig &config, uint8_t dscp)
13  : SslServer(evm, boost::asio::ssl::context::tlsv12_server,
14  config.ssl_enabled, false), dscp_value_(dscp) {
15  //ctor
16  if (config.ssl_enabled) {
17 
18  // Get SSL context from base class and update
19  boost::asio::ssl::context *ctx = context();
20  boost::system::error_code ec;
21 
22  // set mode
23  ctx->set_options(boost::asio::ssl::context::default_workarounds |
24  boost::asio::ssl::context::no_sslv3 |
25  boost::asio::ssl::context::no_sslv2 |
26  boost::asio::ssl::context::no_tlsv1 |
27  boost::asio::ssl::context::no_tlsv1_1, ec);
28  if (ec.value() != 0) {
29  exit(EINVAL);
30  }
31 
32  // CA certificate, used to verify if the peer certificate
33  // is signed by a trusted CA
34  std::string ca_cert_filename = config.ca_cert;
35  bool insecure = config.ssl_insecure;
36  if (!ca_cert_filename.empty() && !insecure) {
37 
38  // Verify peer has CA signed certificate
39  ctx->set_verify_mode(boost::asio::ssl::verify_peer |
40  boost::asio::ssl::verify_fail_if_no_peer_cert, ec);
41  if (ec.value() != 0) {
42  exit(EINVAL);
43  }
44 
45  ctx->load_verify_file(ca_cert_filename, ec);
46  if (ec.value() != 0) {
47  exit(EINVAL);
48  }
49  }
50 
51  // server certificate
52  ctx->use_certificate_file(config.certfile,
53  boost::asio::ssl::context::pem, ec);
54  if (ec.value() != 0) {
55  exit(EINVAL);
56  }
57 
58  // server private key
59  ctx->use_private_key_file(config.keyfile,
60  boost::asio::ssl::context::pem, ec);
61  if (ec.value() != 0) {
62  exit(EINVAL);
63  }
64  }
65 }
66 
68  //dtor
69 }
70 
72  http_handlers_.clear();
74 }
75 
77  SslSession *session = new HttpSession(this, socket);
78  boost::system::error_code err;
79  HttpSession *https = static_cast<HttpSession *>(session);
80  https->SetSocketOptions();
81  return session;
82 }
83 
85  HttpSession *h_session = dynamic_cast<HttpSession *>(session);
86  if (dscp_value_) {
87  h_session->SetDscpSocketOption(dscp_value_);
88  }
89  h_session->AcceptSession();
90  return true;
91 }
92 
94  HttpSession *h_session = dynamic_cast<HttpSession *>(session);
95  if (dscp_value_) {
96  h_session->SetDscpSocketOption(dscp_value_);
97  }
98  h_session->AcceptSession();
99  return true;
100 }
101 
102 void HttpServer::RegisterHandler(const string &path, HttpHandlerFn handler) {
103  http_handlers_.insert(make_pair(path, handler));
104 }
105 
107  HandlerTrie::iterator iter = http_handlers_.find(path);
108  if (iter == http_handlers_.end()) {
109  // check if wildcard entry is present
110  iter = http_handlers_.find(HTTP_WILDCARD_ENTRY);
111  if (iter == http_handlers_.end()) {
112  return NULL;
113  }
114  }
115  return iter->second;
116 }
117 
118 void HttpServer::UpdateDscp(uint8_t value) {
119  if (value == dscp_value_)
120  return;
121  dscp_value_ = value;
122  SetListenSocketDscp(value);
123 }
virtual ~HttpServer()
Definition: http_server.cc:67
boost::asio::ssl::context * context()
Definition: ssl_server.cc:41
boost::function< void(HttpSession *session, const HttpRequest *)> HttpHandlerFn
Definition: http_server.h:38
void Shutdown()
Definition: tcp_server.cc:143
HttpServer(EventManager *evm, const SslConfig &config=SslConfig(), uint8_t dscp=0)
Definition: http_server.cc:12
std::string ca_cert
Definition: http_server.h:24
boost::asio::ssl::stream< boost::asio::ip::tcp::socket > SslSocket
Definition: ssl_server.h:16
void AcceptSession()
bool ssl_enabled
Definition: http_server.h:25
void Shutdown()
Definition: http_server.cc:71
virtual SslSession * AllocSession(SslSocket *socket)
Definition: http_server.cc:76
HttpHandlerFn GetHandler(const std::string &path)
Definition: http_server.cc:106
std::string certfile
Definition: http_server.h:23
#define HTTP_WILDCARD_ENTRY
Definition: http_server.h:16
void UpdateDscp(uint8_t value)
Definition: http_server.cc:118
bool ssl_insecure
Definition: http_server.h:26
int SetListenSocketDscp(uint8_t value)
Definition: tcp_server.cc:527
int SetDscpSocketOption(uint8_t value)
Definition: tcp_session.cc:569
HandlerTrie http_handlers_
Definition: http_server.h:54
virtual bool AcceptSession(SslSession *session)
Definition: http_server.cc:93
uint8_t dscp_value_
Definition: http_server.h:55
std::string keyfile
Definition: http_server.h:22
void RegisterHandler(const std::string &path, HttpHandlerFn handler)
Definition: http_server.cc:102
virtual boost::system::error_code SetSocketOptions()
Definition: tcp_session.cc:868
static EventManager evm