Mercurial > gemma
diff pkg/auth/encode.go @ 4169:91f4b3f56ce2
Moved binary session encoding/decoding into auth package as it is only used there.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 05 Aug 2019 16:24:40 +0200 |
parents | pkg/misc/encode.go@5b9b8eabcd01 |
children | 6270951dda28 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/auth/encode.go Mon Aug 05 16:24:40 2019 +0200 @@ -0,0 +1,102 @@ +// This is Free Software under GNU Affero General Public License v >= 3.0 +// without warranty, see README.md and license for details. +// +// SPDX-License-Identifier: AGPL-3.0-or-later +// License-Filename: LICENSES/AGPL-3.0.txt +// +// Copyright (C) 2018 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> + +package auth + +import ( + "encoding/binary" + "io" +) + +// BinReader is a io.Reader to support an error tolerant way +// to read big endian encoded binary data. +type BinReader struct { + io.Reader + // Err is the first encountered error. + Err error +} + +// Read implements io.Reader without any endian awareness. +func (r *BinReader) Read(buf []byte) (int, error) { + if r.Err != nil { + return 0, r.Err + } + var n int + n, r.Err = r.Read(buf) + return n, r.Err +} + +// ReadBin reads big endian encodes binary data into x. +// If an error was encountered before no data is read. +func (r *BinReader) ReadBin(x interface{}) { + if r.Err == nil { + r.Err = binary.Read(r.Reader, binary.BigEndian, x) + } +} + +// ReadString reads a big endian encoded string from +// the underlying io.Reader into *s. +// If an error was encountered before no data is read +// and *s is unmodified. +func (r *BinReader) ReadString(s *string) { + if r.Err != nil { + return + } + var l uint32 + if r.Err = binary.Read(r.Reader, binary.BigEndian, &l); r.Err != nil { + return + } + b := make([]byte, l) + if r.Err = binary.Read(r.Reader, binary.BigEndian, b); r.Err != nil { + return + } + *s = string(b) +} + +// BinWriter is a io.Writer to support an error tolerant way +// to write big endian encoded binary data. +type BinWriter struct { + io.Writer + // Err is the first encountered error. + Err error +} + +// Write implements io.Writer without any endian awareness. +func (w *BinWriter) Write(buf []byte) (int, error) { + if w.Err != nil { + return 0, w.Err + } + var n int + n, w.Err = w.Writer.Write(buf) + return n, w.Err +} + +// WriteBin writes x big endian encoded to the underlying io.Writer. +// If an error was encountered before no data is written. +func (w *BinWriter) WriteBin(x interface{}) { + if w.Err == nil { + w.Err = binary.Write(w.Writer, binary.BigEndian, x) + } +} + +// WriteString writes a big endian encoded string to +// the underlying io.Writer. +// If an error was encountered before no data is written. +func (w *BinWriter) WriteString(s string) { + if w.Err == nil { + w.Err = binary.Write(w.Writer, binary.BigEndian, uint32(len(s))) + } + if w.Err == nil { + w.Err = binary.Write(w.Writer, binary.BigEndian, []byte(s)) + } +}