| // 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 |
| ) |