3 #define HAVE_CPP_FUNC_PTR
4 namespace funcptr = std;
7 #include <boost/function.hpp>
8 namespace funcptr = boost;
9 #define HAVE_CPP_FUNC_PTR
23 #ifndef YAHTTP_MAX_REQUEST_SIZE
24 #define YAHTTP_MAX_REQUEST_SIZE 2097152
27 #ifndef YAHTTP_MAX_RESPONSE_SIZE
28 #define YAHTTP_MAX_RESPONSE_SIZE 2097152
31 #define YAHTTP_TYPE_REQUEST 1
32 #define YAHTTP_TYPE_RESPONSE 2
52 std::string::size_type i,cl;
53 for(i=0;i<doc->
body.length();i+=1024) {
54 cl = std::min(static_cast<std::string::size_type>(1024), doc->
body.length()-i);
55 os << std::hex << cl << std::dec <<
"\r\n";
56 os << doc->
body.substr(i, cl) <<
"\r\n";
58 os << 0 <<
"\r\n\r\n";
62 return doc->
body.length();
72 size_t operator()(
const HTTPBase *doc __attribute__((unused)), std::ostream& os,
bool chunked)
const {
76 std::ifstream ifs(
path, std::ifstream::binary);
78 std::ifstream ifs(
path.c_str(), std::ifstream::binary);
82 std::cerr <<
"Sending file " <<
path << std::endl;
83 while(ifs && ifs.good()) {
84 ifs.read(buf,
sizeof buf);
85 n += (k = ifs.gcount());
87 if (chunked) os << std::hex << k << std::dec <<
"\r\n";
89 if (chunked) os <<
"\r\n";
92 if (chunked) os << 0 <<
"\r\n\r\n";
106 #ifdef HAVE_CPP_FUNC_PTR
132 #ifdef HAVE_CPP_FUNC_PTR
144 #ifdef HAVE_CPP_FUNC_PTR
169 #ifdef HAVE_CPP_FUNC_PTR
170 funcptr::function<size_t(const HTTPBase*,std::ostream&,bool)>
renderer;
172 void write(std::ostream& os)
const;
180 case 9:
return "0.9";
181 case 10:
return "1.0";
182 case 11:
return "1.1";
188 std::ostringstream oss;
231 this->url.parse(url);
232 this->
headers[
"host"] = this->url.host;
234 std::transform(this->method.begin(), this->method.end(), this->method.begin(), ::toupper);
235 this->
headers[
"user-agent"] =
"YaHTTP v1.0";
239 std::ostringstream postbuf;
241 for(strstr_map_t::const_iterator i =
POST().begin(); i !=
POST().end(); i++) {
245 if (postbuf.str().length()>0)
246 body = postbuf.str().substr(0, postbuf.str().length()-1);
249 headers[
"content-type"] =
"application/x-www-form-urlencoded; charset=utf-8";
251 headers[
"content-type"] =
"multipart/form-data; boundary=YaHTTP-12ca543";
252 for(strstr_map_t::const_iterator i =
POST().begin(); i !=
POST().end(); i++) {
253 postbuf <<
"--YaHTTP-12ca543\r\nContent-Disposition: form-data; name=\"" <<
Utility::encodeURL(i->first,
false) <<
"; charset=UTF-8\r\n\r\n"
259 postbuf <<
body.length();
262 headers[
"content-length"] = postbuf.str();
285 void keyValuePair(
const std::string &keyvalue, std::string &key, std::string &value);
293 this->target->initialize();
295 int feed(
const std::string& somedata);
308 strstr_map_t::iterator
pos =
target->headers.find(
"content-type");
309 if (pos !=
target->headers.end() &&
Utility::iequals(pos->second,
"application/x-www-form-urlencoded", 32)) {
#define YAHTTP_MAX_REQUEST_SIZE
Definition: reqresp.hpp:24
std::string path
Definition: reqresp.hpp:94
URL url
Definition: reqresp.hpp:148
std::map< std::string, Cookie, ASCIICINullSafeComparator > cookies
Definition: cookie.hpp:49
void write(std::ostream &os) const
Definition: reqresp.cpp:167
Response(const HTTPBase &rhs)
Definition: reqresp.hpp:198
std::map< std::string, std::string, ASCIICINullSafeComparator > strstr_map_t
Definition: utility.hpp:22
Definition: reqresp.hpp:271
strstr_map_t headers
Definition: reqresp.hpp:156
std::string versionStr(int version) const
Definition: reqresp.hpp:178
SendBodyRender()
Definition: reqresp.hpp:48
int kind
Definition: reqresp.hpp:151
std::string str() const
Definition: reqresp.hpp:187
void initialize()
Definition: reqresp.hpp:206
Definition: exception.hpp:8
static std::string encodeURL(const std::string &component, bool asUrl=true)
Definition: utility.hpp:233
Definition: reqresp.hpp:66
Definition: reqresp.hpp:320
ssize_t max_response_size
Definition: reqresp.hpp:167
#define YAHTTP_MAX_RESPONSE_SIZE
Definition: reqresp.hpp:28
strstr_map_t postvars
Definition: reqresp.hpp:158
#define YAHTTP_TYPE_RESPONSE
Definition: reqresp.hpp:32
Definition: reqresp.hpp:324
friend std::istream & operator>>(std::istream &is, Response &resp)
Definition: reqresp.cpp:248
Definition: reqresp.hpp:195
Request()
Definition: reqresp.hpp:217
void clear()
Definition: cookie.hpp:56
SendFileRender(const std::string &path)
Definition: reqresp.hpp:68
T * target
Definition: reqresp.hpp:273
strstr_map_t parameters
Definition: reqresp.hpp:161
std::ostringstream bodybuf
Definition: reqresp.hpp:280
std::string body
Definition: reqresp.hpp:164
strcookie_map_t & COOKIES()
Definition: reqresp.hpp:176
strstr_map_t & GET()
Definition: reqresp.hpp:174
friend std::ostream & operator<<(std::ostream &os, const Request &resp)
Definition: reqresp.cpp:266
int state
Definition: reqresp.hpp:274
int feed(const std::string &somedata)
Definition: reqresp.cpp:5
Response()
Definition: reqresp.hpp:197
void initialize()
Definition: reqresp.hpp:226
Definition: cookie.hpp:47
bool ready()
Definition: reqresp.hpp:296
int status
Definition: reqresp.hpp:152
strstr_map_t & POST()
Definition: reqresp.hpp:175
void initialize(T *target)
Definition: reqresp.hpp:287
int chunk_size
Definition: reqresp.hpp:279
size_t minbody
Definition: reqresp.hpp:282
strstr_map_t getvars
Definition: reqresp.hpp:159
std::string statusText
Definition: reqresp.hpp:154
size_t operator()(const HTTPBase *doc __attribute__((unused)), std::ostream &os, bool chunked) const
Definition: reqresp.hpp:72
Definition: reqresp.hpp:43
Response & operator=(const HTTPBase &rhs)
Definition: reqresp.hpp:201
Definition: reqresp.hpp:215
postformat_t
Definition: reqresp.hpp:37
#define YAHTTP_TYPE_REQUEST
Definition: reqresp.hpp:31
std::map< std::string, Cookie, ASCIICINullSafeComparator > strcookie_map_t
Definition: reqresp.hpp:35
size_t maxbody
Definition: reqresp.hpp:281
HTTPBase(const HTTPBase &rhs)
Definition: reqresp.hpp:124
void finalize()
Definition: reqresp.hpp:305
void setup(const std::string &method, const std::string &url)
Definition: reqresp.hpp:230
void preparePost(postformat_t format=urlencoded)
Definition: reqresp.hpp:238
HTTPBase()
Definition: reqresp.hpp:99
friend std::istream & operator>>(std::istream &is, Request &resp)
Definition: reqresp.cpp:271
size_t operator()(const HTTPBase *doc, std::ostream &os, bool chunked) const
Definition: reqresp.hpp:50
Definition: reqresp.hpp:39
virtual void initialize()
Definition: reqresp.hpp:103
friend std::ostream & operator<<(std::ostream &os, const Response &resp)
Definition: reqresp.cpp:243
std::string buffer
Definition: reqresp.hpp:277
Definition: reqresp.hpp:38
void keyValuePair(const std::string &keyvalue, std::string &key, std::string &value)
funcptr::function< size_t(const HTTPBase *, std::ostream &, bool)> renderer
Definition: reqresp.hpp:170
HTTPBase & operator=(const HTTPBase &rhs)
Definition: reqresp.hpp:136
static strstr_map_t parseUrlParameters(std::string parameters)
Definition: utility.hpp:349
bool chunked
Definition: reqresp.hpp:278
bool hasBody
Definition: reqresp.hpp:283
Definition: reqresp.hpp:46
std::string method
Definition: reqresp.hpp:155
Request(const HTTPBase &rhs)
Definition: reqresp.hpp:218
CookieJar jar
Definition: reqresp.hpp:157
ssize_t max_request_size
Definition: reqresp.hpp:166
size_t pos
Definition: reqresp.hpp:275
static bool iequals(const std::string &a, const std::string &b, size_t length)
Definition: utility.hpp:388
std::string routeName
Definition: reqresp.hpp:162
int version
Definition: reqresp.hpp:153
Request & operator=(const HTTPBase &rhs)
Definition: reqresp.hpp:221