3 * Philipp Mergenthaler <philipp.mergenthaler@stud.uni-karlsruhe.de>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * $FreeBSD: src/release/sysinstall/http.c,v 1.2.2.5 2002/06/24 03:46:55 matusita Exp $
28 * $DragonFly: src/release/sysinstall/Attic/http.c,v 1.2 2003/06/17 04:27:21 dillon Exp $
31 #include "sysinstall.h"
32 #include <sys/socket.h>
33 #include <netinet/in.h>
34 #include <arpa/inet.h>
35 #include <sys/param.h>
38 extern const char *ftp_dirs[]; /* defined in ftp.c */
41 checkAccess(Boolean proxyCheckOnly)
44 * Some proxies fetch files with certain extensions in "ascii mode" instead
45 * of "binary mode" for FTP. The FTP server then translates all LF to CRLF.
47 * You can force Squid to use binary mode by appending ";type=i" to the URL,
48 * which is what I do here. For other proxies, the LF->CRLF substitution
49 * is reverted in distExtract().
53 bool el, found=FALSE; /* end of header line */
54 char *cp, buf[PATH_MAX], req[BUFSIZ];
55 struct addrinfo hints, *res, *res0;
57 af = variable_cmp(VAR_IPV6_ENABLE, "YES") ? AF_INET : AF_UNSPEC;
58 memset(&hints, 0, sizeof(hints));
60 hints.ai_socktype = SOCK_STREAM;
61 hints.ai_protocol = 0;
62 if ((rv = getaddrinfo(variable_get(VAR_HTTP_HOST),
63 variable_get(VAR_HTTP_PORT), &hints, &res0)) != 0) {
64 msgConfirm("%s", gai_strerror(rv));
65 variable_unset(VAR_HTTP_HOST);
69 for (res = res0; res; res = res->ai_next) {
70 if ((s = socket(res->ai_family, res->ai_socktype,
71 res->ai_protocol)) < 0)
73 if (connect(s, res->ai_addr, res->ai_addrlen) >= 0)
80 msgConfirm("Couldn't connect to proxy %s:%s",
81 variable_get(VAR_HTTP_HOST),variable_get(VAR_HTTP_PORT));
82 variable_unset(VAR_HTTP_HOST);
90 msgNotify("Checking access to\n %s", variable_get(VAR_HTTP_PATH));
91 sprintf(req,"GET %s/ HTTP/1.0\r\n\r\n", variable_get(VAR_HTTP_PATH));
92 write(s,req,strlen(req));
94 * scan the headers of the response
95 * this is extremely quick'n dirty
102 variable_set2(VAR_HTTP_FTP_MODE,"",0);
104 if ((*cp == '\012') && el) {
105 /* reached end of a header line */
106 if (!strncmp(buf,"HTTP",4)) {
107 if (strtol((char *)(buf+9),0,0) == 200) {
112 if (!strncmp(buf,"Server: ",8)) {
113 if (!strncmp(buf,"Server: Squid",13)) {
114 variable_set2(VAR_HTTP_FTP_MODE,";type=i",0);
116 variable_set2(VAR_HTTP_FTP_MODE,"",0);
119 /* ignore other headers */
120 /* check for "\015\012" at beginning of line, i.e. end of headers */
138 mediaInitHTTP(Device *dev)
140 bool found=FALSE; /* end of header line */
141 char *rel, req[BUFSIZ];
145 * First verify the proxy access
148 while (variable_get(VAR_HTTP_HOST) == NULL) {
149 if (DITEM_STATUS(mediaSetHTTP(NULL)) == DITEM_FAILURE)
154 /* If the release is specified as "__RELEASE" or "any", then just
155 * assume that the path the user gave is ok.
157 rel = variable_get(VAR_RELNAME);
159 msgConfirm("rel: -%s-", rel);
162 if (strcmp(rel, "__RELEASE") && strcmp(rel, "any")) {
163 for (fdir = 0; ftp_dirs[fdir]; fdir++) {
164 sprintf(req, "%s/%s/%s", variable_get(VAR_FTP_PATH),
165 ftp_dirs[fdir], rel);
166 variable_set2(VAR_HTTP_PATH, req, 0);
167 if (checkAccess(FALSE)) {
173 variable_set2(VAR_HTTP_PATH, variable_get(VAR_FTP_PATH), 0);
174 found = checkAccess(FALSE);
177 msgConfirm("No such directory: %s\n"
178 "please check the URL and try again.", variable_get(VAR_HTTP_PATH));
179 variable_unset(VAR_HTTP_PATH);
180 dialog_clear_norefresh();
182 if (DITEM_STATUS(mediaSetHTTP(NULL)) != DITEM_FAILURE) goto again;
188 mediaGetHTTP(Device *dev, char *file, Boolean probe)
192 bool el; /* end of header line */
193 char *cp, buf[PATH_MAX], req[BUFSIZ];
194 struct addrinfo hints, *res, *res0;
196 af = variable_cmp(VAR_IPV6_ENABLE, "YES") ? AF_INET : AF_UNSPEC;
197 memset(&hints, 0, sizeof(hints));
198 hints.ai_family = af;
199 hints.ai_socktype = SOCK_STREAM;
200 hints.ai_protocol = 0;
201 if ((rv = getaddrinfo(variable_get(VAR_HTTP_HOST),
202 variable_get(VAR_HTTP_PORT), &hints, &res0)) != 0) {
203 msgConfirm("%s", gai_strerror(rv));
207 for (res = res0; res; res = res->ai_next) {
208 if ((s = socket(res->ai_family, res->ai_socktype,
209 res->ai_protocol)) < 0)
211 if (connect(s, res->ai_addr, res->ai_addrlen) >= 0)
218 msgConfirm("Couldn't connect to proxy %s:%s",
219 variable_get(VAR_HTTP_HOST),variable_get(VAR_HTTP_PORT));
223 sprintf(req,"GET %s/%s%s HTTP/1.0\r\n\r\n",
224 variable_get(VAR_HTTP_PATH), file, variable_get(VAR_HTTP_FTP_MODE));
227 msgDebug("sending http request: %s",req);
229 write(s,req,strlen(req));
232 * scan the headers of the response
233 * this is extremely quick'n dirty
240 if ((*cp == '\012') && el) {
241 /* reached end of a header line */
242 if (!strncmp(buf,"HTTP",4)) {
243 rv=strtol((char *)(buf+9),0,0);
244 *(cp-1)='\0'; /* chop the CRLF off */
245 if (probe && (rv != 200)) {
247 } else if (rv >= 500) {
248 msgConfirm("Server error %s when sending %s, you could try an other server",buf, req);
250 } else if (rv == 404) {
251 msgConfirm("%s was not found, maybe directory or release-version are wrong?",req);
253 } else if (rv >= 400) {
254 msgConfirm("Client error %s, you could try an other server",buf);
256 } else if (rv >= 300) {
257 msgConfirm("Error %s,",buf);
259 } else if (rv != 200) {
260 msgConfirm("Error %s when sending %s, you could try an other server",buf, req);
264 /* ignore other headers */
265 /* check for "\015\012" at beginning of line, i.e. end of headers */