bsnes-libretro/nall/http/client.hpp
Tim Allen 0b923489dd Update to 20160106 OS X Preview for Developers release.
byuu says:

New update. Most of the work today went into eliminating hiro::Image
from all objects in all ports, replacing with nall::image. That took an
eternity.

Changelog:
- fixed crashing bug when loading games [thanks endrift!!]
- toggling "show status bar" option adjusts window geometry (not
  supposed to recenter the window, though)
- button sizes improved; icon-only button icons no longer being cut off
2016-01-07 19:17:15 +11:00

57 lines
1.2 KiB
C++

#pragma once
#include <nall/http/role.hpp>
namespace nall { namespace HTTP {
struct Client : Role {
inline auto open(const string& hostname, unsigned port = 80) -> bool;
inline auto upload(const Request& request) -> bool;
inline auto download(const Request& request) -> Response;
inline auto close() -> void;
~Client() { close(); }
private:
signed fd = -1;
addrinfo* info = nullptr;
};
auto Client::open(const string& hostname, unsigned port) -> bool {
addrinfo hint = {0};
hint.ai_family = AF_UNSPEC;
hint.ai_socktype = SOCK_STREAM;
hint.ai_flags = AI_ADDRCONFIG;
if(getaddrinfo(hostname, string{port}, &hint, &info) != 0) return close(), false;
fd = socket(info->ai_family, info->ai_socktype, info->ai_protocol);
if(fd < 0) return close(), false;
if(connect(fd, info->ai_addr, info->ai_addrlen) < 0) return close(), false;
return true;
}
auto Client::upload(const Request& request) -> bool {
return Role::upload(fd, request);
}
auto Client::download(const Request& request) -> Response {
Response response(request);
Role::download(fd, response);
return response;
}
auto Client::close() -> void {
if(fd) {
::close(fd);
fd = -1;
}
if(info) {
freeaddrinfo(info);
info = nullptr;
}
}
}}