You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
#include "http.h"
|
|
#include "esp_err.h"
|
|
#include "esp_log.h"
|
|
|
|
#include "lwip/err.h"
|
|
#include "lwip/sockets.h"
|
|
#include "lwip/sys.h"
|
|
#include "lwip/netdb.h"
|
|
#include "lwip/dns.h"
|
|
|
|
static const char *TAG = "http";
|
|
|
|
static const char *REQUEST = "GET " WEB_PATH " HTTP/1.0\r\n"
|
|
"Host: "WEB_SERVER":"WEB_PORT"\r\n"
|
|
"User-Agent: esp-idf/1.0 esp32\r\n"
|
|
"\r\n";
|
|
|
|
esp_err_t http_request(char* buf)
|
|
{
|
|
const struct addrinfo hints = {
|
|
.ai_family = AF_INET,
|
|
.ai_socktype = SOCK_STREAM,
|
|
};
|
|
struct addrinfo *res;
|
|
struct in_addr *addr;
|
|
int s, r;
|
|
|
|
int err = getaddrinfo(WEB_SERVER, WEB_PORT, &hints, &res);
|
|
|
|
if(err != 0 || res == NULL) {
|
|
ESP_LOGE(TAG, "DNS lookup failed err=%d res=%p", err, res);
|
|
return ESP_ERR_NOT_FOUND;
|
|
}
|
|
|
|
/* Code to print the resolved IP.
|
|
* Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
|
|
addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
|
|
ESP_LOGI(TAG, "DNS lookup succeeded. IP=%s", inet_ntoa(*addr));
|
|
|
|
s = socket(res->ai_family, res->ai_socktype, 0);
|
|
if(s < 0) {
|
|
ESP_LOGE(TAG, "... Failed to allocate socket.");
|
|
freeaddrinfo(res);
|
|
return -1;
|
|
}
|
|
ESP_LOGI(TAG, "... allocated socket");
|
|
|
|
if(connect(s, res->ai_addr, res->ai_addrlen) != 0) {
|
|
ESP_LOGE(TAG, "... socket connect failed errno=%d", errno);
|
|
close(s);
|
|
freeaddrinfo(res);
|
|
return -1;
|
|
}
|
|
|
|
ESP_LOGI(TAG, "... connected");
|
|
freeaddrinfo(res);
|
|
|
|
if (write(s, REQUEST, strlen(REQUEST)) < 0) {
|
|
ESP_LOGE(TAG, "... socket send failed");
|
|
close(s);
|
|
return -1;
|
|
}
|
|
ESP_LOGI(TAG, "... socket send success");
|
|
|
|
struct timeval receiving_timeout;
|
|
receiving_timeout.tv_sec = 5;
|
|
receiving_timeout.tv_usec = 0;
|
|
if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &receiving_timeout,
|
|
sizeof(receiving_timeout)) < 0) {
|
|
ESP_LOGE(TAG, "... failed to set socket receiving timeout");
|
|
close(s);
|
|
return -1;
|
|
}
|
|
ESP_LOGI(TAG, "... set socket receiving timeout success");
|
|
|
|
/* Read HTTP response */
|
|
r = read(s, buf, RCV_BUFSIZE);
|
|
if(r >= RCV_BUFSIZE)
|
|
return -1;
|
|
return 0;
|
|
}
|