Lindenii Project Forge
Login

hare-ev

Temporary fork of hare-ev for... reasons

Warning: Due to various recent migrations, viewing non-HEAD refs may be broken.

/cmd/httpclient/main.ha (raw)

use ev;
use ev::client;
use net::uri;
use net::http;
use ev::dial;
use net;
use io;
use errors;
use log;
use os;
use fmt;

type state = struct {
	loop: *ev::loop,
	client: *http::client,
	exit: int,
};

export fn main() void = {
	const loop = ev::newloop()!;
	defer ev::finish(&loop);

	const client = http::newclient("Hare net::http test client")!;
	defer http::client_finish(&client);

	const targ = uri::parse("http://127.0.0.1:8080")!;
	defer uri::finish(&targ);

	let req = http::new_request(&client, "GET", &targ)!;

	let state = state {
		loop = &loop,
		client = &client,
		...
	};

	const con = match (client::http_do(&loop, &client, &req, &http_done, &state)) {
	case let req: ev::req => yield req;
	case let err: dial::error =>
		log::println("dial error:", dial::strerror(err));
		return;
	case let err: io::error =>
		log::println("io error:", io::strerror(err));
		return;
	};

	for (ev::dispatch(&loop, -1)!) void;
};

fn http_done(
	user: nullable *opaque,
	r: (
		(*ev::file, http::response) |
		io::EOF | dial::error | io::error | http::protoerr | errors::unsupported
	)
) void = {
	const state = user: *state;

	const (file, resp) = match (r) {
	case let resp: (*ev::file, http::response) => yield resp;
	case io::EOF =>
		log::println("connection closed");
		ev::stop(state.loop);
		return;
	case let err: dial::error =>
		log::println("dial error", dial::strerror(err));
		ev::stop(state.loop);
		return;
	case let err: io::error =>
		log::println("io error:", io::strerror(err));
		ev::stop(state.loop);
		return;
	case let err: http::protoerr =>
		log::println("http protoerror:", http::strerror(err));
		ev::stop(state.loop);
		return;
	case let err: errors::unsupported =>
		log::println("errors:", errors::strerror(err));
		ev::stop(state.loop);
		return;
	};

	fmt::printfln("Headers:")!;
	http::write_header(os::stdout, &resp.header)!;
	fmt::println()!;
	io::copy(os::stdout, resp.body)!;

	ev::close(file);
	ev::stop(state.loop);
};