13 #ifndef __PROCESS_HTTP_HPP__
14 #define __PROCESS_HTTP_HPP__
20 #include <initializer_list>
27 #include <boost/functional/hash.hpp>
63 namespace authentication {
77 const std::string& realm,
94 namespace authorization {
100 lambda::function<process::Future<bool>(
133 URL(
const std::string& _scheme,
134 const std::string& _domain,
135 const uint16_t _port = 80,
136 const std::string& _path =
"/",
147 URL(
const std::string& _scheme,
149 const uint16_t _port = 80,
150 const std::string& _path =
"/",
181 std::ostream&
operator<<(std::ostream& stream,
const URL& url);
189 foreach (
char c, key) {
190 boost::hash_combine(seed, ::tolower(c));
199 bool operator()(
const std::string& left,
const std::string& right)
const
201 if (left.size() != right.size()) {
204 for (
size_t i = 0; i < left.size(); ++i) {
205 if (::tolower(left[i]) != ::tolower(right[i])) {
218 static const uint16_t
OK;
257 static std::string
string(uint16_t code);
335 explicit Reader(
const std::shared_ptr<Data>& _data) : data(_data) {}
337 std::shared_ptr<Data> data;
346 bool write(std::string s);
356 bool fail(
const std::string& message);
376 explicit Writer(
const std::shared_ptr<Data>& _data) : data(_data) {}
378 std::shared_ptr<Data> data;
393 : readEnd(Reader::OPEN),
394 writeEnd(Writer::OPEN) {}
398 std::atomic_flag lock = ATOMIC_FLAG_INIT;
400 Reader::State readEnd;
401 Writer::State writeEnd;
404 std::queue<Owned<Promise<std::string>>> reads;
408 std::queue<std::string> writes;
417 std::shared_ptr<Data> data;
427 static constexpr
const char*
NAME =
"WWW-Authenticate";
432 : authScheme_(authScheme),
433 authParam_(authParam) {}
449 std::string authScheme_;
460 CaseInsensitiveEqual>
479 Headers(std::initializer_list<std::pair<std::string, std::string>>
list)
486 template <
typename T>
512 result.insert(that.begin(), that.end());
585 const std::string&
name,
586 const std::string& mediaType)
const;
589 bool _acceptsMediaType(
591 const std::string& mediaType)
const;
608 const std::string& _body,
610 const std::string& contentType =
"text/plain; charset=utf-8")
616 headers[
"Content-Type"] = contentType;
671 explicit OK(
const std::string&
body,
const std::string& contentType)
721 const std::vector<std::string>& challenges,
722 const std::string&
body)
758 const std::initializer_list<std::string>& allowedMethods)
765 const std::initializer_list<std::string>& allowedMethods,
766 const std::string& requestMethod)
768 constructBody(allowedMethods, requestMethod),
769 Status::METHOD_NOT_ALLOWED)
775 static std::string constructBody(
776 const std::initializer_list<std::string>& allowedMethods,
777 const std::string& requestMethod)
779 return "Expecting one of { '" +
strings::join(
"', '", allowedMethods) +
780 "' }, but received '" + requestMethod +
"'";
882 const std::string& pattern,
883 const std::string& path);
898 const std::string& s,
899 const std::string& additional_chars =
"");
988 std::shared_ptr<Data> data;
1026 template <
typename F>
1036 class ServerProcess;
1091 template <
typename F>
1101 const Request&)>(std::forward<F>(
f)),
1112 template <
typename F>
1122 const Request&)>(std::forward<F>(
f)),
1159 const std::string& method,
1160 bool enableSSL =
false,
1169 const std::string& method,
1184 bool streamedResponse =
false);
1267 namespace streaming {
1315 #endif // __PROCESS_HTTP_HPP__
static StopOptions DEFAULT_STOP_OPTIONS()
Definition: http.hpp:1077
Future< Nothing > stop(const StopOptions &options=DEFAULT_STOP_OPTIONS())
Try< hashmap< std::string, std::string > > parse(const std::string &pattern, const std::string &path)
NotImplemented(const std::string &body)
Definition: http.hpp:834
bool operator!=(const Writer &other) const
Definition: http.hpp:365
size_t operator()(const std::string &key) const
Definition: http.hpp:186
std::string encode(const hashmap< std::string, std::string > &query)
Future< Nothing > serve(network::Socket s, std::function< Future< Response >(const Request &)> &&f)
Forbidden()
Definition: http.hpp:736
NotFound(const std::string &body)
Definition: http.hpp:747
bool operator!=(const Connection &c) const
Definition: http.hpp:970
static const uint16_t GATEWAY_TIMEOUT
Definition: http.hpp:254
static const uint16_t MOVED_PERMANENTLY
Definition: http.hpp:226
bool acceptsMediaType(const std::string &mediaType) const
Returns whether the media type in the "Accept" header is considered acceptable in the response...
static const uint16_t GONE
Definition: http.hpp:242
static const uint16_t UNSUPPORTED_MEDIA_TYPE
Definition: http.hpp:247
Definition: errorbase.hpp:35
Definition: http.hpp:1048
Definition: option.hpp:28
static const uint16_t METHOD_NOT_ALLOWED
Definition: http.hpp:237
Future< Response > request(const Request &request, bool streamedResponse=false)
Asynchronously sends an HTTP request to the process and returns the HTTP response once the entire res...
F && f
Definition: defer.hpp:270
static const uint16_t BAD_REQUEST
Definition: http.hpp:232
static const uint16_t NO_CONTENT
Definition: http.hpp:222
URL url
Definition: http.hpp:529
static Try< URL > parse(const std::string &urlString)
static const uint16_t REQUEST_TIMEOUT
Definition: http.hpp:240
static const uint16_t LENGTH_REQUIRED
Definition: http.hpp:243
NotAcceptable(const std::string &body)
Definition: http.hpp:789
bool acceptsEncoding(const std::string &encoding) const
Returns whether the encoding is considered acceptable in the response.
std::stringstream & join(std::stringstream &stream, const std::string &separator, T &&...args)
Definition: strings.hpp:306
static CreateOptions DEFAULT_CREATE_OPTIONS()
Definition: http.hpp:1054
std::string status
Definition: http.hpp:621
NotAcceptable()
Definition: http.hpp:787
enum process::http::Request::@3 type
static const uint16_t PARTIAL_CONTENT
Definition: http.hpp:224
static const uint16_t EXPECTATION_FAILED
Definition: http.hpp:249
static const uint16_t CONFLICT
Definition: http.hpp:241
Option< Pipe::Reader > reader
Definition: http.hpp:564
Unauthorized(const std::vector< std::string > &challenges)
Definition: http.hpp:710
uint16_t code
Definition: http.hpp:658
static Try< Server > create(network::Socket socket, std::function< Future< Response >(const network::Socket &socket, const Request &)> &&f, const CreateOptions &options=DEFAULT_CREATE_OPTIONS())
OK()
Definition: http.hpp:664
Future< Nothing > serve(const network::Socket &s, F &&f)
Definition: http.hpp:1027
static const uint16_t NON_AUTHORITATIVE_INFORMATION
Definition: http.hpp:221
Option< std::string > domain
Definition: http.hpp:172
InternalServerError()
Definition: http.hpp:823
Definition: http.hpp:1039
static const uint16_t FOUND
Definition: http.hpp:227
bool operator==(const Writer &other) const
Definition: http.hpp:364
Definition: address.hpp:277
Forbidden(const std::string &body)
Definition: http.hpp:738
Option< network::Address > client
Definition: http.hpp:547
const std::string NAME
Definition: logrotate.hpp:38
static const uint16_t MULTIPLE_CHOICES
Definition: http.hpp:225
static const uint16_t REQUEST_ENTITY_TOO_LARGE
Definition: http.hpp:245
Future< Response > requestDelete(const URL &url, const Option< Headers > &headers=None())
Asynchronously sends an HTTP DELETE request to the process with the given UPID and returns the HTTP r...
std::string encode(const std::string &s, const std::string &additional_chars="")
Returns a percent-encoded string according to RFC 3986.
Option< net::IP > ip
Definition: http.hpp:173
Future< Nothing > disconnect()
Disconnects from the server.
Definition: duration.hpp:32
Try< std::string > decode(const std::string &s)
Decode a string that is Base64-encoded with the standard Base64 alphabet.
Definition: base64.hpp:172
Definition: result.hpp:40
BadRequest()
Definition: http.hpp:701
Try< hashmap< std::string, std::string > > decode(const std::string &query)
Decode a string that is Base64-encoded with the standard Base64 alphabet.
Definition: base64.hpp:172
static const uint16_t RESET_CONTENT
Definition: http.hpp:223
PreconditionFailed()
Definition: http.hpp:805
Scheme
Definition: http.hpp:55
bool operator==(const Connection &c) const
Definition: http.hpp:969
ServiceUnavailable()
Definition: http.hpp:841
hashmap< std::string, std::string > query
Definition: http.hpp:176
Definition: hashmap.hpp:38
InternalServerError(const std::string &body)
Definition: http.hpp:825
Duration grace_period
Definition: http.hpp:1074
Accepted()
Definition: http.hpp:682
Option< Pipe::Reader > reader
Definition: http.hpp:656
std::string path
Definition: http.hpp:175
static const uint16_t PRECONDITION_FAILED
Definition: http.hpp:244
std::string body
Definition: http.hpp:654
Future< Response > post(const URL &url, const Option< Headers > &headers=None(), const Option< std::string > &body=None(), const Option< std::string > &contentType=None())
An "untyped" PID, used to encapsulate the process ID for lower-layer abstractions (eg...
Definition: pid.hpp:39
static const uint16_t NOT_ACCEPTABLE
Definition: http.hpp:238
Server & operator=(const Server &)=delete
Option< std::string > scheme
Definition: http.hpp:169
Future< Nothing > setAuthenticator(const std::string &realm, Owned< Authenticator > authenticator)
Sets (or overwrites) the authenticator for the realm.
NotImplemented()
Definition: http.hpp:832
OK(const char *body)
Definition: http.hpp:666
static const uint16_t SERVICE_UNAVAILABLE
Definition: http.hpp:253
Iterable< V > map(F &&f, const Iterable< U, Us...> &input)
Definition: lambda.hpp:45
Definition: jsonify.hpp:129
Definition: duration.hpp:259
static const uint16_t PAYMENT_REQUIRED
Definition: http.hpp:234
URL(const std::string &_scheme, const net::IP &_ip, const uint16_t _port=80, const std::string &_path="/", const hashmap< std::string, std::string > &_query=(hashmap< std::string, std::string >()), const Option< std::string > &_fragment=None())
Definition: http.hpp:147
bool write(std::string s)
Future< Nothing > readerClosed() const
static const uint16_t USE_PROXY
Definition: http.hpp:230
Option< uint16_t > port
Definition: http.hpp:174
bool fail(const std::string &message)
static const uint16_t ACCEPTED
Definition: http.hpp:220
NotFound()
Definition: http.hpp:745
const T & get() const &
Definition: option.hpp:118
MethodNotAllowed(const std::initializer_list< std::string > &allowedMethods)
Definition: http.hpp:757
ServiceUnavailable(const std::string &body)
Definition: http.hpp:843
bool isAbsolute() const
Returns whether the URL is absolute.
Future< Response > post(const URL &url, const Option< Headers > &headers=None(), const Option< std::string > &body=None(), const Option< std::string > &contentType=None())
Request createRequest(const UPID &upid, const std::string &method, bool enableSSL=false, const Option< std::string > &path=None(), const Option< Headers > &headers=None(), const Option< std::string > &body=None(), const Option< std::string > &contentType=None())
Future< Connection > connect(const network::Address &address, Scheme scheme)
bool keepAlive
Definition: http.hpp:543
Accepted(const std::string &body)
Definition: http.hpp:684
bool operator==(const Pipe &other) const
Definition: http.hpp:387
static const uint16_t SEE_OTHER
Definition: http.hpp:228
bool operator!=(const Reader &other) const
Definition: http.hpp:324
static const uint16_t OK
Definition: http.hpp:218
URL(const std::string &_scheme, const std::string &_domain, const uint16_t _port=80, const std::string &_path="/", const hashmap< std::string, std::string > &_query=(hashmap< std::string, std::string >()), const Option< std::string > &_fragment=None())
Definition: http.hpp:133
OK(const std::string &body, const std::string &contentType)
Definition: http.hpp:671
static Try error(const E &e)
Definition: try.hpp:42
Scheme scheme
Definition: http.hpp:1050
Conflict()
Definition: http.hpp:796
MethodNotAllowed(const std::initializer_list< std::string > &allowedMethods, const std::string &requestMethod)
Definition: http.hpp:764
Option< std::string > fragment
Definition: http.hpp:177
static const uint16_t CONTINUE
Definition: http.hpp:216
Try< std::vector< Entry > > list(const std::string &hierarchy, const std::string &cgroup)
static const uint16_t PROXY_AUTHENTICATION_REQUIRED
Definition: http.hpp:239
Future< Response > send(const Request &request, bool streamedResponse=false)
Sends a request to the server.
BadRequest(const std::string &body)
Definition: http.hpp:703
Result< Process > process(pid_t pid)
Definition: freebsd.hpp:30
bool operator!=(const Pipe &other) const
Definition: http.hpp:388
Future< std::string > read()
bool isError() const
Definition: try.hpp:71
std::string path
Definition: http.hpp:655
Future< Nothing > disconnected()
Returns a future that is satisfied when a disconnection occurs.
TemporaryRedirect(const std::string &url)
Definition: http.hpp:691
OK(const std::string &body)
Definition: http.hpp:669
std::string method
Definition: http.hpp:523
std::ostream & operator<<(std::ostream &stream, const URL &url)
Pipe()
Definition: http.hpp:381
std::string body
Definition: http.hpp:563
hashmap< uint16_t, std::string > * statuses
static const uint16_t SWITCHING_PROTOCOLS
Definition: http.hpp:217
static const uint16_t BAD_GATEWAY
Definition: http.hpp:252
Try< std::vector< Response > > decodeResponses(const std::string &s)
Decode HTTP responses from the given string.
static const uint16_t INTERNAL_SERVER_ERROR
Definition: http.hpp:250
network::inet::Address address()
Returns the socket address associated with this instance of the library.
static const uint16_t NOT_MODIFIED
Definition: http.hpp:229
static Try< Server > create(network::Socket socket, F &&f, const CreateOptions &options=DEFAULT_CREATE_OPTIONS())
Definition: http.hpp:1092
bool isNone() const
Definition: option.hpp:116
const network::Address peerAddress
Definition: http.hpp:973
static const uint16_t REQUESTED_RANGE_NOT_SATISFIABLE
Definition: http.hpp:248
void setCallbacks(const AuthorizationCallbacks &)
static const uint16_t CREATED
Definition: http.hpp:219
Try< Nothing > create(const std::string &hierarchy, const std::string &cgroup, bool recursive=false)
Response()
Definition: http.hpp:597
static const uint16_t UNAUTHORIZED
Definition: http.hpp:233
Future< std::string > readAll()
static const uint16_t NOT_FOUND
Definition: http.hpp:236
friend Future< Connection > connect(const network::Address &address, Scheme scheme)
URI http(const std::string &host, const std::string &path="/", const Option< int > &port=None(), const Option< std::string > &query=None(), const Option< std::string > &fragment=None(), const Option< std::string > &user=None(), const Option< std::string > &password=None())
Creates an http URI with the given parameters.
Definition: http.hpp:35
bool operator==(const Reader &other) const
Definition: http.hpp:323
std::string stringify(int flags)
static const uint16_t NOT_IMPLEMENTED
Definition: http.hpp:251
static std::string string(uint16_t code)
Headers headers
Definition: http.hpp:623
Response(uint16_t _code)
Definition: http.hpp:601
Conflict(const std::string &body)
Definition: http.hpp:798
const network::Address localAddress
Definition: http.hpp:972
size_t backlog
Definition: http.hpp:1051
enum process::http::Response::@4 type
static const uint16_t REQUEST_URI_TOO_LARGE
Definition: http.hpp:246
Definition: http.hpp:1065
Represents a connection to an HTTP server.
Definition: http.hpp:945
Future< Nothing > unsetAuthenticator(const std::string &realm)
Unsets the authenticator for the realm.
bool operator()(const std::string &left, const std::string &right) const
Definition: http.hpp:199
const T & get() const
Definition: try.hpp:73
constexpr const char * name
Definition: shell.hpp:41
Server(Server &&that)=default
static const uint16_t HTTP_VERSION_NOT_SUPPORTED
Definition: http.hpp:255
Unauthorized(const std::vector< std::string > &challenges, const std::string &body)
Definition: http.hpp:720
static Try< Server > create(const network::Address &address, F &&f, const CreateOptions &options=DEFAULT_CREATE_OPTIONS())
Definition: http.hpp:1113
static const uint16_t TEMPORARY_REDIRECT
Definition: http.hpp:231
static const uint16_t FORBIDDEN
Definition: http.hpp:235
Try< network::Address > address() const
Headers headers
Definition: http.hpp:531
PreconditionFailed(const std::string &body)
Definition: http.hpp:807
Response(const std::string &_body, uint16_t _code, const std::string &contentType="text/plain; charset=utf-8")
Definition: http.hpp:607
Request()
Definition: http.hpp:520