in internal/fake/net_conn.go [464:518]
func encodeMultiFrameTransfer(channel uint16, linkHandle, deliveryID uint32, payload []byte, edit func(int, *frames.PerformTransfer)) ([][]byte, error) {
frameData := [][]byte{}
format := uint32(0)
payloadBuf := &buffer.Buffer{}
// determine the number of frames to create
chunks := len(payload) / 32
if r := len(payload) % 32; r > 0 {
chunks++
}
if chunks < 2 {
return nil, errors.New("payload is too small for multi-frame transfer")
}
more := true
for chunk := 0; chunk < chunks; chunk++ {
encoding.WriteDescriptor(payloadBuf, encoding.TypeCodeApplicationData)
var err error
if chunk+1 < chunks {
err = encoding.WriteBinary(payloadBuf, payload[chunk*32:chunk*32+32])
} else {
// final frame
err = encoding.WriteBinary(payloadBuf, payload[chunk*32:])
more = false
}
if err != nil {
return nil, err
}
var fr *frames.PerformTransfer
if chunk == 0 {
// first frame requires extra data
fr = &frames.PerformTransfer{
Handle: linkHandle,
DeliveryID: &deliveryID,
DeliveryTag: []byte("tag"),
MessageFormat: &format,
More: true,
Payload: payloadBuf.Detach(),
}
} else {
fr = &frames.PerformTransfer{
Handle: linkHandle,
More: more,
Payload: payloadBuf.Detach(),
}
}
if edit != nil {
edit(chunk, fr)
}
b, err := EncodeFrame(frames.TypeAMQP, channel, fr)
if err != nil {
return nil, err
}
frameData = append(frameData, b)
}
return frameData, nil
}