0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-28 00:14:07 +01:00

ircd::server: Move into directory; various cleanup.

This commit is contained in:
Jason Volk 2018-01-13 18:03:04 -08:00
parent c83665ca6c
commit 56cefcb650
6 changed files with 187 additions and 131 deletions

View file

@ -0,0 +1,58 @@
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#pragma once
#define HAVE_IRCD_SERVER_LINK_H
/// A single connection to a remote node.
///
struct ircd::server::link
{
bool init {false}; ///< link is connecting
bool fini {false}; ///< link is disconnecting
std::shared_ptr<server::node> node; ///< backreference to node
std::exception_ptr eptr; ///< error from socket
std::shared_ptr<net::socket> socket; ///< link's socket
std::deque<struct request::tag> queue; ///< link's work queue
bool connected() const noexcept;
bool ready() const;
bool busy() const;
protected:
void handle_writable(const error_code &);
void wait_writable();
void handle_readable_success();
void handle_readable(const error_code &);
void wait_readable();
void handle_close(std::exception_ptr);
void handle_open(std::exception_ptr);
public:
bool close(const net::close_opts &);
bool open(const net::open_opts &);
void cancel(request &);
void submit(request &);
link(server::node &);
~link() noexcept;
};

View file

@ -0,0 +1,46 @@
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#pragma once
#define HAVE_IRCD_SERVER_NODE_H
/// Remote entity.
///
struct ircd::server::node
:std::enable_shared_from_this<ircd::server::node>
{
std::exception_ptr eptr;
net::remote remote;
std::list<link> links;
ctx::dock dock;
void handle_resolve(std::weak_ptr<node>, std::exception_ptr, const ipport &);
void resolve(const hostport &);
public:
link &link_add(const size_t &num = 1);
void link_del(const size_t &num = 1);
link &link_get();
void cancel(request &);
void submit(request &);
node();
~node() noexcept;
};

View file

@ -18,41 +18,29 @@
// POSSIBILITY OF SUCH DAMAGE.
#pragma once
#define HAVE_IRCD_SERVER_H
#define HAVE_IRCD_SERVER_REQUEST_H
/// The interface for when IRCd plays the role of client to other servers
///
namespace ircd::server
{
struct init;
struct node;
struct link;
struct request;
struct out;
struct in;
IRCD_EXCEPTION(ircd::error, error);
extern ircd::log::log log;
extern std::map<string_view, std::shared_ptr<node>> nodes;
bool exists(const net::hostport &);
node &find(const net::hostport &);
node &get(const net::hostport &);
struct out;
struct request;
}
struct ircd::server::out
{
const_buffer head;
const_buffer content;
};
struct ircd::server::in
{
mutable_buffer head;
mutable_buffer content;
};
struct ircd::server::out
{
const_buffer head;
const_buffer content;
};
/// This is a handle for being a client to another server. This handle will
/// attempt to find an existing connection pool for the remote server otherwise
/// one will be created. Then it will multiplex your requests and demultiplex
@ -105,75 +93,3 @@ struct ircd::server::request::tag
tag &operator=(const tag &) = delete;
~tag() noexcept;
};
/// Internal representation of a remote server.
///
struct ircd::server::node
:std::enable_shared_from_this<ircd::server::node>
{
std::exception_ptr eptr;
net::remote remote;
std::list<link> links;
ctx::dock dock;
void handle_resolve(std::weak_ptr<node>, std::exception_ptr, const ipport &);
void resolve(const hostport &);
public:
link &link_add(const size_t &num = 1);
void link_del(const size_t &num = 1);
link &link_get();
void cancel(request &);
void submit(request &);
node();
~node() noexcept;
};
/// Internal representation of a single connection to a remote.
///
struct ircd::server::link
{
bool init {false}; ///< link is connecting
bool fini {false}; ///< link is disconnecting
std::shared_ptr<server::node> node; ///< backreference to node
std::exception_ptr eptr; ///< error from socket
std::shared_ptr<net::socket> socket; ///< link's socket
std::deque<struct request::tag> queue; ///< link's work queue
bool connected() const noexcept;
bool ready() const;
bool busy() const;
protected:
void handle_writable(const error_code &);
void wait_writable();
void handle_readable_success();
void handle_readable(const error_code &);
void wait_readable();
void handle_close(std::exception_ptr);
void handle_open(std::exception_ptr);
public:
bool close(const net::close_opts &);
bool open(const net::open_opts &);
void cancel(request &);
void submit(request &);
link(server::node &);
~link() noexcept;
};
/// Subsystem initialization / destruction from ircd::main
///
struct ircd::server::init
{
void interrupt();
init();
~init() noexcept;
};

View file

@ -0,0 +1,53 @@
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#pragma once
#define HAVE_IRCD_SERVER_H
/// The interface for when IRCd plays the role of client to other nodes
///
namespace ircd::server
{
struct init;
struct link;
struct node;
IRCD_EXCEPTION(ircd::error, error);
extern ircd::log::log log;
extern std::map<string_view, std::shared_ptr<node>> nodes;
bool exists(const net::hostport &);
node &find(const net::hostport &);
node &get(const net::hostport &);
}
#include "request.h"
#include "link.h"
#include "node.h"
/// Subsystem initialization / destruction from ircd::main
///
struct ircd::server::init
{
void interrupt();
init();
~init() noexcept;
};

View file

@ -1,27 +1,21 @@
/*
* charybdis: A slightly useful ircd.
* ircd.c: Starts up and runs the ircd.
*
* Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
* Copyright (C) 1996-2002 Hybrid Development Team
* Copyright (C) 2002-2008 ircd-ratbox development team
* Copyright (C) 2005-2013 charybdis development team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#include <ircd/asio.h>
#include <ircd/m/m.h>

View file

@ -17,7 +17,7 @@
// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#include <ircd/server.h>
#include <ircd/server/server.h>
#include <ircd/asio.h>
namespace ircd::server
@ -221,10 +221,8 @@ ircd::server::request::tag::read_head(const const_buffer &buffer,
{
pos + size(terminator)
};
assert(addl_head_bytes <= size(buffer));
// The head bytes accounting can be updated and this will be the final
// value of what is legitimate head in the req.in.head buffer.
assert(addl_head_bytes <= size(buffer));
head_read += addl_head_bytes;
// Setup the capstan and mark the end of the tape
@ -232,25 +230,19 @@ ircd::server::request::tag::read_head(const const_buffer &buffer,
parse::capstan pc{pb};
pc.read += head_read;
// The HTTP head is parsed here and saved in the user's object but they
// do not know about it yet and shouldn't be touching it.
req.head = http::response::head{pc};
assert(pb.completed() == head_read);
// As stated, the buffer may contain data past the head, which includes
// our content or the next response which doesn't even belong to us.
const size_t overrun_length
{
size(buffer) - addl_head_bytes
};
// Calculate the amount of overrun which belongs to our content.
const size_t &content_read
{
std::min(req.head.content_length, overrun_length)
};
// Where the partial content would be written to
const const_buffer partial_content
{
data(req.in.head) + head_read, content_read
@ -268,8 +260,6 @@ ircd::server::request::tag::read_head(const const_buffer &buffer,
data(req.in.head) + head_read + content_read, overrun_length - content_read
};
// When lucky, the content was recieved already (or there is no content) and
// we can notify the user in one shot.
if(this->content_read == req.head.content_length)
{
p.set_value(http::status(req.head.status));
@ -411,8 +401,7 @@ ircd::server::node::link_get()
return ret;
}
else
return links.back();
else return links.back();
}
ircd::server::link &