|
|
@@ -19,143 +19,6 @@ type incomingMessage struct {
|
|
|
payload *bytes.Buffer
|
|
|
}
|
|
|
|
|
|
-type flapClient struct {
|
|
|
- sequence uint32
|
|
|
- w io.Writer
|
|
|
- r io.Reader
|
|
|
-}
|
|
|
-
|
|
|
-func (f *flapClient) SignonHandshake() (wire.FLAPSignonFrame, error) {
|
|
|
- // send FLAPFrameSignon to client
|
|
|
- flap := wire.FLAPFrame{
|
|
|
- StartMarker: 42,
|
|
|
- FrameType: wire.FLAPFrameSignon,
|
|
|
- Sequence: uint16(f.sequence),
|
|
|
- PayloadLength: 4, // size of FLAPSignonFrame
|
|
|
- }
|
|
|
- if err := wire.Marshal(flap, f.w); err != nil {
|
|
|
- return wire.FLAPSignonFrame{}, err
|
|
|
- }
|
|
|
- flapSignonFrameOut := wire.FLAPSignonFrame{
|
|
|
- FLAPVersion: 1,
|
|
|
- }
|
|
|
- if err := wire.Marshal(flapSignonFrameOut, f.w); err != nil {
|
|
|
- return wire.FLAPSignonFrame{}, err
|
|
|
- }
|
|
|
-
|
|
|
- // receive FLAPFrameSignon from client
|
|
|
- flap = wire.FLAPFrame{}
|
|
|
- if err := wire.Unmarshal(&flap, f.r); err != nil {
|
|
|
- return wire.FLAPSignonFrame{}, err
|
|
|
- }
|
|
|
- buf, err := flap.ReadBody(f.r)
|
|
|
- if err != nil {
|
|
|
- return wire.FLAPSignonFrame{}, err
|
|
|
- }
|
|
|
- flapSignonFrameIn := wire.FLAPSignonFrame{}
|
|
|
- if err := wire.Unmarshal(&flapSignonFrameIn, buf); err != nil {
|
|
|
- return wire.FLAPSignonFrame{}, err
|
|
|
- }
|
|
|
-
|
|
|
- f.sequence++
|
|
|
-
|
|
|
- return flapSignonFrameIn, nil
|
|
|
-}
|
|
|
-
|
|
|
-// SendSignoffFrame sends a sign-off FLAP frame with attached TLVs as the last
|
|
|
-// request sent in the FLAP auth flow. This is unrelated to the Disconnect()
|
|
|
-// method, which sends a sign-off frame to terminate a BOS connection.
|
|
|
-// todo: combine this method with Disconnect()
|
|
|
-func (f *flapClient) SendSignoffFrame(tlvs wire.TLVRestBlock) error {
|
|
|
- tlvBuf := &bytes.Buffer{}
|
|
|
- if err := wire.Marshal(tlvs, tlvBuf); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- flap := wire.FLAPFrame{
|
|
|
- StartMarker: 42,
|
|
|
- FrameType: wire.FLAPFrameSignoff,
|
|
|
- Sequence: uint16(f.sequence),
|
|
|
- PayloadLength: uint16(tlvBuf.Len()),
|
|
|
- }
|
|
|
-
|
|
|
- if err := wire.Marshal(flap, f.w); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- expectLen := tlvBuf.Len()
|
|
|
- c, err := f.w.Write(tlvBuf.Bytes())
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- if c != expectLen {
|
|
|
- panic("did not write the expected # of bytes")
|
|
|
- }
|
|
|
-
|
|
|
- f.sequence++
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (f *flapClient) SendSNAC(frame wire.SNACFrame, body any) error {
|
|
|
- snacBuf := &bytes.Buffer{}
|
|
|
- if err := wire.Marshal(frame, snacBuf); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- if err := wire.Marshal(body, snacBuf); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- flap := wire.FLAPFrame{
|
|
|
- StartMarker: 42,
|
|
|
- FrameType: wire.FLAPFrameData,
|
|
|
- Sequence: uint16(f.sequence),
|
|
|
- PayloadLength: uint16(snacBuf.Len()),
|
|
|
- }
|
|
|
-
|
|
|
- if err := wire.Marshal(flap, f.w); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- expectLen := snacBuf.Len()
|
|
|
- c, err := f.w.Write(snacBuf.Bytes())
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- if c != expectLen {
|
|
|
- panic("did not write the expected # of bytes")
|
|
|
- }
|
|
|
-
|
|
|
- f.sequence++
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (f *flapClient) ReceiveSNAC(frame *wire.SNACFrame, body any) error {
|
|
|
- flap := wire.FLAPFrame{}
|
|
|
- if err := wire.Unmarshal(&flap, f.r); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- buf, err := flap.ReadBody(f.r)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- if err := wire.Unmarshal(frame, buf); err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- return wire.Unmarshal(body, buf)
|
|
|
-}
|
|
|
-
|
|
|
-func (f *flapClient) Disconnect() error {
|
|
|
- // gracefully disconnect so that the client does not try to
|
|
|
- // reconnect when the connection closes.
|
|
|
- flap := wire.FLAPFrame{
|
|
|
- StartMarker: 42,
|
|
|
- FrameType: wire.FLAPFrameSignoff,
|
|
|
- Sequence: uint16(f.sequence),
|
|
|
- PayloadLength: uint16(0),
|
|
|
- }
|
|
|
- return wire.Marshal(flap, f.w)
|
|
|
-}
|
|
|
-
|
|
|
func sendInvalidSNACErr(frameIn wire.SNACFrame, rw ResponseWriter) error {
|
|
|
frameOut := wire.SNACFrame{
|
|
|
FoodGroup: frameIn.FoodGroup,
|
|
|
@@ -200,7 +63,7 @@ func consumeFLAPFrames(r io.Reader, msgCh chan incomingMessage, errCh chan error
|
|
|
// or when the session closes.
|
|
|
//
|
|
|
// todo: this method has too many params and should be folded into a new type
|
|
|
-func dispatchIncomingMessages(ctx context.Context, sess *state.Session, flapc *flapClient, r io.Reader, logger *slog.Logger, router Handler, config config.Config) error {
|
|
|
+func dispatchIncomingMessages(ctx context.Context, sess *state.Session, flapc *wire.FlapClient, r io.Reader, logger *slog.Logger, router Handler, config config.Config) error {
|
|
|
// buffered so that the go routine has room to exit
|
|
|
msgCh := make(chan incomingMessage, 1)
|
|
|
readErrCh := make(chan error, 1)
|