aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/farsightsec/golang-framestream/Encoder.go
diff options
context:
space:
mode:
authorGravatar varyoo <varyoo@users.noreply.github.com> 2017-07-24 23:12:50 +0200
committerGravatar Miek Gieben <miek@miek.nl> 2017-07-24 14:12:50 -0700
commit1b7492be6e07f4b8306c0b4a56d79f37485ae61c (patch)
tree02510da5a7cf228821373a8090bac29055764aba /vendor/github.com/farsightsec/golang-framestream/Encoder.go
parentf33b02689c564c1de8774f7f99d2400231a76069 (diff)
downloadcoredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.tar.gz
coredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.tar.zst
coredns-1b7492be6e07f4b8306c0b4a56d79f37485ae61c.zip
WIP: middleware/dnstap (#711)
middleware/dnstap add
Diffstat (limited to 'vendor/github.com/farsightsec/golang-framestream/Encoder.go')
-rw-r--r--vendor/github.com/farsightsec/golang-framestream/Encoder.go99
1 files changed, 99 insertions, 0 deletions
diff --git a/vendor/github.com/farsightsec/golang-framestream/Encoder.go b/vendor/github.com/farsightsec/golang-framestream/Encoder.go
new file mode 100644
index 000000000..83c01bb01
--- /dev/null
+++ b/vendor/github.com/farsightsec/golang-framestream/Encoder.go
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2014 by Farsight Security, 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
+ *
+ * http://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 framestream
+
+import (
+ "bufio"
+ "encoding/binary"
+ "io"
+)
+
+type EncoderOptions struct {
+ ContentType []byte
+ Bidirectional bool
+}
+
+type Encoder struct {
+ writer *bufio.Writer
+ reader *bufio.Reader
+ opt EncoderOptions
+ buf []byte
+}
+
+func NewEncoder(w io.Writer, opt *EncoderOptions) (enc *Encoder, err error) {
+ if opt == nil {
+ opt = &EncoderOptions{}
+ }
+ enc = &Encoder{
+ writer: bufio.NewWriter(w),
+ opt: *opt,
+ }
+
+ if opt.Bidirectional {
+ r, ok := w.(io.Reader)
+ if !ok {
+ return nil, ErrType
+ }
+ enc.reader = bufio.NewReader(r)
+ ready := ControlReady
+ ready.SetContentType(opt.ContentType)
+ if err = ready.EncodeFlush(enc.writer); err != nil {
+ return
+ }
+
+ var accept ControlFrame
+ if err = accept.DecodeTypeEscape(enc.reader, CONTROL_ACCEPT); err != nil {
+ return
+ }
+
+ if !accept.MatchContentType(opt.ContentType) {
+ return nil, ErrContentTypeMismatch
+ }
+ }
+
+ // Write the start control frame.
+ start := ControlStart
+ start.SetContentType(opt.ContentType)
+ err = start.Encode(enc.writer)
+ if err != nil {
+ return
+ }
+
+ return
+}
+
+func (enc *Encoder) Close() (err error) {
+ err = ControlStop.EncodeFlush(enc.writer)
+ if err != nil || !enc.opt.Bidirectional {
+ return
+ }
+
+ var finish ControlFrame
+ return finish.DecodeTypeEscape(enc.reader, CONTROL_FINISH)
+}
+
+func (enc *Encoder) Write(frame []byte) (n int, err error) {
+ err = binary.Write(enc.writer, binary.BigEndian, uint32(len(frame)))
+ if err != nil {
+ return
+ }
+ return enc.writer.Write(frame)
+}
+
+func (enc *Encoder) Flush() error {
+ return enc.writer.Flush()
+}