abfall/src/http_client.cpp
2023-06-14 15:01:33 +02:00

79 lines
1.8 KiB
C++

#include "http_client.h"
#include <memory>
std::unique_ptr<char[]> myBodyBuffer = nullptr;
uint16_t offset{0};
bool received{false};
void result_callback(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, u32_t srv_res,
err_t err) {
#ifdef DEBUG
printf("Transfer complete\n");
#endif
received = true;
offset = 0;
}
err_t headers_callback(httpc_state_t *connection, void *arg, struct pbuf *hdr, u16_t hdr_len,
u32_t content_len) {
#ifdef DEBUG
printf("Headers received\n");
printf("Content length=%lu\n", content_len);
printf("Header length=%u\n", hdr_len);
#endif
myBodyBuffer = std::make_unique<char[]>(content_len + 1);
return ERR_OK;
}
err_t body_callback(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err) {
if (err != ERR_OK) {
return err;
}
pbuf_copy_partial(p, &myBodyBuffer[offset], p->tot_len, 0);
offset += p->len;
return ERR_OK;
}
HttpClient::HttpClient() {
m_settings.use_proxy = false;
m_settings.result_fn = result_callback; // result_callback;
m_settings.headers_done_fn = headers_callback; // headers_callback;
}
std::string HttpClient::retrieveWasteDatesAsCsv() {
uint16_t port = 80;
std::string result("");
err_t err = httpc_get_file_dns("hornet.brodbeck-online.de", port, "/abfall/abfall.csv",
&m_settings, body_callback, nullptr, nullptr);
// If there was an error, return empty result.
if (err != ERR_OK) {
return result;
}
uint wait_count = 0;
while (received == false) {
++wait_count;
if (wait_count >= 10) {
return result;
}
sleep_ms(1000);
}
result.append(myBodyBuffer.get());
received = false;
#ifdef DEBUG
printf("%s", result.c_str());
#endif
return result;
}