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 char *s, *t, *u, buffer[1044], *myurl;
18 alist_t *a, *rtop, *rbot;
19 struct sockaddr_in sin;
22 int fd, len, left, port, endhdr, removed;
26 * More than this would just be absurd.
28 if (strlen(url) > 512) {
29 fprintf(stderr, "load_http has a URL > 512 bytes?!\n");
37 avail = sizeof(buffer);
38 error = snprintf(buffer, avail, "GET %s HTTP/1.0\r\n", url);
41 * error is always less then avail due to the constraint on
42 * the url length above.
50 s = myurl + 7; /* http:// */
53 fprintf(stderr, "load_http has a malformed URL '%s'\n", url);
63 error = snprintf(buffer + strlen(buffer), avail, "Host: %s\r\n\r\n", s);
65 fprintf(stderr, "URL is too large: %s\n", url);
73 if (port < 0 || port > 65535)
79 memset(&sin, 0, sizeof(sin));
80 sin.sin_family = AF_INET;
81 sin.sin_port = htons(port);
84 if (inet_aton(s, &sin.sin_addr) == -1) {
88 host = gethostbyname(s);
91 memcpy(&sin.sin_addr, host->h_addr_list[0],
92 sizeof(sin.sin_addr));
95 fd = socket(AF_INET, SOCK_STREAM, 0);
99 if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
102 len = strlen(buffer);
103 if (write(fd, buffer, len) != len)
108 left = sizeof(buffer) - 1;
110 while ((len = read(fd, s, left)) > 0) {
117 t = strchr(buffer, ' ');
126 while ((t = strchr(u, '\r')) != NULL) {
128 if (*(t + 1) == '\n') {
134 } else if (*(t + 1) == '\n') {
142 removed = (u - buffer) + 1;
143 memmove(buffer, u, (sizeof(buffer) - left) - removed);
149 t = strchr(buffer, '\n');
154 for (u = buffer; isdigit(*u) || (*u == '.'); u++)
163 if (!isspace(*u) && *u)
168 a = alist_new(4, buffer);
177 removed = t - buffer;
178 memmove(buffer, t, sizeof(buffer) - left - removed);