OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
http_session.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __HTTP_SESSION_H__
6 #define __HTTP_SESSION_H__
7 
8 #include <boost/scoped_ptr.hpp>
9 #include <tbb/concurrent_queue.h>
10 #include <tbb/atomic.h>
11 
12 #include "base/util.h"
13 #include "io/ssl_session.h"
14 
15 class HttpRequest;
16 class HttpServer;
17 
18 class HttpSession: public SslSession {
19  public:
20  typedef boost::function<void(HttpSession *session,
22 
23  HttpSession(HttpServer *server, SslSocket *sock, bool async_ready = true);
24  virtual ~HttpSession();
25  const std::string get_context() { return context_str_; }
26 
27  static bool SendSession(std::string const& s,
28  const uint8_t *data, size_t size, size_t *sent) {
29  HttpSessionPtr hs = GetSession(s);
30  if (!hs) return false;
31  return hs->Send(data, size, sent);
32  }
33  static std::string get_client_context(std::string const& s) {
34  HttpSessionPtr hs = GetSession(s);
35  if (!hs) return "";
36  return hs->get_client_context();
37  }
38  static bool set_client_context(std::string const& s,
39  const std::string& ctx) {
40  HttpSessionPtr hs = GetSession(s);
41  if (!hs) return false;
42  hs->set_client_context(ctx);
43  return true;
44  }
45  static tbb::atomic<long> GetPendingTaskCount() {
46  return task_count_;
47  }
48 
49  void AcceptSession();
51 
52  protected:
53  virtual void OnRead(Buffer buffer);
54 
55  private:
56  class RequestBuilder;
58  typedef boost::intrusive_ptr<HttpSession> HttpSessionPtr;
59  typedef std::map<std::string, HttpSessionPtr> map_type;
60 
61  void OnSessionEvent(TcpSession *session,
62  enum TcpSession::Event event);
63 
64  static map_type* GetMap() {
65  if (!context_map_) {
66  context_map_ = new map_type();
67  }
68  return context_map_;
69  }
70  static HttpSessionPtr GetSession(std::string const& s) {
71  tbb::mutex::scoped_lock lock(map_mutex_);
72  map_type::iterator it = GetMap()->find(s);
73  if (it == GetMap()->end()) {
74  return 0;
75  }
76  return it->second;
77  }
78  const std::string get_client_context() { return client_context_str_; }
79  void set_client_context(const std::string& client_ctx)
80  { client_context_str_ = client_ctx; }
81  boost::scoped_ptr<RequestBuilder> request_builder_;
82  tbb::concurrent_queue<HttpRequest *> request_queue_;
83  tbb::atomic<bool> req_queue_empty_;
84  std::string context_str_;
85  std::string client_context_str_;
87 
90  static tbb::mutex map_mutex_;
91  static tbb::atomic<long> task_count_;
92 
94 };
95 
96 #endif /* __HTTP_SESSION_H__ */
static int req_handler_task_id_
Definition: http_session.h:88
boost::asio::const_buffer Buffer
Definition: tcp_session.h:64
tbb::atomic< bool > req_queue_empty_
Definition: http_session.h:83
SessionEventCb event_cb_
Definition: http_session.h:86
static map_type * GetMap()
Definition: http_session.h:64
static tbb::atomic< long > GetPendingTaskCount()
Definition: http_session.h:45
static tbb::mutex map_mutex_
Definition: http_session.h:90
boost::intrusive_ptr< HttpSession > HttpSessionPtr
Definition: http_session.h:57
std::map< std::string, HttpSessionPtr > map_type
Definition: http_session.h:59
boost::function< void(HttpSession *session, enum TcpSession::Event event)> SessionEventCb
Definition: http_session.h:21
boost::asio::ssl::stream< boost::asio::ip::tcp::socket > SslSocket
Definition: ssl_session.h:18
static std::string get_client_context(std::string const &s)
Definition: http_session.h:33
std::string context_str_
Definition: http_session.h:84
virtual ~HttpSession()
const std::string get_client_context()
Definition: http_session.h:78
virtual void OnRead(Buffer buffer)
void AcceptSession()
HttpSession(HttpServer *server, SslSocket *sock, bool async_ready=true)
static map_type * context_map_
Definition: http_session.h:89
void OnSessionEvent(TcpSession *session, enum TcpSession::Event event)
const std::string get_context()
Definition: http_session.h:25
boost::scoped_ptr< RequestBuilder > request_builder_
Definition: http_session.h:81
static bool set_client_context(std::string const &s, const std::string &ctx)
Definition: http_session.h:38
static tbb::atomic< long > task_count_
Definition: http_session.h:91
std::string client_context_str_
Definition: http_session.h:85
static bool SendSession(std::string const &s, const uint8_t *data, size_t size, size_t *sent)
Definition: http_session.h:27
void set_client_context(const std::string &client_ctx)
Definition: http_session.h:79
DISALLOW_COPY_AND_ASSIGN(HttpSession)
TcpServer * server()
Definition: tcp_session.h:88
tbb::concurrent_queue< HttpRequest * > request_queue_
Definition: http_session.h:82
static HttpSessionPtr GetSession(std::string const &s)
Definition: http_session.h:70
void RegisterEventCb(SessionEventCb cb)