diff --git a/mitmproxy/tools/web/static/static.js b/mitmproxy/tools/web/static/static.js new file mode 100644 index 0000000000..4ffedbcf22 --- /dev/null +++ b/mitmproxy/tools/web/static/static.js @@ -0,0 +1 @@ +MITMWEB_STATIC = false; \ No newline at end of file diff --git a/web/package.json b/web/package.json index a42abf8978..d922453028 100644 --- a/web/package.json +++ b/web/package.json @@ -28,11 +28,11 @@ "lodash": "^4.17.4", "mock-xmlhttprequest": "^1.1.0", "prop-types": "^15.5.10", - "react": "^15.5.4", + "react": "16.0.0-beta.3", "react-codemirror": "^1.0.0", - "react-dom": "^15.4.2", + "react-dom": "16.0.0-beta.3", "react-redux": "^5.0.5", - "react-test-renderer": "^15.5.4", + "react-test-renderer": "16.0.0-beta.3", "redux": "^3.6.0", "redux-logger": "^3.0.6", "redux-mock-store": "^1.2.3", diff --git a/web/src/js/__tests__/components/Header/FlowMenuSpec.js b/web/src/js/__tests__/components/Header/FlowMenuSpec.js index 1278d8ee4d..65fde21362 100644 --- a/web/src/js/__tests__/components/Header/FlowMenuSpec.js +++ b/web/src/js/__tests__/components/Header/FlowMenuSpec.js @@ -7,7 +7,6 @@ import { TFlow, TStore }from '../../ducks/tutils' import { MessageUtils } from "../../../flow/utils" import { Provider } from 'react-redux' - describe('FlowMenu Component', () => { let actions = { resumeFlow: jest.fn(), diff --git a/web/src/js/__tests__/components/Header/OptionMenuSpec.js b/web/src/js/__tests__/components/Header/OptionMenuSpec.js index b84fce6e52..980285ef11 100644 --- a/web/src/js/__tests__/components/Header/OptionMenuSpec.js +++ b/web/src/js/__tests__/components/Header/OptionMenuSpec.js @@ -4,7 +4,6 @@ import { Provider } from 'react-redux' import OptionMenu from '../../../components/Header/OptionMenu' import { TStore } from '../../ducks/tutils' - describe('OptionMenu Component', () => { it('should render correctly', () => { let store = TStore(), diff --git a/web/src/js/__tests__/components/Header/__snapshots__/FileMenuSpec.js.snap b/web/src/js/__tests__/components/Header/__snapshots__/FileMenuSpec.js.snap index 15c1afbc24..ef9359149c 100644 --- a/web/src/js/__tests__/components/Header/__snapshots__/FileMenuSpec.js.snap +++ b/web/src/js/__tests__/components/Header/__snapshots__/FileMenuSpec.js.snap @@ -72,17 +72,9 @@ exports[`FileMenu Component should render correctly 1`] = ` />  Options - - -
  • -
    - -
  • -
  • - { store.dispatch(addLog(msg)) diff --git a/web/src/js/backends/static.js b/web/src/js/backends/static.js new file mode 100644 index 0000000000..6657fecf1e --- /dev/null +++ b/web/src/js/backends/static.js @@ -0,0 +1,33 @@ +/* + * This backend uses the REST API only to host static instances, + * without any Websocket connection. + */ +import { fetchApi } from "../utils" + +export default class StaticBackend { + constructor(store) { + this.store = store + this.onOpen() + } + + onOpen() { + this.fetchData("settings") + this.fetchData("flows") + this.fetchData("events") + this.fetchData("options") + } + + fetchData(resource) { + fetchApi(`/${resource}`) + .then(res => res.json()) + .then(json => { + this.receive(resource, json) + }) + } + + receive(resource, data) { + let type = `${resource}_RECEIVE`.toUpperCase() + this.store.dispatch({ type, cmd: "receive", resource, data }) + } + +} diff --git a/web/src/js/components/Footer.jsx b/web/src/js/components/Footer.jsx index 08d1549624..db9afe6f4c 100644 --- a/web/src/js/components/Footer.jsx +++ b/web/src/js/components/Footer.jsx @@ -2,6 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import { formatSize } from '../utils.js' +import HideInStatic from '../components/common/HideInStatic' Footer.propTypes = { settings: PropTypes.object.isRequired, @@ -49,11 +50,14 @@ function Footer({ settings }) { stream: {formatSize(stream_large_bodies)} )}
    - {server && ( + + { + server && ( {listen_host||"*"}:{listen_port} - - )} + ) + } + v{version} diff --git a/web/src/js/components/Header.jsx b/web/src/js/components/Header.jsx index ebe7453c07..9b7354eb59 100644 --- a/web/src/js/components/Header.jsx +++ b/web/src/js/components/Header.jsx @@ -8,6 +8,7 @@ import FileMenu from './Header/FileMenu' import FlowMenu from './Header/FlowMenu' import {setActiveMenu} from '../ducks/ui/header' import ConnectionIndicator from "./Header/ConnectionIndicator" +import HideInStatic from './common/HideInStatic' class Header extends Component { static entries = [MainMenu, OptionMenu] @@ -40,7 +41,9 @@ class Header extends Component { {Entry.title} ))} - + + +
    diff --git a/web/src/js/components/Header/FileMenu.jsx b/web/src/js/components/Header/FileMenu.jsx index 62f721cfff..5cb8e507a0 100644 --- a/web/src/js/components/Header/FileMenu.jsx +++ b/web/src/js/components/Header/FileMenu.jsx @@ -5,6 +5,7 @@ import FileChooser from '../common/FileChooser' import Dropdown, {Divider} from '../common/Dropdown' import * as flowsActions from '../../ducks/flows' import * as modalActions from '../../ducks/ui/modal' +import HideInStatic from "../common/HideInStatic"; FileMenu.propTypes = { clearFlows: PropTypes.func.isRequired, @@ -36,17 +37,18 @@ export function FileMenu ({clearFlows, loadFlows, saveFlows, openModal}) {  Save... + { e.preventDefault(); openModal(); }}>  Options -  Install Certificates... + ) } diff --git a/web/src/js/components/Header/FlowMenu.jsx b/web/src/js/components/Header/FlowMenu.jsx index 8f10421368..70c8bfcfe5 100644 --- a/web/src/js/components/Header/FlowMenu.jsx +++ b/web/src/js/components/Header/FlowMenu.jsx @@ -4,6 +4,7 @@ import { connect } from "react-redux" import Button from "../common/Button" import { MessageUtils } from "../../flow/utils.js" import * as flowsActions from "../../ducks/flows" +import HideInStatic from "../common/HideInStatic"; FlowMenu.title = 'Flow' @@ -22,6 +23,7 @@ export function FlowMenu({ flow, resumeFlow, killFlow, replayFlow, duplicateFlow return
    return (
    +
    + +
    + +
    +
    diff --git a/web/src/js/components/Header/OptionMenu.jsx b/web/src/js/components/Header/OptionMenu.jsx index b33d578d25..c41c9d99cc 100644 --- a/web/src/js/components/Header/OptionMenu.jsx +++ b/web/src/js/components/Header/OptionMenu.jsx @@ -3,12 +3,14 @@ import PropTypes from 'prop-types' import { connect } from "react-redux" import { SettingsToggle, EventlogToggle } from "./MenuToggle" import DocsLink from "../common/DocsLink" +import HideInStatic from "../common/HideInStatic"; OptionMenu.title = 'Options' export default function OptionMenu() { return (
    +
    HTTP/2.0 @@ -17,6 +19,7 @@ export default function OptionMenu() {
    Protocol Support
    +
    @@ -29,12 +32,17 @@ export default function OptionMenu() {
    HTTP Options
    +
    +
    + Use Host Header + +
    View Options
    diff --git a/web/src/js/components/common/HideInStatic.jsx b/web/src/js/components/common/HideInStatic.jsx new file mode 100644 index 0000000000..c5f3bf472b --- /dev/null +++ b/web/src/js/components/common/HideInStatic.jsx @@ -0,0 +1,5 @@ +import React from 'react' + +export default function HideInStatic({ children }) { + return global.MITMWEB_STATIC ? null : [children] +} diff --git a/web/src/templates/index.html b/web/src/templates/index.html index db9d2ecb7f..d2d0177641 100644 --- a/web/src/templates/index.html +++ b/web/src/templates/index.html @@ -7,6 +7,7 @@ + diff --git a/web/yarn.lock b/web/yarn.lock index f841e38bd7..6efd888587 100644 --- a/web/yarn.lock +++ b/web/yarn.lock @@ -4309,7 +4309,7 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@~15.5.7: +prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6: version "15.5.10" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154" dependencies: @@ -4404,14 +4404,14 @@ react-codemirror@^1.0.0: lodash.isequal "^4.5.0" prop-types "^15.5.4" -react-dom@^15.4.2: - version "15.5.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da" +react-dom@16.0.0-beta.3: + version "16.0.0-beta.3" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.0.0-beta.3.tgz#6b662e8db127d14565b98799c13532044c7768b9" dependencies: fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" - prop-types "~15.5.7" + prop-types "^15.5.6" react-redux@^5.0.5: version "5.0.5" @@ -4425,21 +4425,21 @@ react-redux@^5.0.5: loose-envify "^1.1.0" prop-types "^15.5.10" -react-test-renderer@^15.5.4: - version "15.5.4" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.5.4.tgz#d4ebb23f613d685ea8f5390109c2d20fbf7c83bc" +react-test-renderer@16.0.0-beta.3: + version "16.0.0-beta.3" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.0.0-beta.3.tgz#334a97818c0fd841bb377da34bc2e5a0284772fb" dependencies: fbjs "^0.8.9" object-assign "^4.1.0" -react@^15.5.4: - version "15.5.4" - resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047" +react@16.0.0-beta.3: + version "16.0.0-beta.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.0.0-beta.3.tgz#f3974ce09dfef8e7debaba87c063a35aa09878a4" dependencies: fbjs "^0.8.9" loose-envify "^1.1.0" object-assign "^4.1.0" - prop-types "^15.5.7" + prop-types "^15.5.6" read-only-stream@^2.0.0: version "2.0.0"