aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--connection_streams_controller.go10
-rw-r--r--frontend/src/components/ConnectionContent.js29
-rw-r--r--frontend/src/components/ConnectionContent.scss4
-rw-r--r--utils.go82
4 files changed, 119 insertions, 6 deletions
diff --git a/connection_streams_controller.go b/connection_streams_controller.go
index 251e842..096210e 100644
--- a/connection_streams_controller.go
+++ b/connection_streams_controller.go
@@ -27,6 +27,7 @@ type PatternSlice [2]uint64
type Payload struct {
FromClient bool `json:"from_client"`
Content string `json:"content"`
+ DecodedContent string `json:"decoded_content"`
Index int `json:"index"`
Timestamp time.Time `json:"timestamp"`
IsRetransmitted bool `json:"is_retransmitted"`
@@ -92,6 +93,7 @@ func (csc ConnectionStreamsController) GetConnectionPayload(c context.Context, c
payload = Payload{
FromClient: true,
Content: DecodeBytes(clientStream.Payload[start:end], format.Format),
+ //Request: ReadRequest(content),
Index: start,
Timestamp: clientStream.BlocksTimestamps[clientBlocksIndex],
IsRetransmitted: clientStream.BlocksLoss[clientBlocksIndex],
@@ -110,9 +112,15 @@ func (csc ConnectionStreamsController) GetConnectionPayload(c context.Context, c
}
size := uint64(end - start)
+ content := DecodeBytes(serverStream.Payload[start:end], format.Format)
+
+ plainContent := DecodeBytes(serverStream.Payload[start:end], "default")
+ decodedContent := DecodeBytes([]byte(DecodeHttpResponse(plainContent)), format.Format)
+
payload = Payload{
FromClient: false,
- Content: DecodeBytes(serverStream.Payload[start:end], format.Format),
+ Content: content,
+ DecodedContent: decodedContent,
Index: start,
Timestamp: serverStream.BlocksTimestamps[serverBlocksIndex],
IsRetransmitted: serverStream.BlocksLoss[serverBlocksIndex],
diff --git a/frontend/src/components/ConnectionContent.js b/frontend/src/components/ConnectionContent.js
index 905a56d..2100a68 100644
--- a/frontend/src/components/ConnectionContent.js
+++ b/frontend/src/components/ConnectionContent.js
@@ -1,6 +1,6 @@
import React, {Component} from 'react';
import './ConnectionContent.scss';
-import {Dropdown} from 'react-bootstrap';
+import {Dropdown, Button} from 'react-bootstrap';
import axios from 'axios';
class ConnectionContent extends Component {
@@ -10,7 +10,8 @@ class ConnectionContent extends Component {
this.state = {
loading: false,
connectionContent: null,
- format: "default"
+ format: "default",
+ decoded: false,
};
this.validFormats = ["default", "hex", "hexdump", "base32", "base64", "ascii", "binary", "decimal", "octal"];
@@ -37,6 +38,10 @@ class ConnectionContent extends Component {
}
}
+ toggleDecoded() {
+ this.setState({decoded: !this.state.decoded});
+ }
+
render() {
let content = this.state.connectionContent;
@@ -46,7 +51,22 @@ class ConnectionContent extends Component {
let payload = content.map((c, i) =>
<span key={`content-${i}`} className={c.from_client ? "from-client" : "from-server"}>
- {c.content}
+ {c.from_client
+ ?
+ <div id="content">{c.content}</div>
+ :
+ <>
+ {c.decoded_content
+ ?
+ <>
+ <div style={{display: this.state.decoded ? 'none':'inherit'}} id="content">{c.content}</div>
+ <div style={{display: this.state.decoded ? 'inherit':'none'}} id="decoded_content">{c.decoded_content}</div>
+ </>
+ :
+ <div id="content">{c.content}</div>
+ }
+ </>
+ }
</span>
);
@@ -69,6 +89,9 @@ class ConnectionContent extends Component {
<Dropdown.Item eventKey="decimal" active={this.state.format === "decimal"}>decimal</Dropdown.Item>
<Dropdown.Item eventKey="octal" active={this.state.format === "octal"}>octal</Dropdown.Item>
</Dropdown.Menu>
+ <Button onClick={() => this.toggleDecoded()}>{this.state.decoded ? "Encode" : "Decode"}</Button>
+
+
</Dropdown>
diff --git a/frontend/src/components/ConnectionContent.scss b/frontend/src/components/ConnectionContent.scss
index a1b4afd..5a17066 100644
--- a/frontend/src/components/ConnectionContent.scss
+++ b/frontend/src/components/ConnectionContent.scss
@@ -3,7 +3,7 @@
.connection-content {
background-color: $color-primary-3;
height: 100%;
- overflow: auto;
+ overflow: fixed;
pre {
background-color: $color-primary-0;
@@ -11,7 +11,7 @@
word-break: break-word;
max-width: 100%;
white-space: pre-wrap;
- height: 100%;
+ height: 95%;
}
.from-client {
diff --git a/utils.go b/utils.go
index a14fdca..b07244d 100644
--- a/utils.go
+++ b/utils.go
@@ -13,6 +13,11 @@ import (
"net"
"os"
"time"
+ "net/http"
+ "bufio"
+ "strings"
+ "io/ioutil"
+ "compress/gzip"
)
func Sha256Sum(fileName string) (string, error) {
@@ -108,6 +113,83 @@ func DecodeBytes(buffer []byte, format string) string {
}
}
+func ReadRequest(raw string) http.Request {
+ reader := bufio.NewReader(strings.NewReader(raw))
+ req,err := http.ReadRequest(reader)
+ if err != nil{
+ log.Info("Reading request: ",req)
+ return http.Request{}
+ }
+ return *req
+}
+
+func GetHeader(raw string) string{
+ tmp := strings.Split(raw,"\r\n")
+ end := len(tmp)
+ for i, line := range tmp{
+ if line == ""{
+ end = i
+ break
+ }
+ }
+ return strings.Join(tmp[:end],"\r\n")
+}
+
+func GetBody(raw string) string{
+ tmp := strings.Split(raw,"\r\n")
+ start := 0
+ for i, line := range tmp{
+ if line == ""{
+ start = i + 2
+ break
+ }
+ }
+ return strings.Join(tmp[start:],"\r\n")
+}
+
+func DecodeHttpResponse(raw string) string {
+ body := []byte{}
+ reader := bufio.NewReader(strings.NewReader(raw))
+ resp,err := http.ReadResponse(reader, &http.Request{})
+ if err != nil{
+ log.Info("Reading response: ",resp)
+ return ""
+ }
+
+ defer resp.Body.Close()
+
+ if resp.StatusCode >= 200 && resp.StatusCode < 300 {
+ var bodyReader io.ReadCloser
+ switch resp.Header.Get("Content-Encoding") {
+ case "gzip":
+ bodyReader, err = gzip.NewReader(resp.Body)
+ if err != nil {
+ log.Error("Gunzipping body: ",err)
+ }
+ defer bodyReader.Close()
+ body, err = ioutil.ReadAll(bodyReader)
+ if err != nil{
+ log.Error("Reading gzipped body: ",err)
+ // if the response is malformed
+ // or the connection is closed
+ fallbackReader, _ := gzip.NewReader(strings.NewReader(GetBody(raw)))
+ body, err = ioutil.ReadAll(fallbackReader)
+ if err != nil{
+ log.Error(string(body))
+ }
+ }
+ default:
+ bodyReader = resp.Body
+ body, err = ioutil.ReadAll(bodyReader)
+ if err != nil{
+ log.Error("Reading body: ",err)
+ body = []byte(GetBody(raw))
+ }
+ }
+ }
+ return GetHeader(raw) + "\r\n\r\n"+ string(body)
+}
+
func CopyFile(dst, src string) error {
in, err := os.Open(src)
if err != nil {