diff --git a/xgress/readuntil.go b/xgress/readuntil.go new file mode 100644 index 000000000..58fbdadde --- /dev/null +++ b/xgress/readuntil.go @@ -0,0 +1,44 @@ +/* + Copyright 2019 NetFoundry, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package xgress + +import ( + "errors" + "github.com/netfoundry/ziti-foundation/transport" +) + +func ReadUntilNewline(peer transport.Connection) ([]byte, error) { + return ReadUntil(peer, '\n') +} + +func ReadUntil(peer transport.Connection, stop byte) ([]byte, error) { + buffer := make([]byte, 0) + done := false + for !done { + next := make([]byte, 1) + n, err := peer.Reader().Read(next) + if err != nil { + return nil, err + } + if n != 1 { + return nil, errors.New("short read") + } + buffer = append(buffer, next[:n]...) + done = buffer[len(buffer)-1] == stop + } + return buffer, nil +} diff --git a/xgress/request.go b/xgress/request.go index e3eb2f828..34e1a9e8c 100644 --- a/xgress/request.go +++ b/xgress/request.go @@ -88,7 +88,7 @@ func SendRequest(request *Request, peer io.Writer) error { } func ReceiveRequest(peer transport.Connection) (*Request, error) { - line, err := transport.ReadUntilNewline(peer) + line, err := ReadUntilNewline(peer) if err != nil { return nil, err } @@ -114,7 +114,7 @@ func SendResponse(response *Response, peer io.Writer) error { } func ReceiveResponse(peer transport.Connection) (*Response, error) { - line, err := transport.ReadUntilNewline(peer) + line, err := ReadUntilNewline(peer) if err != nil { return nil, err }