2 * Copyright (C) 2006 by Darren Reed.
4 * See the IPFILTER.LICENCE file for details on licencing.
6 * $Id: load_http.c,v 1.1.2.1 2006/08/25 21:13:04 darrenr Exp $
12 * Format expected is one addres per line, at the start of each line.
17 int fd, len, left, port, endhdr, removed;
18 char *s, *t, *u, buffer[1024], *myurl;
19 alist_t *a, *rtop, *rbot;
20 struct sockaddr_in sin;
24 * More than this would just be absurd.
26 if (strlen(url) > 512) {
27 fprintf(stderr, "load_http has a URL > 512 bytes?!\n");
35 sprintf(buffer, "GET %s HTTP/1.0\r\n", url);
41 s = myurl + 7; /* http:// */
44 fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
54 sprintf(buffer + strlen(buffer), "Host: %s\r\n\r\n", s);
60 if (port < 0 || port > 65535)
66 memset(&sin, 0, sizeof(sin));
67 sin.sin_family = AF_INET;
68 sin.sin_port = htons(port);
71 if (inet_aton(s, &sin.sin_addr) == -1) {
75 host = gethostbyname(s);
78 memcpy(&sin.sin_addr, host->h_addr_list[0],
79 sizeof(sin.sin_addr));
82 fd = socket(AF_INET, SOCK_STREAM, 0);
86 if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1) {
92 if (write(fd, buffer, len) != len) {
99 left = sizeof(buffer) - 1;
101 while ((len = read(fd, s, left)) > 0) {
108 t = strchr(buffer, ' ');
117 while ((t = strchr(u, '\r')) != NULL) {
119 if (*(t + 1) == '\n') {
125 } else if (*(t + 1) == '\n') {
133 removed = (u - buffer) + 1;
134 memmove(buffer, u, (sizeof(buffer) - left) - removed);
140 t = strchr(buffer, '\n');
145 for (u = buffer; isdigit(*u) || (*u == '.'); u++)
154 if (!isspace(*u) && *u)
159 a = alist_new(4, buffer);
168 removed = t - buffer;
169 memmove(buffer, t, sizeof(buffer) - left - removed);