line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#pragma once |
2
|
|
|
|
|
|
|
#include "error.h" |
3
|
|
|
|
|
|
|
#include "MessageParser.h" |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
namespace panda { namespace protocol { namespace http { |
6
|
|
|
|
|
|
|
|
7
|
214
|
|
|
|
|
|
struct ResponseParser : MessageParser { |
8
|
340
|
|
|
|
|
|
struct Result { |
9
|
|
|
|
|
|
|
ResponseSP response; |
10
|
|
|
|
|
|
|
size_t position; |
11
|
|
|
|
|
|
|
State state; |
12
|
|
|
|
|
|
|
std::error_code error; |
13
|
|
|
|
|
|
|
}; |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
ResponseParser (); |
16
|
|
|
|
|
|
|
ResponseParser (ResponseParser&&) = default; |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
const RequestSP& context_request () const { return _context_request; } |
19
|
|
|
|
|
|
|
|
20
|
105
|
|
|
|
|
|
void set_context_request (const RequestSP& request) { |
21
|
105
|
50
|
|
|
|
|
if (_context_request) throw ParserError("can't set another context request until response is done"); |
22
|
105
|
|
|
|
|
|
_context_request = request; |
23
|
105
|
|
|
|
|
|
} |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
Result parse (const string& buffer); |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
Result parse_shift (string& s) { |
28
|
|
|
|
|
|
|
auto result = parse(s); |
29
|
|
|
|
|
|
|
s.offset(result.position); |
30
|
|
|
|
|
|
|
result.position = 0; |
31
|
|
|
|
|
|
|
return result; |
32
|
|
|
|
|
|
|
} |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
Result eof (); |
35
|
|
|
|
|
|
|
|
36
|
2
|
|
|
|
|
|
void reset () { _reset(false); } |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
private: |
39
|
|
|
|
|
|
|
RequestSP _context_request; |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
void ensure_response_created () { |
42
|
|
|
|
|
|
|
if (!response) { |
43
|
|
|
|
|
|
|
if (!_context_request) throw ParserError("Cannot create response as there are no corresponding request"); |
44
|
|
|
|
|
|
|
response = _context_request->new_response(); |
45
|
|
|
|
|
|
|
message = response; |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
} |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
void _reset (bool keep_context); |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
void parse_cookie (const string&); |
52
|
|
|
|
|
|
|
}; |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
}}} |