39 lines
734 B
Go
39 lines
734 B
Go
package sqlserverproxy
|
|
|
|
import (
|
|
"context"
|
|
"encoding/binary"
|
|
"io"
|
|
"linkport/internal/model"
|
|
"linkport/internal/protocol/transport"
|
|
)
|
|
|
|
func relayMeasured(ctx context.Context, w io.Writer, r io.Reader, q *model.ExecutionQueue) error {
|
|
login := true
|
|
for {
|
|
var header [8]byte
|
|
if _, err := io.ReadFull(r, header[:]); err != nil {
|
|
return err
|
|
}
|
|
if err := transport.Write(w, header[:]); err != nil {
|
|
return err
|
|
}
|
|
n := int64(binary.BigEndian.Uint16(header[2:4])) - 8
|
|
if n < 0 {
|
|
q.Disable()
|
|
_, err := io.Copy(w, r)
|
|
return err
|
|
}
|
|
if _, err := io.CopyN(w, r, n); err != nil {
|
|
return err
|
|
}
|
|
if header[1]&1 != 0 {
|
|
if login {
|
|
login = false
|
|
} else {
|
|
q.Finish(ctx, "sqlserver")
|
|
}
|
|
}
|
|
}
|
|
}
|