Skip to main content

Session

Enum Session 

Source
pub enum Session {
    Connected,
    StatelessRpc,
}
Expand description

How much of a conversation one call to a state machine gets to see.

§Why this exists, and why it is not a second implementation

Over SSH the client and the server hold one connection for the whole exchange: the advertisement, every have/want round and the packfile all travel down it, and the server’s negotiation state lives in the stack frame that is serving it.

Smart HTTP has no such frame. Each POST is an independent request that may land on a different worker, so the client re-sends its whole request on every round and the server must answer one round and stop. That is git’s --stateless-rpc, and it is the one behavioural difference between the two transports. Everything else — the framing, ls-refs, the negotiation, the pack writer — is identical, which is why gunnar-http wraps these state machines instead of restating them (one implementation).

The difference is exactly three things:

ConnectedStatelessRpc
who writes the advertisementthis crate, inlineGET /info/refs, a separate call to upload_pack::UploadPack::advertise
v2 commands per calluntil the client stopsexactly one
v0 have rounds per calluntil the client sends doneone; a round with no done answers ACK/NAK and returns

A Session is not a protocol version and does not interact with one: both v0 and v2 ride both transports.

Variants§

§

Connected

One connection carries the whole conversation. SSH, ext::, a pipe.

§

StatelessRpc

One call is one request and one response; the next round, if there is one, arrives on a different connection. Smart HTTP.

Implementations§

Source§

impl Session

Source

pub fn advertises_inline(self) -> bool

Does this session write its own advertisement before reading?

Over HTTP it does not: the advertisement is a different request (GET /info/refs?service=…), and a POST body that began with one would put the whole ref list in front of every negotiation round.

Source

pub fn is_stateless(self) -> bool

Must this call return after answering one round?

Trait Implementations§

Source§

impl Clone for Session

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Session

Source§

impl Debug for Session

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Session

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Eq for Session

Source§

impl PartialEq for Session

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Session

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more