Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose some HTTP functionality useful for websocket code #2579

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 1 addition & 20 deletions include/seastar/http/client.hh
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <boost/intrusive/list.hpp>
#endif
#include <seastar/net/api.hh>
#include <seastar/http/connection_factory.hh>
#include <seastar/http/reply.hh>
#include <seastar/core/condition-variable.hh>
#include <seastar/core/iostream.hh>
Expand Down Expand Up @@ -136,26 +137,6 @@ private:
void shutdown() noexcept;
};

/**
* \brief Factory that provides transport for \ref client
*
* This customization point allows callers provide its own transport for client. The
* client code calls factory when it needs more connections to the server and maintains
* the pool of re-usable sockets internally
*/

class connection_factory {
public:
/**
* \brief Make a \ref connected_socket
*
* The implementations of this method should return ready-to-use socket that will
* be used by \ref client as transport for its http connections
*/
virtual future<connected_socket> make(abort_source*) = 0;
virtual ~connection_factory() {}
};

/**
* \brief Class client wraps communications using HTTP protocol
*
Expand Down
74 changes: 74 additions & 0 deletions include/seastar/http/connection_factory.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* This file is open source software, licensed to you under the terms
* of the Apache License, Version 2.0 (the "License"). See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. You may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

#pragma once

#include <seastar/core/seastar.hh>
#include <seastar/net/api.hh>
#include <seastar/net/tls.hh>

namespace seastar::http::experimental {

/**
* \brief Factory that provides transport for \ref client
*
* This customization point allows callers provide its own transport for client. The
* client code calls factory when it needs more connections to the server.
*/

class connection_factory {
public:
/**
* \brief Make a \ref connected_socket
*
* The implementations of this method should return ready-to-use socket that will
* be used by \ref client as transport for its http connections
*/
virtual future<connected_socket> make(abort_source*) = 0;
virtual ~connection_factory() {}
};

class basic_connection_factory : public connection_factory {
socket_address _addr;
public:
explicit basic_connection_factory(socket_address addr)
: _addr(std::move(addr))
{
}
virtual future<connected_socket> make(abort_source* as) override {
return seastar::connect(_addr, {}, transport::TCP);
}
};

class tls_connection_factory : public connection_factory {
socket_address _addr;
shared_ptr<tls::certificate_credentials> _creds;
sstring _host;
public:
tls_connection_factory(socket_address addr, shared_ptr<tls::certificate_credentials> creds, sstring host)
: _addr(std::move(addr))
, _creds(std::move(creds))
, _host(std::move(host))
{
}
virtual future<connected_socket> make(abort_source* as) override {
return tls::connect(_creds, _addr, tls::tls_options{.server_name = _host});
}
};

}
4 changes: 2 additions & 2 deletions include/seastar/http/request.hh
Original file line number Diff line number Diff line change
Expand Up @@ -313,10 +313,10 @@ struct request {
*/
static request make(httpd::operation_type type, sstring host, sstring path);

private:
void add_query_param(std::string_view param);
sstring request_line() const;
future<> write_request_headers(output_stream<char>& out) const;
private:
void add_query_param(std::string_view param);
friend class experimental::connection;
};

Expand Down
29 changes: 0 additions & 29 deletions src/http/client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ module seastar;
#include <seastar/core/loop.hh>
#include <seastar/core/when_all.hh>
#include <seastar/core/reactor.hh>
#include <seastar/net/tls.hh>
#include <seastar/http/client.hh>
#include <seastar/http/request.hh>
#include <seastar/http/reply.hh>
Expand Down Expand Up @@ -203,39 +202,11 @@ future<> connection::close() {
});
}

class basic_connection_factory : public connection_factory {
socket_address _addr;
public:
explicit basic_connection_factory(socket_address addr)
: _addr(std::move(addr))
{
}
virtual future<connected_socket> make(abort_source* as) override {
return seastar::connect(_addr, {}, transport::TCP);
}
};

client::client(socket_address addr)
: client(std::make_unique<basic_connection_factory>(std::move(addr)))
{
}

class tls_connection_factory : public connection_factory {
socket_address _addr;
shared_ptr<tls::certificate_credentials> _creds;
sstring _host;
public:
tls_connection_factory(socket_address addr, shared_ptr<tls::certificate_credentials> creds, sstring host)
: _addr(std::move(addr))
, _creds(std::move(creds))
, _host(std::move(host))
{
}
virtual future<connected_socket> make(abort_source* as) override {
return tls::connect(_creds, _addr, tls::tls_options{.server_name = _host});
}
};

client::client(socket_address addr, shared_ptr<tls::certificate_credentials> creds, sstring host)
: client(std::make_unique<tls_connection_factory>(std::move(addr), std::move(creds), std::move(host)))
{
Expand Down
Loading