/* Copyright (c) 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Simple web client, gets a single page.  Used for debugging mostly. */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <iplib/iplib.h>
#include <parlib/net.h>

/* simple test, gets a single web page.  no url parsing, no timeout detection,
 * etc.  pass it the IP addr and page to fetch.
 *
 * check out http://www.d.umn.edu/~gshute/net/http-script.html for some info. */
int main(int argc, char *argv[])
{
	char *host, *page, *port;
	int dfd, ret;
	char buf[256];
	char addr[256];
	host = "146.148.59.222";
	page = "files/test.html";
	port = "80";

	if (argc > 1)
		host = argv[1];
	if (argc > 2)
		port = argv[2];
	if (argc > 3)
		page = argv[3];

	printf("FYI, Usage: %s [HOST [PORT [PAGE]]]\n", argv[0]);

	printf("Trying to access http://%s:%s/%s\n", host, port, page);
	/* manually making our own addr (no mkaddr, which was racy anyway) */
	ret = snprintf(addr, sizeof(addr), "tcp!%s!%s", host, port);
	if (snprintf_error(ret, sizeof(addr))) {
		perror("Addr string too long");
		exit(-1);
	}
	dfd = dial9(addr, 0, 0, 0, 0);
	if (dfd < 0) {
		perror("Bad Data FD");
		exit(-1);
	}
	/* short get style */
	snprintf(buf, sizeof(buf), "GET /%s\r\nConnection: close\r\n\r\n",
		 page);
	ret = write(dfd, buf, strlen(buf));
	if (ret < 0) {
		perror("Write");
		exit(-1);
	}
	/* buf - 1, to leave room for a \0 when we print */
	while ((ret = read(dfd, buf, sizeof(buf) - 1)) > 0) {
		assert(ret < sizeof(buf));
		/* trim to print only what we received */
		buf[ret] = 0;
		printf("%s", buf);
	}
}
