Lindenii Project Forge
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);
};