MCPcopy Create free account
hub / github.com/3rdparty/libprocess / DataDecoder

Class DataDecoder

src/decoder.hpp:56–297  ·  view source on GitHub ↗

TODO(benh): Make DataDecoder abstract and make RequestDecoder a concrete subclass.

Source from the content-addressed store, hash-verified

54// TODO(benh): Make DataDecoder abstract and make RequestDecoder a
55// concrete subclass.
56class DataDecoder
57{
58public:
59 DataDecoder()
60 : failure(false), request(nullptr)
61 {
62 http_parser_settings_init(&settings);
63
64 settings.on_message_begin = &DataDecoder::on_message_begin;
65 settings.on_url = &DataDecoder::on_url;
66 settings.on_header_field = &DataDecoder::on_header_field;
67 settings.on_header_value = &DataDecoder::on_header_value;
68 settings.on_headers_complete = &DataDecoder::on_headers_complete;
69 settings.on_body = &DataDecoder::on_body;
70 settings.on_message_complete = &DataDecoder::on_message_complete;
71 settings.on_chunk_complete = &DataDecoder::on_chunk_complete;
72 settings.on_chunk_header = &DataDecoder::on_chunk_header;
73
74 http_parser_init(&parser, HTTP_REQUEST);
75
76 parser.data = this;
77 }
78
79 ~DataDecoder()
80 {
81 delete request;
82
83 foreach (http::Request* request, requests) {
84 delete request;
85 }
86 }
87
88 std::deque<http::Request*> decode(const char* data, size_t length)
89 {
90 size_t parsed = http_parser_execute(&parser, &settings, data, length);
91
92 if (parsed != length) {
93 // TODO(bmahler): joyent/http-parser exposes error reasons.
94 failure = true;
95 }
96
97 if (!requests.empty()) {
98 std::deque<http::Request*> result = requests;
99 requests.clear();
100 return result;
101 }
102
103 return std::deque<http::Request*>();
104 }
105
106 bool failed() const
107 {
108 return failure;
109 }
110
111private:
112 static int on_message_begin(http_parser* p)
113 {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected