libtasks Documentation  1.6
http_base.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2014 ADTECH GmbH
3  * Licensed under MIT (https://github.com/adtechlabs/libtasks/blob/master/COPYING)
4  *
5  * Author: Andreas Pohl
6  */
7 
8 #ifndef _HTTP_BASE_H_
9 #define _HTTP_BASE_H_
10 
11 #include <unordered_map>
12 #include <iostream>
13 #include <istream>
14 #include <ostream>
15 #include <cstring>
16 #include <cstdlib>
17 #include <boost/algorithm/string/predicate.hpp>
18 
19 #include <tasks/tasks_exception.h>
20 #include <tasks/net/socket.h>
21 #include <tasks/net/io_state.h>
22 #include <tasks/tools/buffer.h>
23 
24 #define CRLF "\r\n"
25 #define CRLF_SIZE 2
26 
27 namespace tasks {
28 namespace net {
29 
30 class http_base {
31  public:
32  static const std::string NO_VAL;
33 
35 
36  virtual ~http_base() {}
37 
38  inline void set_state(io_state state) { m_state = state; }
39 
40  inline io_state state() const { return m_state; }
41 
46  inline void set_header(std::string header, std::string value) {
47  m_headers[header] = value;
48  if (boost::iequals(header, "Content-Length")) {
49  m_content_length = std::atoi(value.c_str());
50  }
51  }
52 
55  inline const std::string& header(std::string name) const {
56  auto h = m_headers.find(name);
57  if (m_headers.end() != h) {
58  return h->second;
59  }
60  return NO_VAL;
61  }
62 
64  inline std::size_t content_length() const { return m_content_length; }
65 
67  inline const char* content_p() const {
68  if (m_content_length) {
69  return m_content_buffer.ptr_read();
70  }
71  return nullptr;
72  }
73 
77  inline std::size_t write(std::string s) { return m_content_buffer.write(s.c_str(), s.length()); }
78 
82  inline std::size_t write(const std::string& s) { return m_content_buffer.write(s.c_str(), s.length()); }
83 
88  inline std::size_t write(const char* data, std::size_t size) { return m_content_buffer.write(data, size); }
89 
94  inline std::size_t read(char* data, std::size_t size) { return m_content_buffer.read(data, size); }
95 
97  inline std::istream& content_istream() { return m_content_istream; }
98 
100  inline std::ostream& content_ostream() { return m_content_ostream; }
101 
103  virtual void prepare_data_buffer() = 0;
104 
106  void write_data(socket& sock);
107 
108  inline void print() const {
109  for (auto& kv : m_headers) {
110  std::cout << kv.first << ": " << kv.second << std::endl;
111  }
112  std::cout << content_p();
113  }
114 
116  inline bool done() const { return m_state == io_state::DONE; }
117 
119  virtual void clear() {
122  m_content_length = 0;
123  if (m_headers.size() > 0) {
124  m_headers.clear();
125  }
127  }
128 
129  protected:
133  std::unordered_map<std::string, std::string> m_headers;
134  std::size_t m_content_length = 0;
135  std::istream m_content_istream;
136  std::ostream m_content_ostream;
137 
138  void write_headers(socket& sock);
139  void write_content(socket& sock);
140 };
141 
142 } // net
143 } // tasks
144 
145 #endif // _HTTP_BASE_H_
void write_content(socket &sock)
Definition: http_base.cpp:53
tasks::tools::buffer m_data_buffer
Definition: http_base.h:130
std::size_t write(const char *data, std::size_t size)
Definition: http_base.h:88
void write_data(socket &sock)
Write a HTTP object to a socket.
Definition: http_base.cpp:19
char * ptr_read()
Definition: buffer.h:32
virtual void prepare_data_buffer()=0
Prepare a HTTP request/response to be sent.
std::size_t m_content_length
Definition: http_base.h:134
void write_headers(socket &sock)
Definition: http_base.cpp:45
void set_state(io_state state)
Definition: http_base.h:38
std::ostream m_content_ostream
Definition: http_base.h:136
std::size_t read(char *data, std::size_t size)
Definition: http_base.h:94
std::size_t write(std::string s)
Definition: http_base.h:77
The socket class.
Definition: socket.h:35
const char * content_p() const
Definition: http_base.h:67
virtual ~http_base()
Definition: http_base.h:36
std::streamsize read(char_type *data, std::streamsize size)
Definition: buffer.h:93
io_state state() const
Definition: http_base.h:40
void set_header(std::string header, std::string value)
Definition: http_base.h:46
virtual void clear()
Reset the http object.
Definition: http_base.h:119
std::istream & content_istream()
Definition: http_base.h:97
std::unordered_map< std::string, std::string > m_headers
Definition: http_base.h:133
tasks::tools::buffer m_content_buffer
Definition: http_base.h:131
std::streamsize write(const char_type *data, std::streamsize size)
Definition: buffer.h:91
std::istream m_content_istream
Definition: http_base.h:135
std::size_t content_length() const
Definition: http_base.h:64
std::size_t write(const std::string &s)
Definition: http_base.h:82
const std::string & header(std::string name) const
Definition: http_base.h:55
static const std::string NO_VAL
Definition: http_base.h:32
std::ostream & content_ostream()
Definition: http_base.h:100
void print() const
Definition: http_base.h:108
bool done() const
Definition: http_base.h:116