summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1997-10-31 23:33:44 +0000
committerache <ache@FreeBSD.org>1997-10-31 23:33:44 +0000
commit387b4eb4a3405b30dffd0b59ae20838ace42fc53 (patch)
tree2d12335e4e58194a1187c5f677366a0ed38af6a2 /usr.bin
parent1f886000f4e1de1f78620363b5c8ee75ca1bb58a (diff)
downloadFreeBSD-src-387b4eb4a3405b30dffd0b59ae20838ace42fc53.zip
FreeBSD-src-387b4eb4a3405b30dffd0b59ae20838ace42fc53.tar.gz
Don't search for ':' port in ?# params part
Require to correctly parse http://...cgi?http://...
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/fetch/http.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/usr.bin/fetch/http.c b/usr.bin/fetch/http.c
index 6eeb010..999bb46 100644
--- a/usr.bin/fetch/http.c
+++ b/usr.bin/fetch/http.c
@@ -26,7 +26,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: http.c,v 1.11 1997/08/05 20:18:38 ache Exp $
+ * $Id: http.c,v 1.12 1997/09/28 11:25:59 cracauer Exp $
*/
#include <sys/types.h>
@@ -125,22 +125,31 @@ static time_t parse_http_date(char *datestring);
static void setup_http_auth(void);
static int
-http_parse(struct fetch_state *fs, const char *uri)
+http_parse(struct fetch_state *fs, const char *u)
{
- const char *p, *colon, *slash, *ques, *q;
- char *hostname, *hosthdr, *trimmed_name;
+ const char *p, *colon, *slash, *q;
+ char *hostname, *hosthdr, *trimmed_name, *uri, *ques, saveq = 0;
unsigned port;
struct http_state *https;
+ uri = alloca(strlen(u) + 1);
+ strcpy(uri, u);
+
p = uri + 5;
port = 0;
if (p[0] != '/' || p[1] != '/') {
- warnx("`%s': malformed `http' URL", uri);
+ warnx("`%s': malformed `http' URL", u);
return EX_USAGE;
}
p += 2;
+
+ if ((ques = strpbrk(p, "?#")) != NULL) {
+ saveq = *ques;
+ *ques = '\0';
+ }
+
colon = strchr(p, ':');
slash = strchr(p, '/');
if (colon && slash && colon < slash)
@@ -148,7 +157,7 @@ http_parse(struct fetch_state *fs, const char *uri)
else
q = slash;
if (q == 0) {
- warnx("`%s': malformed `http' URL", uri);
+ warnx("`%s': malformed `http' URL", u);
return EX_USAGE;
}
hostname = alloca(q - p + 1);
@@ -164,7 +173,7 @@ http_parse(struct fetch_state *fs, const char *uri)
ul = strtoul(colon + 1, &ep, 10);
if (ep != slash || ep == colon + 1 || errno != 0
|| ul < 1 || ul > 65534) {
- warn("`%s': invalid port in URL", uri);
+ warn("`%s': invalid port in URL", u);
return EX_USAGE;
}
@@ -175,6 +184,10 @@ http_parse(struct fetch_state *fs, const char *uri)
p = slash;
+ /* parsing finished, restore parm part */
+ if (ques != NULL)
+ *ques = saveq;
+
https = safe_malloc(sizeof *https);
/*
@@ -194,7 +207,6 @@ http_parse(struct fetch_state *fs, const char *uri)
*/
https->http_remote_request = safe_strdup(p);
p++;
- ques = strpbrk(p, "?#");
if (ques) {
trimmed_name = safe_strndup(p, ques - p);
} else {
OpenPOWER on IntegriCloud