OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
http_client.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef __HTTP_CLIENT_H__
6 #define __HTTP_CLIENT_H__
7 
8 #include <boost/asio/ip/tcp.hpp>
9 #include <boost/function.hpp>
10 #include <boost/ptr_container/ptr_map.hpp>
11 #include <boost/system/error_code.hpp>
12 #include <string>
13 #include <curl/curl.h>
14 #include "base/queue_task.h"
15 #include "base/timer.h"
16 #include "io/tcp_server.h"
17 #include "io/tcp_session.h"
18 #include "http_parser/http_parser.h"
19 
20 class LifetimeActor;
21 class LifetimeManager;
22 class HttpClient;
23 class HttpConnection;
24 struct _ConnInfo;
25 struct _GlobalInfo;
26 
27 enum Event {
33 };
34 
35 typedef boost::function<void()> EnqueuedCb;
36 class HttpClientSession : public TcpSession {
37 public:
38  typedef boost::function<void(HttpClientSession *session,
40  typedef boost::intrusive_ptr<TcpSession> TcpSessionPtr;
41 
43  virtual ~HttpClientSession() { assert(delete_called_ != 0xdeadbeaf); delete_called_ = 0xdeadbeaf; }
44  virtual void OnRead(Buffer buffer);
46 
47  void SetConnection(HttpConnection *conn) { connection_ = conn; }
49  tbb::mutex &mutex() { return mutex_; }
50 
51 private:
52  void OnEvent(TcpSession *session, Event event);
53  void OnEventInternal(TcpSessionPtr session, Event event);
55  uint32_t delete_called_;
56  tbb::mutex mutex_;
58 
60 };
61 
63 public:
64  HttpConnection(boost::asio::ip::tcp::endpoint, size_t id, HttpClient *client);
65  HttpConnection(const std::string& host, int port, size_t id, HttpClient *client);
67 
68  int Initialize();
69 
70  typedef boost::function<void(std::string &, boost::system::error_code &)> HttpCb;
71 
72  int HttpPut(const std::string &put_string, const std::string &path, HttpCb);
73  int HttpPut(const std::string &put_string, const std::string &path,
74  bool header, bool short_timeout, bool reuse,
75  std::vector<std::string> &hdr_options, HttpCb cb);
76  int HttpPost(const std::string &post_string, const std::string &path,
77  HttpCb);
78  int HttpPost(const std::string &post_string, const std::string &path,
79  bool header, bool short_timeout, bool reuse,
80  std::vector<std::string> &hdr_options, HttpCb cb);
81  int HttpGet(const std::string &path, HttpCb);
82  int HttpGet(const std::string &path, bool header, bool short_timeout,
83  bool reuse, std::vector<std::string> &hdr_options, HttpCb cb);
84  int HttpHead(const std::string &path, bool header, bool short_timeout,
85  bool reuse, std::vector<std::string> &hdr_options, HttpCb cb);
86  int HttpDelete(const std::string &path, HttpCb);
87  int HttpDelete(const std::string &path, bool header, bool short_timeout,
88  bool reuse, std::vector<std::string> &hdr_options,
89  HttpCb cb);
90  int Status() { return status_; }
91  std::string Version() { return version_; }
92  std::string Reason() { return reason_; }
93  std::map<std::string, std::string> *Headers() { return &headers_; }
94  void ClearCallback();
95 
96  struct _ConnInfo *curl_handle() { return curl_handle_; }
97  std::map<CURLoption, int> *curl_options() { return &curl_options_; }
98  HttpClient *client() { return client_; }
100  tbb::mutex &mutex() { return mutex_; }
101  boost::asio::ip::tcp::endpoint endpoint() { return endpoint_; }
102  size_t id() { return id_; }
103 
104  const std::string &GetData();
105  void set_curl_handle(struct _ConnInfo *handle) { curl_handle_ = handle; }
108  void delete_session();
109  void AssignData(const char *ptr, size_t size);
110  void AssignHeader(const char *ptr, size_t size);
111  void UpdateOffset(size_t bytes);
112  size_t GetOffset();
113  HttpCb HttpClientCb() { return cb_; }
115  void set_use_ssl(bool ssl_flag) { use_ssl_ = ssl_flag; }
116  bool use_ssl() { return use_ssl_; }
117  void set_client_cert(const std::string &client_cert) {
118  client_cert_.assign(client_cert);
119  }
120  void set_client_cert_type(const std::string &client_cert_type) {
121  client_cert_type_.assign(client_cert_type);
122  }
123  void set_client_key(const std::string &client_key) {
124  client_key_.assign(client_key);
125  }
126  void set_ca_cert(const std::string &ca_cert) {
127  ca_cert_.assign(ca_cert);
128  }
129 
130 private:
131  std::string make_url(std::string &path);
132 
133  unsigned short bool2bf(bool header, bool short_timeout, bool reuse) {
134  return (header ? 1 << 2 : 0) | (short_timeout ? 1 << 1 : 0) |
135  (reuse ? 1 : 0);
136  }
137  void bf2bool(unsigned short bf, bool &header, bool &short_timeout,
138  bool &reuse) {
139  header = (bf & 4u) != 0;
140  short_timeout = (bf & 2u) != 0;
141  reuse = (bf & 1u) != 0;
142  }
143  void HttpProcessInternal(const std::string body, std::string path,
144  //bool header, bool short_timeout, bool reuse,
145  unsigned short header_shortTimeout_reuse,
146  std::vector<std::string> hdr_options,
147  HttpCb cb, http_method m);
148 
149  // key = endpoint_ + id_
150  const std::string host_;
151  boost::asio::ip::tcp::endpoint endpoint_;
152  size_t id_;
154  size_t offset_;
155  std::string buf_;
157  std::map<CURLoption, int> curl_options_;
160  mutable tbb::mutex mutex_;
162  int status_;
163  std::string version_;
164  std::string reason_;
165  std::map<std::string, std::string> headers_;
166  bool sent_hdr_; // backward compatibility
167  bool use_ssl_; // ssl flag
168  std::string client_cert_; // client certificate path
169  std::string client_cert_type_; // certificate type
170  std::string client_key_; // client key path
171  std::string ca_cert_; // ca certificate path
173  STATUS = 142,
175  } state_;
176 
178 };
179 
180 // Http Client class
181 class HttpClient : public TcpServer {
182 public:
183  static const uint32_t kDefaultTimeout = 1; // one millisec
184 
185  explicit HttpClient(EventManager *evm, std::string task_name=std::string(
186  "http client"));
187  virtual ~HttpClient();
188 
189  void Init();
190  void Shutdown();
191  void SessionShutdown();
192 
193  virtual TcpSession *CreateSession();
194  HttpConnection *CreateConnection(boost::asio::ip::tcp::endpoint);
195  HttpConnection *CreateConnection(const std::string& host, int port);
196 
199 
200 
201  void ProcessEvent(EnqueuedCb cb);
202  struct _GlobalInfo *GlobalInfo() { return gi_; }
203  boost::asio::io_context *io_service();
204 
205  void StartTimer(long);
206  void CancelTimer();
207 
208  bool IsErrorHard(const boost::system::error_code &ec);
209 
210 protected:
211  virtual TcpSession *AllocSession(Socket *socket);
212 
213 private:
214  void TimerErrorHandler(std::string name, std::string error);
216  bool DequeueEvent(EnqueuedCb);
217  void ShutdownInternal();
218 
219  typedef boost::asio::ip::tcp::endpoint endpoint;
220  typedef std::pair<endpoint, size_t> Key;
221  typedef boost::ptr_map<Key, HttpConnection> HttpConnectionMap;
222 
223  bool TimerCb();
224  struct _GlobalInfo *gi_;
227  size_t id_;
228 
230 
232 };
233 
234 #endif
void UpdateOffset(size_t bytes)
Definition: http_client.cc:365
void ShutdownInternal()
Definition: http_client.cc:383
void SessionShutdown()
Definition: http_client.cc:426
tbb::mutex & mutex()
Definition: http_client.h:49
HttpCb HttpClientCb()
Definition: http_client.h:113
void Init()
Definition: http_client.cc:422
boost::asio::ip::tcp::endpoint endpoint_
Definition: http_client.h:151
enum HttpConnection::HTTPHeaderDataState state_
tbb::mutex & mutex()
Definition: http_client.h:100
boost::asio::const_buffer Buffer
Definition: tcp_session.h:64
std::string ca_cert_
Definition: http_client.h:171
std::string version_
Definition: http_client.h:163
void ClearCallback()
Definition: http_client.cc:211
std::string Version()
Definition: http_client.h:91
DISALLOW_COPY_AND_ASSIGN(HttpClient)
boost::asio::ip::tcp::socket Socket
Definition: tcp_server.h:31
const std::string & GetData()
Definition: http_client.cc:361
int HttpGet(const std::string &path, HttpCb)
Definition: http_client.cc:135
size_t id_
Definition: http_client.h:227
DISALLOW_COPY_AND_ASSIGN(HttpClientSession)
void StartTimer(long)
Definition: http_client.cc:492
HttpClient * client_
Definition: http_client.h:159
HttpConnection * CreateConnection(boost::asio::ip::tcp::endpoint)
Definition: http_client.cc:454
struct _GlobalInfo * gi_
Definition: http_client.h:224
boost::function< void()> EnqueuedCb
Definition: http_client.h:35
DISALLOW_COPY_AND_ASSIGN(HttpConnection)
struct _GlobalInfo * GlobalInfo()
Definition: http_client.h:202
HttpClient(EventManager *evm, std::string task_name=std::string("http client"))
Definition: http_client.cc:373
void ProcessEvent(EnqueuedCb cb)
Definition: http_client.cc:479
virtual ~HttpClient()
Definition: http_client.cc:418
std::pair< endpoint, size_t > Key
Definition: http_client.h:220
HttpConnection(boost::asio::ip::tcp::endpoint, size_t id, HttpClient *client)
Definition: http_client.cc:72
boost::intrusive_ptr< HttpClientSession > TcpSessionPtr
Definition: http_curl.cc:105
HttpClientSession * session()
Definition: http_client.h:99
void RemoveConnectionInternal(HttpConnection *)
Definition: http_client.cc:505
struct _ConnInfo * curl_handle_
Definition: http_client.h:156
std::string make_url(std::string &path)
Definition: http_client.cc:92
int HttpPost(const std::string &post_string, const std::string &path, HttpCb)
Definition: http_client.cc:180
HttpClientSession * CreateSession()
Definition: http_client.cc:108
virtual TcpSession * AllocSession(Socket *socket)
Definition: http_client.cc:434
boost::function< void(std::string &, boost::system::error_code &)> HttpCb
Definition: http_client.h:70
virtual TcpSession * CreateSession()
Definition: http_client.cc:439
bool DequeueEvent(EnqueuedCb)
Definition: http_client.cc:513
std::string reason_
Definition: http_client.h:164
boost::asio::ip::tcp::endpoint endpoint()
Definition: http_client.h:101
const std::string host_
Definition: http_client.h:150
boost::asio::ip::tcp::socket Socket
Definition: tcp_session.h:60
SessionEventCb event_cb_
Definition: http_client.h:57
std::map< CURLoption, int > curl_options_
Definition: http_client.h:157
bool TimerCb()
Definition: http_client.cc:488
int HttpDelete(const std::string &path, HttpCb)
Definition: http_client.cc:196
std::map< std::string, std::string > headers_
Definition: http_client.h:165
void CancelTimer()
Definition: http_client.cc:497
void set_use_ssl(bool ssl_flag)
Definition: http_client.h:115
unsigned short bool2bf(bool header, bool short_timeout, bool reuse)
Definition: http_client.h:133
void RegisterEventCb(SessionEventCb cb)
Definition: http_client.cc:61
void set_ca_cert(const std::string &ca_cert)
Definition: http_client.h:126
HttpConnection * connection_
Definition: http_client.h:54
std::map< CURLoption, int > * curl_options()
Definition: http_client.h:97
std::string client_cert_type_
Definition: http_client.h:169
Event
Definition: http_client.h:27
HttpClientSession * session_
Definition: http_client.h:158
HttpClientSession(HttpClient *client, Socket *socket)
Definition: http_client.cc:17
void TimerErrorHandler(std::string name, std::string error)
Definition: http_client.cc:485
HttpConnection * Connection()
Definition: http_client.h:48
boost::asio::ip::tcp::endpoint endpoint
Definition: http_client.h:219
static const uint32_t kDefaultTimeout
Definition: http_client.h:183
void RemoveConnection(HttpConnection *)
Definition: http_client.cc:473
void OnEventInternal(TcpSessionPtr session, Event event)
Definition: http_client.cc:34
void set_client_cert(const std::string &client_cert)
Definition: http_client.h:117
virtual void OnRead(Buffer buffer)
Definition: http_client.cc:22
void AssignData(const char *ptr, size_t size)
Definition: http_client.cc:306
WorkQueue< EnqueuedCb > work_queue_
Definition: http_client.h:229
boost::intrusive_ptr< TcpSession > TcpSessionPtr
Definition: http_client.h:40
virtual ~HttpClientSession()
Definition: http_client.h:43
struct _ConnInfo * curl_handle()
Definition: http_client.h:96
void set_client_key(const std::string &client_key)
Definition: http_client.h:123
tbb::mutex mutex_
Definition: http_client.h:160
void set_client_cert_type(const std::string &client_cert_type)
Definition: http_client.h:120
std::string client_key_
Definition: http_client.h:170
HttpClientSession::SessionEventCb event_cb_
Definition: http_client.h:161
int HttpHead(const std::string &path, bool header, bool short_timeout, bool reuse, std::vector< std::string > &hdr_options, HttpCb cb)
Definition: http_client.cc:152
bool AddConnection(HttpConnection *)
Definition: http_client.cc:464
bool IsErrorHard(const boost::system::error_code &ec)
Definition: http_client.cc:501
void HttpProcessInternal(const std::string body, std::string path, unsigned short header_shortTimeout_reuse, std::vector< std::string > hdr_options, HttpCb cb, http_method m)
Definition: http_client.cc:215
boost::ptr_map< Key, HttpConnection > HttpConnectionMap
Definition: http_client.h:221
void OnEvent(TcpSession *session, Event event)
Definition: http_client.cc:26
HttpClient * client()
Definition: http_client.h:98
boost::asio::io_context * io_service()
Definition: http_client.cc:430
void SetConnection(HttpConnection *conn)
Definition: http_client.h:47
int HttpPut(const std::string &put_string, const std::string &path, HttpCb)
Definition: http_client.cc:162
uint32_t delete_called_
Definition: http_client.h:55
void set_curl_handle(struct _ConnInfo *handle)
Definition: http_client.h:105
Timer * curl_timer_
Definition: http_client.h:225
boost::function< void(HttpClientSession *session, TcpSession::Event event)> SessionEventCb
Definition: http_client.h:39
void Shutdown()
Definition: http_client.cc:406
std::map< std::string, std::string > * Headers()
Definition: http_client.h:93
size_t GetOffset()
Definition: http_client.cc:369
tbb::mutex mutex_
Definition: http_client.h:56
HttpConnectionMap map_
Definition: http_client.h:226
Definition: timer.h:54
void set_session(HttpClientSession *session)
Definition: http_client.cc:129
std::string buf_
Definition: http_client.h:155
std::string Reason()
Definition: http_client.h:92
virtual Socket * socket() const
Definition: tcp_session.h:86
void bf2bool(unsigned short bf, bool &header, bool &short_timeout, bool &reuse)
Definition: http_client.h:137
std::string client_cert_
Definition: http_client.h:168
void delete_session()
Definition: http_client.cc:117
void AssignHeader(const char *ptr, size_t size)
Definition: http_client.cc:316
static EventManager evm
void RegisterEventCb(HttpClientSession::SessionEventCb cb)
Definition: http_client.h:114