2018-02-04 03:22:01 +01:00
|
|
|
// Matrix Construct
|
|
|
|
//
|
2018-01-14 02:55:21 +01:00
|
|
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
2018-02-04 03:22:01 +01:00
|
|
|
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
2018-01-14 02:55:21 +01:00
|
|
|
//
|
|
|
|
// Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
// purpose with or without fee is hereby granted, provided that the above
|
2018-02-04 03:22:01 +01:00
|
|
|
// copyright notice and this permission notice is present in all copies. The
|
|
|
|
// full license for this software is available in the LICENSE file.
|
2007-01-25 07:40:21 +01:00
|
|
|
|
2016-08-13 05:05:54 +02:00
|
|
|
#pragma once
|
|
|
|
#define HAVE_IRCD_CLIENT_H
|
2016-08-24 00:25:09 +02:00
|
|
|
|
2017-08-28 23:51:22 +02:00
|
|
|
namespace ircd
|
|
|
|
{
|
|
|
|
struct client;
|
|
|
|
|
2018-03-02 11:14:00 +01:00
|
|
|
//TODO: want to upgrade
|
2017-08-28 23:51:22 +02:00
|
|
|
char *read(client &, char *&start, char *const &stop);
|
|
|
|
parse::read_closure read_closure(client &);
|
2017-09-30 08:04:41 +02:00
|
|
|
|
2017-08-28 23:51:22 +02:00
|
|
|
std::shared_ptr<client> add_client(std::shared_ptr<socket>); // Creates a client.
|
|
|
|
}
|
2016-09-12 23:07:46 +02:00
|
|
|
|
2017-08-28 23:51:22 +02:00
|
|
|
struct ircd::client
|
2017-08-23 22:33:31 +02:00
|
|
|
:std::enable_shared_from_this<client>
|
2018-01-14 02:55:21 +01:00
|
|
|
,ircd::instance_list<client>
|
2016-09-12 23:07:46 +02:00
|
|
|
{
|
2016-11-29 16:23:38 +01:00
|
|
|
struct init;
|
2018-01-14 02:55:21 +01:00
|
|
|
struct conf;
|
|
|
|
struct settings;
|
|
|
|
struct request;
|
2017-09-30 08:04:41 +02:00
|
|
|
|
2018-02-12 20:58:40 +01:00
|
|
|
static constexpr const size_t &HEAD_MAX
|
|
|
|
{
|
|
|
|
4_KiB
|
|
|
|
};
|
|
|
|
|
2018-01-14 02:55:21 +01:00
|
|
|
static struct settings settings;
|
|
|
|
static struct conf default_conf;
|
|
|
|
static ctx::pool context;
|
2016-09-23 08:59:24 +02:00
|
|
|
|
2018-03-12 21:30:24 +01:00
|
|
|
static void interrupt_all();
|
|
|
|
static void close_all();
|
|
|
|
static void wait_all();
|
|
|
|
|
2018-01-14 02:55:21 +01:00
|
|
|
struct conf *conf {&default_conf};
|
2018-02-17 23:28:06 +01:00
|
|
|
unique_buffer<mutable_buffer> head_buffer;
|
2018-02-18 00:44:53 +01:00
|
|
|
unique_buffer<mutable_buffer> content_buffer;
|
2018-02-12 20:58:40 +01:00
|
|
|
std::shared_ptr<socket> sock;
|
|
|
|
ircd::timer timer;
|
|
|
|
size_t head_length {0};
|
|
|
|
size_t content_consumed {0};
|
2018-02-18 00:44:53 +01:00
|
|
|
resource::request request;
|
2018-02-12 20:58:40 +01:00
|
|
|
bool longpoll {false};
|
2018-01-14 02:55:21 +01:00
|
|
|
|
2018-03-11 18:48:58 +01:00
|
|
|
size_t write_all(const const_buffer &);
|
2018-01-14 02:55:21 +01:00
|
|
|
void close(const net::close_opts &, net::close_callback);
|
|
|
|
ctx::future<void> close(const net::close_opts & = {});
|
2016-09-23 08:59:24 +02:00
|
|
|
|
2018-02-18 00:44:53 +01:00
|
|
|
void discard_unconsumed(const http::request::head &);
|
|
|
|
bool resource_request(const http::request::head &);
|
2018-01-14 02:55:21 +01:00
|
|
|
bool handle_request(parse::capstan &pc);
|
2017-03-11 02:46:25 +01:00
|
|
|
bool main() noexcept;
|
2018-03-15 21:44:29 +01:00
|
|
|
bool async();
|
2016-09-23 08:59:24 +02:00
|
|
|
|
2016-11-29 16:23:38 +01:00
|
|
|
public:
|
2017-03-14 00:11:30 +01:00
|
|
|
client(std::shared_ptr<socket>);
|
2017-03-11 02:46:25 +01:00
|
|
|
client();
|
2016-11-29 16:23:38 +01:00
|
|
|
client(client &&) = delete;
|
|
|
|
client(const client &) = delete;
|
|
|
|
client &operator=(client &&) = delete;
|
|
|
|
client &operator=(const client &) = delete;
|
2018-01-27 06:58:52 +01:00
|
|
|
~client() noexcept;
|
2017-08-28 23:51:22 +02:00
|
|
|
|
2018-01-07 06:36:17 +01:00
|
|
|
friend ipport remote(const client &);
|
|
|
|
friend ipport local(const client &);
|
2016-09-23 08:59:24 +02:00
|
|
|
};
|
|
|
|
|
2018-01-14 02:55:21 +01:00
|
|
|
/// Confs can be attached to individual clients to change their behavior
|
|
|
|
struct ircd::client::conf
|
|
|
|
{
|
|
|
|
/// Default time limit for how long a client connection can be in "async mode"
|
|
|
|
/// (or idle mode) after which it is disconnected.
|
|
|
|
seconds async_timeout {35s};
|
|
|
|
|
|
|
|
/// Time limit for how long a connected client can be in "request mode." This
|
|
|
|
/// should never be hit unless there's an error in the handling code.
|
2018-01-20 14:46:54 +01:00
|
|
|
seconds request_timeout {15s};
|
2018-01-14 02:55:21 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/// Settings apply to all clients and cannot be configured per-client
|
|
|
|
struct ircd::client::settings
|
|
|
|
{
|
|
|
|
/// TODO
|
|
|
|
size_t stack_size
|
|
|
|
{
|
|
|
|
1_MiB
|
|
|
|
};
|
|
|
|
|
|
|
|
/// TODO
|
|
|
|
size_t pool_size
|
|
|
|
{
|
|
|
|
128
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2017-08-28 23:51:22 +02:00
|
|
|
struct ircd::client::init
|
2016-08-28 10:16:24 +02:00
|
|
|
{
|
2017-11-01 23:51:24 +01:00
|
|
|
void interrupt();
|
2018-03-12 21:30:24 +01:00
|
|
|
void close();
|
|
|
|
void wait();
|
2017-11-01 23:51:24 +01:00
|
|
|
|
2016-11-29 16:23:38 +01:00
|
|
|
init();
|
|
|
|
~init() noexcept;
|
|
|
|
};
|