forked from pt209223/librs
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathHttp.h
More file actions
126 lines (101 loc) · 4.52 KB
/
Http.h
File metadata and controls
126 lines (101 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#ifndef __HTTP_H__
#define __HTTP_H__
#ifndef _FILE_OFFSET_BITS
#define _FILE_OFFSET_BITS 64
#elif _FILE_OFFSET_BITS != 64
#error _FILE_OFFSET_BITS != 64
#endif
#include <cstdlib>
#include <cstring>
#include <map>
#include <curl/curl.h>
#include <httpd/httpd.h>
#include "Exception.h"
// @brief: blad wychwycony na poziomie http.
class HttpError : public Exception {
public:
HttpError(int code) throw() : code(code) { }
~HttpError(void) throw() { }
const char *what(void) const throw();
const int code; // kod odpowiedzi http
};
// @brief: blad wychwycony na poziomie CURLa
class CurlError : public Exception {
public:
CurlError(CURLcode code) throw() : code(code) { }
~CurlError(void) throw() { }
const char *what(void) const throw();
const CURLcode code; // kod bledu curla
};
// @brief: Nie mozna sie polaczyc
DEF_EXC(ECouldntConnect, Exception);
// @brief: Nie mozna dostac nazwy ip hosta
DEF_EXC(ECouldntResolveHost, Exception);
// @brief: Nie mozna zapisac odebranych danych
DEF_EXC(ECouldntWrite, Exception);
// @brief: Przekroczony timeout na operacje
DEF_EXC(EOperationTimeout, Exception);
class Http {
public:
Http(void) throw();
~Http(void) throw();
// @brief: callback, mozna na bierzaco monitorowac proces pobierania strony/pliku itd
// zwracajac false - anulujemy zadanie sciagania.
typedef bool (*callback_t)(const char *buf, size_t len, void *arg);
// @brief: mapa pol naglowka http (pola set-cookie sa sklejane)
typedef std::map<std::string, std::string> Headers;
// @brief: pobranie strony do pamieci, pod wskaznik 'page'
// @return: zwraca kod http (patrz: <httpd/httpd.h>)
int get(char *&page, size_t &len, const char *url,
const char *post = NULL, const char *cookies = NULL,
callback_t fn = NULL, void *arg = NULL) throw(Exception);
// @brief: pobranie strony na dysk, pod sciezke 'path'
// @return: zwraca kod http (patrz: <httpd/httpd.h>)
int get(const char *path, off_t &len, const char *url,
const char *post = NULL, const char *cookies = NULL,
callback_t fn = NULL, void *arg = NULL) throw(Exception);
// @brief: pobranie czystego naglowka http
const char *get_recv_header(void) const { return header_; }
// @brief: pobranie mapy otrzymanych naglowkow
const Headers &get_headers(void) const { return headers_map_; }
// @brief: pobranie wskazanego pola 'key' z naglowka
const char *get_recv_header(const char *key) const;
// @brief: pobranie pola 'location' z naglowka
const char *get_recv_redirect(void) const;
// @brief: pobranie pola 'set-cookie' z naglowka
// zapamietuje tylko do pierwszego ';' w polu - reszta pomijana,
// jesli w naglowku jest wiele pol, to sa sklejane w jeden.
// XXX: moze da sie to zrobic tak aby jednak pamietac wszystko?
const char *get_recv_cookies(void) const;
// @brief: domyslny timeout na operacje odczytu/zapisu
static const int default_rdwr_timeout_in_msec = -1;
// @brief: domyslny timeout na operacje polaczenia
static const int default_conn_timeout_in_msec = 10000;
// @brief: zmiana timeoutu na operacje odczytu/zapisu
void set_conn_timeout(int t) { conn_tout_ = t; }
// @brief: zmiana timeoutu na operacje polaczenia
void set_rdwr_timeout(int t) { rdwr_tout_ = t; }
// @brief: pobranie aktualnego timeoutu na operacje odczytu/zapisu
int get_conn_timeout(void) const { return conn_tout_; }
// @brief: pobranie aktualnego timeoutu na operacje polaczenia
int get_rdwr_timeout(void) const { return rdwr_tout_; }
// @brief: ustaw wypisywanie sie curla, co sie dzieje
void set_verbose(bool yes_or_no) { verbose_ = yes_or_no; }
private:
Http(const Http &); // non-copyable
static const size_t header_def_len = 8192; // domyslny rozmiar naglowka http
static const size_t page_def_len = 8192; // domyslny rozmiar strony
CURL *curl; // dla CURLa
int conn_tout_, rdwr_tout_; // timeouty
char *header_; // bufor na naglowek http
size_t header_len_, header_max_; // rozmiar w/w buforu
Headers headers_map_; // mapa pol w naglowku
bool verbose_;
void clear(void); // zresetowanie zasobow, zresetowanie CURLa (this->curl)
int do_analyze(void); // analiza naglowka http.
// funkcje do odczytu danych z sieci (naglowek, strona, plik)
static size_t head_fn(void *buf, size_t size, size_t nmemb, void *arg);
static size_t page_fn(void *buf, size_t size, size_t nmemb, void *arg);
static size_t file_fn(void *buf, size_t size, size_t nmemb, void *arg);
};
#endif