aboutsummaryrefslogtreecommitdiffstats
path: root/web
diff options
context:
space:
mode:
authorJason <jason.daurus@gmail.com>2016-05-28 00:43:33 +0800
committerJason <jason.daurus@gmail.com>2016-05-28 00:43:33 +0800
commit6529a3aa3e567cc65e4d11f1ab55ff16e8412fa2 (patch)
tree867dab6a80d900761b26dfbfe7965ce66beb7b77 /web
parent6bf74955b9026fb840163aae44c429a3a746464b (diff)
downloadmitmproxy-6529a3aa3e567cc65e4d11f1ab55ff16e8412fa2.tar.gz
mitmproxy-6529a3aa3e567cc65e4d11f1ab55ff16e8412fa2.tar.bz2
mitmproxy-6529a3aa3e567cc65e4d11f1ab55ff16e8412fa2.zip
[web] eliminate RawMixin
Diffstat (limited to 'web')
-rw-r--r--web/src/js/components/flowview/contentview.js64
1 files changed, 47 insertions, 17 deletions
diff --git a/web/src/js/components/flowview/contentview.js b/web/src/js/components/flowview/contentview.js
index 2743eec3..dbbf4218 100644
--- a/web/src/js/components/flowview/contentview.js
+++ b/web/src/js/components/flowview/contentview.js
@@ -4,11 +4,15 @@ import _ from "lodash";
import {MessageUtils} from "../../flow/utils.js";
import {formatSize} from "../../utils.js";
-var image_regex = /^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i;
var ViewImage = React.createClass({
+ propTypes: {
+ flow: React.PropTypes.object.isRequired,
+ message: React.PropTypes.object.isRequired,
+ },
statics: {
+ regex: /^image\/(png|jpe?g|gif|vnc.microsoft.icon|x-icon)$/i,
matches: function (message) {
- return image_regex.test(MessageUtils.getContentType(message));
+ return ViewImage.regex.test(MessageUtils.getContentType(message));
}
},
render: function () {
@@ -19,7 +23,11 @@ var ViewImage = React.createClass({
}
});
-var RawMixin = {
+var ContentLoader = React.createClass({
+ propTypes: {
+ flow: React.PropTypes.object.isRequired,
+ message: React.PropTypes.object.isRequired,
+ },
getInitialState: function () {
return {
content: undefined,
@@ -66,41 +74,54 @@ var RawMixin = {
<i className="fa fa-spinner fa-spin"></i>
</div>;
}
- return this.renderContent();
+ return React.cloneElement(this.props.children, {
+ content: this.state.content
+ })
}
-};
+});
var ViewRaw = React.createClass({
- mixins: [RawMixin],
+ propTypes: {
+ content: React.PropTypes.string.isRequired,
+ },
statics: {
+ textView: true,
matches: function (message) {
return true;
}
},
- renderContent: function () {
- return <pre>{this.state.content}</pre>;
+ render: function () {
+ return <pre>{this.props.content}</pre>;
}
});
-var json_regex = /^application\/json$/i;
var ViewJSON = React.createClass({
- mixins: [RawMixin],
+ propTypes: {
+ content: React.PropTypes.string.isRequired,
+ },
statics: {
+ textView: true,
+ regex: /^application\/json$/i,
matches: function (message) {
- return json_regex.test(MessageUtils.getContentType(message));
+ return ViewJSON.regex.test(MessageUtils.getContentType(message));
}
},
- renderContent: function () {
- var json = this.state.content;
+ render: function () {
+ var json = this.props.content;
try {
json = JSON.stringify(JSON.parse(json), null, 2);
} catch (e) {
+ // @noop
}
return <pre>{json}</pre>;
}
});
var ViewAuto = React.createClass({
+ propTypes: {
+ message: React.PropTypes.object.isRequired,
+ flow: React.PropTypes.object.isRequired,
+ },
statics: {
matches: function () {
return false; // don't match itself
@@ -115,14 +136,18 @@ var ViewAuto = React.createClass({
}
},
render: function () {
+ var { message, flow } = this.props
var View = ViewAuto.findView(this.props.message);
- return <View {...this.props}/>;
+ if (View.textView) {
+ return <ContentLoader message={message} flow={flow}><View /></ContentLoader>
+ } else {
+ return <View message={message} flow={flow} />
+ }
}
});
var all = [ViewAuto, ViewImage, ViewJSON, ViewRaw];
-
var ContentEmpty = React.createClass({
render: function () {
var message_name = this.props.flow.request === this.props.message ? "request" : "response";
@@ -210,6 +235,7 @@ var ContentView = React.createClass({
}
},
render: function () {
+ var { flow, message } = this.props
var message = this.props.message;
if (message.contentLength === 0) {
return <ContentEmpty {...this.props}/>;
@@ -222,7 +248,11 @@ var ContentView = React.createClass({
var downloadUrl = MessageUtils.getContentURL(this.props.flow, message);
return <div>
- <this.state.View {...this.props} />
+ {this.state.View.textView ? (
+ <ContentLoader flow={flow} message={message}><this.state.View /></ContentLoader>
+ ) : (
+ <this.state.View flow={flow} message={message} />
+ )}
<div className="view-options text-center">
<ViewSelector selectView={this.selectView} active={this.state.View} message={message}/>
&nbsp;
@@ -234,4 +264,4 @@ var ContentView = React.createClass({
}
});
-export default ContentView; \ No newline at end of file
+export default ContentView;