55 lines
2.4 KiB
Go
55 lines
2.4 KiB
Go
|
// Package filexfer implements the wire encoding for secsh-filexfer as described in https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02
|
||
|
package filexfer
|
||
|
|
||
|
// PacketMarshaller narrowly defines packets that will only be transmitted.
|
||
|
//
|
||
|
// ExtendedPacket types will often only implement this interface,
|
||
|
// since decoding the whole packet body of an ExtendedPacket can only be done dependent on the ExtendedRequest field.
|
||
|
type PacketMarshaller interface {
|
||
|
// MarshalPacket is the primary intended way to encode a packet.
|
||
|
// The request-id for the packet is set from reqid.
|
||
|
//
|
||
|
// An optional buffer may be given in b.
|
||
|
// If the buffer has a minimum capacity, it shall be truncated and used to marshal the header into.
|
||
|
// The minimum capacity for the packet must be a constant expression, and should be at least 9.
|
||
|
//
|
||
|
// It shall return the main body of the encoded packet in header,
|
||
|
// and may optionally return an additional payload to be written immediately after the header.
|
||
|
//
|
||
|
// It shall encode in the first 4-bytes of the header the proper length of the rest of the header+payload.
|
||
|
MarshalPacket(reqid uint32, b []byte) (header, payload []byte, err error)
|
||
|
}
|
||
|
|
||
|
// Packet defines the behavior of a full generic SFTP packet.
|
||
|
//
|
||
|
// InitPacket, and VersionPacket are not generic SFTP packets, and instead implement (Un)MarshalBinary.
|
||
|
//
|
||
|
// ExtendedPacket types should not iplement this interface,
|
||
|
// since decoding the whole packet body of an ExtendedPacket can only be done dependent on the ExtendedRequest field.
|
||
|
type Packet interface {
|
||
|
PacketMarshaller
|
||
|
|
||
|
// Type returns the SSH_FXP_xy value associated with the specific packet.
|
||
|
Type() PacketType
|
||
|
|
||
|
// UnmarshalPacketBody decodes a packet body from the given Buffer.
|
||
|
// It is assumed that the common header values of the length, type and request-id have already been consumed.
|
||
|
//
|
||
|
// Implementations should not alias the given Buffer,
|
||
|
// instead they can consider prepopulating an internal buffer as a hint,
|
||
|
// and copying into that buffer if it has sufficient length.
|
||
|
UnmarshalPacketBody(buf *Buffer) error
|
||
|
}
|
||
|
|
||
|
// ComposePacket converts returns from MarshalPacket into an equivalent call to MarshalBinary.
|
||
|
func ComposePacket(header, payload []byte, err error) ([]byte, error) {
|
||
|
return append(header, payload...), err
|
||
|
}
|
||
|
|
||
|
// Default length values,
|
||
|
// Defined in draft-ietf-secsh-filexfer-02 section 3.
|
||
|
const (
|
||
|
DefaultMaxPacketLength = 34000
|
||
|
DefaultMaxDataLength = 32768
|
||
|
)
|