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