src/HTTPHandler.h
branchv_0
changeset 3 9c710397ced6
parent 2 dccedac46e7e
child 4 602462d04c57
equal deleted inserted replaced
2:dccedac46e7e 3:9c710397ced6
    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 	}