forked from lix-project/lix
Factor out ServeProto::BasicClientConnection::handshake
Hydra to share
This commit is contained in:
parent
4580bed3e4
commit
4a5ca576da
|
@ -64,15 +64,8 @@ ref<LegacySSHStore::Connection> LegacySSHStore::openConnection()
|
||||||
StringSink saved;
|
StringSink saved;
|
||||||
TeeSource tee(conn->from, saved);
|
TeeSource tee(conn->from, saved);
|
||||||
try {
|
try {
|
||||||
conn->to << SERVE_MAGIC_1 << SERVE_PROTOCOL_VERSION;
|
conn->remoteVersion = ServeProto::BasicClientConnection::handshake(
|
||||||
conn->to.flush();
|
conn->to, tee, SERVE_PROTOCOL_VERSION, host);
|
||||||
|
|
||||||
unsigned int magic = readInt(conn->from);
|
|
||||||
if (magic != SERVE_MAGIC_2)
|
|
||||||
throw Error("'nix-store --serve' protocol mismatch from '%s'", host);
|
|
||||||
conn->remoteVersion = readInt(conn->from);
|
|
||||||
if (GET_PROTOCOL_MAJOR(conn->remoteVersion) != 0x200)
|
|
||||||
throw Error("unsupported 'nix-store --serve' protocol version on '%s'", host);
|
|
||||||
} catch (SerialisationError & e) {
|
} catch (SerialisationError & e) {
|
||||||
// in.close(): Don't let the remote block on us not writing.
|
// in.close(): Don't let the remote block on us not writing.
|
||||||
conn->sshConn->in.close();
|
conn->sshConn->in.close();
|
||||||
|
|
|
@ -4,6 +4,25 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
ServeProto::Version ServeProto::BasicClientConnection::handshake(
|
||||||
|
BufferedSink & to,
|
||||||
|
Source & from,
|
||||||
|
ServeProto::Version localVersion,
|
||||||
|
std::string_view host)
|
||||||
|
{
|
||||||
|
to << SERVE_MAGIC_1 << localVersion;
|
||||||
|
to.flush();
|
||||||
|
|
||||||
|
unsigned int magic = readInt(from);
|
||||||
|
if (magic != SERVE_MAGIC_2)
|
||||||
|
throw Error("'nix-store --serve' protocol mismatch from '%s'", host);
|
||||||
|
auto remoteVersion = readInt(from);
|
||||||
|
if (GET_PROTOCOL_MAJOR(remoteVersion) != 0x200)
|
||||||
|
throw Error("unsupported 'nix-store --serve' protocol version on '%s'", host);
|
||||||
|
return remoteVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
StorePathSet ServeProto::BasicClientConnection::queryValidPaths(
|
StorePathSet ServeProto::BasicClientConnection::queryValidPaths(
|
||||||
const Store & store,
|
const Store & store,
|
||||||
bool lock, const StorePathSet & paths,
|
bool lock, const StorePathSet & paths,
|
||||||
|
|
|
@ -63,6 +63,28 @@ struct ServeProto::BasicClientConnection
|
||||||
FdSource from;
|
FdSource from;
|
||||||
ServeProto::Version remoteVersion;
|
ServeProto::Version remoteVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Establishes connection, negotiating version.
|
||||||
|
*
|
||||||
|
* @return the version provided by the other side of the
|
||||||
|
* connection.
|
||||||
|
*
|
||||||
|
* @param to Taken by reference to allow for various error handling
|
||||||
|
* mechanisms.
|
||||||
|
*
|
||||||
|
* @param from Taken by reference to allow for various error
|
||||||
|
* handling mechanisms.
|
||||||
|
*
|
||||||
|
* @param localVersion Our version which is sent over
|
||||||
|
*
|
||||||
|
* @param host Just used to add context to thrown exceptions.
|
||||||
|
*/
|
||||||
|
static ServeProto::Version handshake(
|
||||||
|
BufferedSink & to,
|
||||||
|
Source & from,
|
||||||
|
ServeProto::Version localVersion,
|
||||||
|
std::string_view host);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Coercion to `ServeProto::ReadConn`. This makes it easy to use the
|
* Coercion to `ServeProto::ReadConn`. This makes it easy to use the
|
||||||
* factored out serve protocol serializers with a
|
* factored out serve protocol serializers with a
|
||||||
|
|
Loading…
Reference in a new issue