/* 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 = "185.199.109.153";
	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 HTTP/1.1\r\nHost: akaros.org\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);
	}
}
