1
#include "http_client.h"
2
#include "debug_print.h"
4
int http_connect(gchar *hostname)
6
struct sockaddr_in dest_host;
7
struct hostent *host_address;
10
if ((host_address = gethostbyname(hostname)) == NULL)
13
if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
16
dest_host.sin_family = AF_INET;
17
dest_host.sin_addr = *((struct in_addr *)host_address->h_addr);
18
dest_host.sin_port = htons(80);
19
memset(&(dest_host.sin_zero), '\0', 8);
21
if (connect(fd, (struct sockaddr *)&dest_host, sizeof(struct sockaddr)) == -1)
24
/* TODO fcntl(fd, F_SETFL, O_NONBLOCK); */
29
gboolean http_send_req(int fd, gchar *url, gchar *hostname)
31
int len_request, n, bytes_sent = 0;
33
gboolean error = FALSE;
35
request = g_strdup_printf("GET %s HTTP/1.0\r\n"
36
"Host: %s\r\n\r\n", url, hostname);
38
len_request = strlen(request);
41
while(bytes_sent < len_request) {
42
n = send(fd, request + bytes_sent, len_request - bytes_sent, 0);
46
DEBUG_PRINT("Error while sending request\n", NULL);
59
int http_recv(int fd, gchar **buffer)
61
int n = 0; // 1 = good, 0 = conn terminated, -1 = error
62
gchar thisbuffer[1024];
64
n = recv(fd, thisbuffer, 1023, 0);
78
*buffer = g_strdup((const gchar *)thisbuffer);
86
gboolean http_get_header(int fd, gchar **buffer)
88
gchar lastchar = 0, *thisbuffer;
91
while((l = http_recv(fd, &thisbuffer)) > 0)
93
gboolean found = FALSE;
99
if (lastchar == '\r' &&
100
(p = g_strstr_len(thisbuffer, 3, "\n\r\n"))) {
106
else if (p = strstr(thisbuffer, "\r\n\r\n")) {
113
//TODO check if at end
114
*buffer = g_strdup(where);
117
lastchar = thisbuffer[l];
128
gboolean http_get(gchar *url, gchar *hostname, gboolean savefile, gchar **fname_buff)
132
gchar *buffer = NULL;
133
gchar *retstr = NULL;
136
if ((fd = http_connect(hostname)) == -1)
139
if (http_send_req(fd, url, hostname) == -1) {
145
file = fopen(*fname_buff, "w");
149
DEBUG_PRINT("Error opening file %s\n", *fname_buff);
155
if (http_get_header(fd, &buffer) == FALSE)
161
int l = strlen(buffer);
164
fwrite(buffer, sizeof(char), l, file);
166
retstr = g_strdup(buffer);
171
while((error = http_recv(fd, &buffer)) > 0)
176
int l = strlen(buffer);
177
fwrite(buffer, sizeof(char), l, file);
185
str = g_strconcat(retstr, buffer, NULL);
190
retstr = g_strdup(str);
199
fclose(file); //TODO unlink
207
*fname_buff = retstr;
214
gboolean http_get_file(gchar *url, gchar *hostname, gchar *filename)
216
return http_get(url, hostname, TRUE, &filename);
219
gchar *http_get_buffer(gchar *url, gchar *hostname)
221
gchar *buffer = NULL;
223
http_get(url, hostname, FALSE, &buffer);