From d203f3c7e3bcaa20895c0f32f348cd1513ae9876 Mon Sep 17 00:00:00 2001 From: Emiliano Ciavatta Date: Thu, 8 Oct 2020 22:17:04 +0200 Subject: Frontend folder structure refactor --- frontend/src/components/ConnectionContent.js | 243 --------------------------- 1 file changed, 243 deletions(-) delete mode 100644 frontend/src/components/ConnectionContent.js (limited to 'frontend/src/components/ConnectionContent.js') diff --git a/frontend/src/components/ConnectionContent.js b/frontend/src/components/ConnectionContent.js deleted file mode 100644 index b468277..0000000 --- a/frontend/src/components/ConnectionContent.js +++ /dev/null @@ -1,243 +0,0 @@ -/* - * This file is part of caronte (https://github.com/eciavatta/caronte). - * Copyright (c) 2020 Emiliano Ciavatta. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import React, {Component} from 'react'; -import './ConnectionContent.scss'; -import {Row} from 'react-bootstrap'; -import MessageAction from "./MessageAction"; -import backend from "../backend"; -import ButtonField from "./fields/ButtonField"; -import ChoiceField from "./fields/ChoiceField"; -import DOMPurify from 'dompurify'; -import ReactJson from 'react-json-view' -import {downloadBlob, getHeaderValue} from "../utils"; -import log from "../log"; - -const classNames = require('classnames'); - -class ConnectionContent extends Component { - - constructor(props) { - super(props); - this.state = { - loading: false, - connectionContent: null, - format: "default", - tryParse: true, - messageActionDialog: null - }; - - this.validFormats = ["default", "hex", "hexdump", "base32", "base64", "ascii", "binary", "decimal", "octal"]; - } - - componentDidMount() { - if (this.props.connection != null) { - this.loadStream(); - } - - document.title = "caronte:~/$"; - } - - componentDidUpdate(prevProps, prevState, snapshot) { - if (this.props.connection != null && ( - this.props.connection !== prevProps.connection || this.state.format !== prevState.format)) { - this.closeRenderWindow(); - this.loadStream(); - } - } - - componentWillUnmount() { - this.closeRenderWindow(); - } - - loadStream = () => { - this.setState({loading: true}); - // TODO: limit workaround. - backend.get(`/api/streams/${this.props.connection.id}?format=${this.state.format}&limit=999999`).then(res => { - this.setState({ - connectionContent: res.json, - loading: false - }); - }); - }; - - setFormat = (format) => { - if (this.validFormats.includes(format)) { - this.setState({format: format}); - } - }; - - tryParseConnectionMessage = (connectionMessage) => { - if (connectionMessage.metadata == null) { - return connectionMessage.content; - } - if (connectionMessage["is_metadata_continuation"]) { - return **already parsed in previous messages**; - } - - let unrollMap = (obj) => obj == null ? null : Object.entries(obj).map(([key, value]) => -

{key}: {value}

- ); - - let m = connectionMessage.metadata; - switch (m.type) { - case "http-request": - let url = {m.host}{m.url}; - return -

{m.method} {url} {m.protocol}

- {unrollMap(m.headers)} -
{m.body}
- {unrollMap(m.trailers)} -
; - case "http-response": - const contentType = getHeaderValue(m, "Content-Type"); - let body = m.body; - if (contentType && contentType.includes("application/json")) { - try { - const json = JSON.parse(m.body); - body = ; - } catch (e) { - console.log(e); - } - } - - return -

{m.protocol} {m.status}

- {unrollMap(m.headers)} -
{body}
- {unrollMap(m.trailers)} -
; - default: - return connectionMessage.content; - } - }; - - connectionsActions = (connectionMessage) => { - if (connectionMessage.metadata == null) { //} || !connectionMessage.metadata["reproducers"]) { - return null; - } - - const m = connectionMessage.metadata; - switch (m.type) { - case "http-request" : - if (!connectionMessage.metadata["reproducers"]) { - return; - } - return Object.entries(connectionMessage.metadata["reproducers"]).map(([actionName, actionValue]) => - { - this.setState({ - messageActionDialog: this.setState({messageActionDialog: null})}/> - }); - }}/> - ); - case "http-response": - const contentType = getHeaderValue(m, "Content-Type"); - - if (contentType && contentType.includes("text/html")) { - return { - let w; - if (this.state.renderWindow && !this.state.renderWindow.closed) { - w = this.state.renderWindow; - } else { - w = window.open("", "", "width=900, height=600, scrollbars=yes"); - this.setState({renderWindow: w}); - } - w.document.body.innerHTML = DOMPurify.sanitize(m.body); - w.focus(); - }}/>; - } - break; - default: - return null; - } - }; - - downloadStreamRaw = (value) => { - backend.download(`/api/streams/${this.props.connection.id}/download?format=${this.state.format}&type=${value}`) - .then(res => downloadBlob(res.blob, `${this.props.connection.id}-${value}-${this.state.format}.txt`)) - .catch(_ => log.error("Failed to download stream messages")); - }; - - closeRenderWindow = () => { - if (this.state.renderWindow) { - this.state.renderWindow.close(); - } - }; - - render() { - const conn = this.props.connection; - const content = this.state.connectionContent; - - if (content == null) { - return
select a connection to view
; - } - - let payload = content.map((c, i) => -
-
-
-
- offset: {c.index} | timestamp: {c.timestamp} - | retransmitted: {c["is_retransmitted"] ? "yes" : "no"} -
-
{this.connectionsActions(c)}
-
-
-
{c["from_client"] ? "client" : "server"}
-
- {this.state.tryParse && this.state.format === "default" ? this.tryParseConnectionMessage(c) : c.content} -
-
- ); - - return ( -
-
- -
- flow: {conn["ip_src"]}:{conn["port_src"]} -> {conn["ip_dst"]}:{conn["port_dst"]} - | timestamp: {conn["started_at"]} -
-
- - - - - -
-
-
- -
{payload}
- {this.state.messageActionDialog} -
- ); - } - -} - - -export default ConnectionContent; -- cgit v1.2.3-70-g09d2