50 std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata; |
50 std::vector<relpipe::writer::AttributeMetadata> currentWriterMetadata; |
51 size_t currentAttributeIndex = 0; |
51 size_t currentAttributeIndex = 0; |
52 size_t currentRecordNumber = 1; |
52 size_t currentRecordNumber = 1; |
53 |
53 |
54 void writeCallback(std::string value) { |
54 void writeCallback(std::string value) { |
55 relationalWriter->writeAttribute(L"got response: " + convertor.from_bytes(value)); |
55 // TODO: write this attribute even if this method was not called |
|
56 // TODO: support also binary data or other encodings, not only UTF-8 text |
|
57 relationalWriter->writeAttribute(convertor.from_bytes(value)); |
56 } |
58 } |
57 |
59 |
58 static uint writeCurlCallback(char* in, uint size, uint nmemb, HTTPHandler* instance) { |
60 static uint writeCurlCallback(char* buffer, size_t size, size_t nmemb, HTTPHandler* instance) { |
59 uint r = size * nmemb; |
61 size_t r = size * nmemb; |
60 instance->writeCallback(std::string(in, r)); |
62 instance->writeCallback(std::string(buffer, r)); |
61 return r; |
63 return r; |
62 } |
64 } |
63 |
65 |
64 public: |
66 public: |
65 |
67 |
70 } |
72 } |
71 |
73 |
72 void startRelation(relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) override { |
74 void startRelation(relpipe::common::type::StringX name, std::vector<relpipe::reader::handlers::AttributeMetadata> attributes) override { |
73 |
75 |
74 |
76 |
75 relationalWriter->startRelation(name + L"_curl",{ |
77 relationalWriter->startRelation(name + L"_curl_info",{ |
|
78 {L"name", relpipe::writer::TypeId::STRING}, |
76 {L"value", relpipe::writer::TypeId::STRING} |
79 {L"value", relpipe::writer::TypeId::STRING} |
77 }, true); |
80 }, true); |
78 |
81 |
79 relationalWriter->writeAttribute(L"curl version = " + convertor.from_bytes(curl_version())); |
82 relationalWriter->writeAttribute(L"curl version"); |
|
83 relationalWriter->writeAttribute(convertor.from_bytes(curl_version())); |
|
84 |
|
85 relationalWriter->startRelation(name + L"_curl_response",{ |
|
86 {L"url", relpipe::writer::TypeId::STRING}, |
|
87 {L"body", relpipe::writer::TypeId::STRING}, |
|
88 {L"response_code", relpipe::writer::TypeId::INTEGER} |
|
89 }, true); |
80 |
90 |
81 } |
91 } |
82 |
92 |
83 void attribute(const relpipe::common::type::StringX& value) override { |
93 void attribute(const relpipe::common::type::StringX& value) override { |
84 |
94 |
|
95 relationalWriter->writeAttribute(value); |
|
96 |
85 std::string url = convertor.to_bytes(value); |
97 std::string url = convertor.to_bytes(value); |
|
98 relpipe::common::type::Integer responseCode = 0; |
86 |
99 |
87 CURL* curl = curl_easy_init(); |
100 CURL* curl = curl_easy_init(); |
88 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |
101 curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); |
89 curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); |
102 curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); |
90 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCurlCallback); |
103 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCurlCallback); |
91 curl_easy_perform(curl); |
104 curl_easy_perform(curl); |
|
105 curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); |
92 curl_easy_cleanup(curl); |
106 curl_easy_cleanup(curl); |
|
107 |
|
108 relationalWriter->writeAttribute(&responseCode, typeid (responseCode)); |
93 } |
109 } |
94 |
110 |
95 void endOfPipe() { |
111 void endOfPipe() { |
96 |
112 |
97 } |
113 } |