summaryrefslogtreecommitdiff
path: root/examples/go-dashboard/main.go
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2020-08-31 08:45:36 +0200
committerToni Uhlig <matzeton@googlemail.com>2020-08-31 08:52:17 +0200
commit9c3b5170fc0429a579b556cc864bc8597a37500c (patch)
tree12d8bc17b4d205ac75b4e9fd3e74146bba6f64b7 /examples/go-dashboard/main.go
parent905d84506ece0ce6612301146f11fe31cea18923 (diff)
Added golang JSON deserializer example.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'examples/go-dashboard/main.go')
-rw-r--r--examples/go-dashboard/main.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/examples/go-dashboard/main.go b/examples/go-dashboard/main.go
new file mode 100644
index 000000000..b9dcd314d
--- /dev/null
+++ b/examples/go-dashboard/main.go
@@ -0,0 +1,100 @@
+package main
+
+import (
+ "bufio"
+ "encoding/json"
+ "io"
+ "log"
+ "net"
+ "os"
+ "strconv"
+ "strings"
+)
+
+var (
+ WarningLogger *log.Logger
+ InfoLogger *log.Logger
+ ErrorLogger *log.Logger
+
+ NETWORK_BUFFER_MAX_SIZE uint16 = 9216
+ nDPIsrvd_JSON_BYTES uint16 = 4
+)
+
+func main() {
+ InfoLogger = log.New(os.Stderr, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)
+ WarningLogger = log.New(os.Stderr, "WARNING: ", log.Ldate|log.Ltime|log.Lshortfile)
+ ErrorLogger = log.New(os.Stderr, "ERROR: ", log.Ldate|log.Ltime|log.Lshortfile)
+
+ conn, _ := net.Dial("tcp", "127.0.0.1:7000")
+
+ buf := make([]byte, NETWORK_BUFFER_MAX_SIZE)
+ var jsonStr string
+ var jsonStrLen uint16 = 0
+ var jsonLen uint16 = 0
+
+ rd := bufio.NewReaderSize(conn, int(NETWORK_BUFFER_MAX_SIZE))
+ for {
+ nread, err := rd.Read(buf)
+
+ if err != nil {
+ if err != io.EOF {
+ ErrorLogger.Printf("Read Error: %v\n", err)
+ break
+ }
+ }
+
+ if nread == 0 || err == io.EOF {
+ WarningLogger.Printf("Disconnect from Server\n")
+ break
+ }
+
+ jsonStr += string(buf[:nread])
+ jsonStrLen += uint16(nread)
+
+ for {
+ if jsonStrLen < nDPIsrvd_JSON_BYTES+1 {
+ break
+ }
+
+ if jsonStr[nDPIsrvd_JSON_BYTES] != '{' {
+ ErrorLogger.Printf("BUG: JSON invalid opening character at position %d: '%s' (%x)\n",
+ nDPIsrvd_JSON_BYTES,
+ string(jsonStr[:nDPIsrvd_JSON_BYTES]), jsonStr[nDPIsrvd_JSON_BYTES])
+ os.Exit(1)
+ }
+
+ if jsonLen == 0 {
+ var tmp uint64
+ if tmp, err = strconv.ParseUint(strings.TrimLeft(jsonStr[:4], "0"), 10, 16); err != nil {
+ ErrorLogger.Printf("BUG: Could not parse length of a JSON string: %v\n", err)
+ os.Exit(1)
+ } else {
+ jsonLen = uint16(tmp)
+ }
+ }
+
+ if jsonStrLen < jsonLen+nDPIsrvd_JSON_BYTES {
+ break
+ }
+
+ if jsonStr[jsonLen+nDPIsrvd_JSON_BYTES-1] != '}' {
+ ErrorLogger.Printf("BUG: JSON invalid closing character at position %d: '%s'\n",
+ jsonLen+nDPIsrvd_JSON_BYTES,
+ string(jsonStr[jsonLen+nDPIsrvd_JSON_BYTES-1]))
+ os.Exit(1)
+ }
+
+ jsonMap := make(map[string]interface{})
+ err := json.Unmarshal([]byte(jsonStr[nDPIsrvd_JSON_BYTES:nDPIsrvd_JSON_BYTES+jsonLen]), &jsonMap)
+ if err != nil {
+ ErrorLogger.Printf("BUG: JSON error: %v\n", err)
+ os.Exit(1)
+ }
+ InfoLogger.Printf("JSON map: %v\n-------------------------------------------------------\n", jsonMap)
+
+ jsonStr = jsonStr[jsonLen+nDPIsrvd_JSON_BYTES:]
+ jsonStrLen -= (jsonLen + nDPIsrvd_JSON_BYTES)
+ jsonLen = 0
+ }
+ }
+}