aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2014-09-19 01:57:50 +0200
committerMaximilian Hils <git@maximilianhils.com>2014-09-19 01:57:50 +0200
commitb5e727da8869baf9d24720debf8ff6c6c22c8500 (patch)
treea310da3e2b14e898a961f71baee738e952dd48b6
parentb0374710e4ef934c2ae9b416e5c981e04ed776ed (diff)
downloadmitmproxy-b5e727da8869baf9d24720debf8ff6c6c22c8500.tar.gz
mitmproxy-b5e727da8869baf9d24720debf8ff6c6c22c8500.tar.bz2
mitmproxy-b5e727da8869baf9d24720debf8ff6c6c22c8500.zip
web: flow icons
-rw-r--r--libmproxy/web/static/js/app.js56
-rw-r--r--web/src/js/components/flowdetail.jsx.js32
-rw-r--r--web/src/js/components/flowtable-columns.jsx.js22
-rw-r--r--web/src/js/flow/utils.js2
4 files changed, 102 insertions, 10 deletions
diff --git a/libmproxy/web/static/js/app.js b/libmproxy/web/static/js/app.js
index 4c47e201..a0a8250a 100644
--- a/libmproxy/web/static/js/app.js
+++ b/libmproxy/web/static/js/app.js
@@ -115,7 +115,7 @@ var EventLogActions = {
};
var _MessageUtils = {
getContentType: function (message) {
- return MessageUtils.getHeader(message, /Content-Type/i);
+ return this.get_first_header(message, /^Content-Type$/i);
},
get_first_header: function (message, regex) {
//FIXME: Cache Invalidation.
@@ -661,7 +661,27 @@ var IconColumn = React.createClass({displayName: 'IconColumn',
},
render: function(){
var flow = this.props.flow;
- return React.DOM.td({className: "col-icon"}, React.DOM.div({className: "resource-icon resource-icon-plain"}));
+ var contentType = ResponseUtils.getContentType(flow.response);
+
+ //TODO: We should assign a type to the flow somewhere else.
+ var icon;
+ if(flow.response.code == 304) {
+ icon = "resource-icon-not-modified"
+ } else if(300 <= flow.response.code && flow.response.code < 400) {
+ icon = "resource-icon-redirect";
+ } else if(contentType.indexOf("image") >= 0) {
+ icon = "resource-icon-image";
+ } else if (contentType.indexOf("javascript") >= 0) {
+ icon = "resource-icon-js";
+ } else if (contentType.indexOf("css") >= 0) {
+ icon = "resource-icon-css";
+ } else if (contentType.indexOf("html") >= 0) {
+ icon = "resource-icon-document";
+ } else {
+ icon = "resource-icon-plain";
+ }
+ icon += " resource-icon";
+ return React.DOM.td({className: "col-icon"}, React.DOM.div({className: icon}));
}
});
@@ -931,7 +951,11 @@ var Headers = React.createClass({displayName: 'Headers',
var FlowDetailRequest = React.createClass({displayName: 'FlowDetailRequest',
render: function(){
var flow = this.props.flow;
- var url = React.DOM.code(null, RequestUtils.pretty_url(flow.request) );
+ var first_line = [
+ flow.request.method,
+ RequestUtils.pretty_url(flow.request),
+ "HTTP/"+ flow.response.httpversion.join(".")
+ ].join(" ");
var content = null;
if(flow.request.contentLength > 0){
content = "Request Content Size: "+ formatSize(flow.request.contentLength);
@@ -943,7 +967,7 @@ var FlowDetailRequest = React.createClass({displayName: 'FlowDetailRequest',
return (
React.DOM.section(null,
- url,
+ React.DOM.code(null, first_line ),
Headers({message: flow.request}),
React.DOM.hr(null),
content
@@ -954,7 +978,29 @@ var FlowDetailRequest = React.createClass({displayName: 'FlowDetailRequest',
var FlowDetailResponse = React.createClass({displayName: 'FlowDetailResponse',
render: function(){
- return React.DOM.section(null, "response");
+ var flow = this.props.flow;
+ var first_line = [
+ "HTTP/"+ flow.response.httpversion.join("."),
+ flow.response.code,
+ flow.response.msg
+ ].join(" ");
+ var content = null;
+ if(flow.response.contentLength > 0){
+ content = "Response Content Size: "+ formatSize(flow.response.contentLength);
+ } else {
+ content = React.DOM.div({className: "alert alert-info"}, "No Content");
+ }
+
+ //TODO: Styling
+
+ return (
+ React.DOM.section(null,
+ React.DOM.code(null, first_line ),
+ Headers({message: flow.response}),
+ React.DOM.hr(null),
+ content
+ )
+ );
}
});
diff --git a/web/src/js/components/flowdetail.jsx.js b/web/src/js/components/flowdetail.jsx.js
index 744901be..e5fe37a0 100644
--- a/web/src/js/components/flowdetail.jsx.js
+++ b/web/src/js/components/flowdetail.jsx.js
@@ -46,7 +46,11 @@ var Headers = React.createClass({
var FlowDetailRequest = React.createClass({
render: function(){
var flow = this.props.flow;
- var url = <code>{ RequestUtils.pretty_url(flow.request) }</code>;
+ var first_line = [
+ flow.request.method,
+ RequestUtils.pretty_url(flow.request),
+ "HTTP/"+ flow.response.httpversion.join(".")
+ ].join(" ");
var content = null;
if(flow.request.contentLength > 0){
content = "Request Content Size: "+ formatSize(flow.request.contentLength);
@@ -58,7 +62,7 @@ var FlowDetailRequest = React.createClass({
return (
<section>
- {url}
+ <code>{ first_line }</code>
<Headers message={flow.request}/>
<hr/>
{content}
@@ -69,7 +73,29 @@ var FlowDetailRequest = React.createClass({
var FlowDetailResponse = React.createClass({
render: function(){
- return <section>response</section>;
+ var flow = this.props.flow;
+ var first_line = [
+ "HTTP/"+ flow.response.httpversion.join("."),
+ flow.response.code,
+ flow.response.msg
+ ].join(" ");
+ var content = null;
+ if(flow.response.contentLength > 0){
+ content = "Response Content Size: "+ formatSize(flow.response.contentLength);
+ } else {
+ content = <div className="alert alert-info">No Content</div>;
+ }
+
+ //TODO: Styling
+
+ return (
+ <section>
+ <code>{ first_line }</code>
+ <Headers message={flow.response}/>
+ <hr/>
+ {content}
+ </section>
+ );
}
});
diff --git a/web/src/js/components/flowtable-columns.jsx.js b/web/src/js/components/flowtable-columns.jsx.js
index 01130bc1..676b005b 100644
--- a/web/src/js/components/flowtable-columns.jsx.js
+++ b/web/src/js/components/flowtable-columns.jsx.js
@@ -28,7 +28,27 @@ var IconColumn = React.createClass({
},
render: function(){
var flow = this.props.flow;
- return <td className="col-icon"><div className="resource-icon resource-icon-plain"></div></td>;
+ var contentType = ResponseUtils.getContentType(flow.response);
+
+ //TODO: We should assign a type to the flow somewhere else.
+ var icon;
+ if(flow.response.code == 304) {
+ icon = "resource-icon-not-modified"
+ } else if(300 <= flow.response.code && flow.response.code < 400) {
+ icon = "resource-icon-redirect";
+ } else if(contentType.indexOf("image") >= 0) {
+ icon = "resource-icon-image";
+ } else if (contentType.indexOf("javascript") >= 0) {
+ icon = "resource-icon-js";
+ } else if (contentType.indexOf("css") >= 0) {
+ icon = "resource-icon-css";
+ } else if (contentType.indexOf("html") >= 0) {
+ icon = "resource-icon-document";
+ } else {
+ icon = "resource-icon-plain";
+ }
+ icon += " resource-icon";
+ return <td className="col-icon"><div className={icon}></div></td>;
}
});
diff --git a/web/src/js/flow/utils.js b/web/src/js/flow/utils.js
index b621f06d..e54f7c59 100644
--- a/web/src/js/flow/utils.js
+++ b/web/src/js/flow/utils.js
@@ -1,6 +1,6 @@
var _MessageUtils = {
getContentType: function (message) {
- return MessageUtils.getHeader(message, /Content-Type/i);
+ return this.get_first_header(message, /^Content-Type$/i);
},
get_first_header: function (message, regex) {
//FIXME: Cache Invalidation.