aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/components/ContentView/ContentLoader.jsx
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2016-07-25 17:51:38 -0700
committerMaximilian Hils <git@maximilianhils.com>2016-07-25 17:51:38 -0700
commit817b675c5296d25a1fc41d9c3e68effbcee31100 (patch)
tree5940b85167156d5a116046b04ef173591bd0ae6d /web/src/js/components/ContentView/ContentLoader.jsx
parentffe6593361670a5963d2e07ed6ac2d5f022a66e7 (diff)
parent3ebb58f641612a4c512c045187ffe40879720fa7 (diff)
downloadmitmproxy-817b675c5296d25a1fc41d9c3e68effbcee31100.tar.gz
mitmproxy-817b675c5296d25a1fc41d9c3e68effbcee31100.tar.bz2
mitmproxy-817b675c5296d25a1fc41d9c3e68effbcee31100.zip
Merge branch 'flow_editing_v2'
Diffstat (limited to 'web/src/js/components/ContentView/ContentLoader.jsx')
-rw-r--r--web/src/js/components/ContentView/ContentLoader.jsx104
1 files changed, 65 insertions, 39 deletions
diff --git a/web/src/js/components/ContentView/ContentLoader.jsx b/web/src/js/components/ContentView/ContentLoader.jsx
index 1a23325c..ba6702ca 100644
--- a/web/src/js/components/ContentView/ContentLoader.jsx
+++ b/web/src/js/components/ContentView/ContentLoader.jsx
@@ -1,53 +1,36 @@
import React, { Component, PropTypes } from 'react'
import { MessageUtils } from '../../flow/utils.js'
-// This is the only place where we use jQuery.
-// Remove when possible.
-import $ from "jquery"
-export default class ContentLoader extends Component {
+export default View => class extends React.Component {
+
+ static displayName = View.displayName || View.name
+ static matches = View.matches
static propTypes = {
+ ...View.propTypes,
+ content: PropTypes.string, // mark as non-required
flow: PropTypes.object.isRequired,
message: PropTypes.object.isRequired,
}
- constructor(props, context) {
- super(props, context)
- this.state = { content: null, request: null }
- }
-
- requestContent(nextProps) {
- if (this.state.request) {
- this.state.request.abort()
+ constructor(props) {
+ super(props)
+ this.state = {
+ content: undefined,
+ request: undefined,
}
-
- const requestUrl = MessageUtils.getContentURL(nextProps.flow, nextProps.message)
- const request = $.get(requestUrl)
-
- this.setState({ content: null, request })
-
- request
- .done(content => {
- this.setState({ content })
- })
- .fail((xhr, textStatus, errorThrown) => {
- if (textStatus === 'abort') {
- return
- }
- this.setState({ content: `AJAX Error: ${textStatus}\r\n${errorThrown}` })
- })
- .always(() => {
- this.setState({ request: null })
- })
}
componentWillMount() {
- this.requestContent(this.props)
+ this.updateContent(this.props)
}
componentWillReceiveProps(nextProps) {
- if (nextProps.message !== this.props.message) {
- this.requestContent(nextProps)
+ if (
+ nextProps.message.content !== this.props.message.content ||
+ nextProps.message.contentHash !== this.props.message.contentHash
+ ) {
+ this.updateContent(nextProps)
}
}
@@ -57,15 +40,58 @@ export default class ContentLoader extends Component {
}
}
+ updateContent(props) {
+ if (this.state.request) {
+ this.state.request.abort()
+ }
+ // We have a few special cases where we do not need to make an HTTP request.
+ if(props.message.content !== undefined) {
+ return this.setState({request: undefined, content: props.message.content})
+ }
+ if(props.message.contentLength === 0 || props.message.contentLength === null){
+ return this.setState({request: undefined, content: ""})
+ }
+
+ let requestUrl = MessageUtils.getContentURL(props.flow, props.message)
+
+ // We use XMLHttpRequest instead of fetch() because fetch() is not (yet) abortable.
+ let request = new XMLHttpRequest();
+ request.addEventListener("load", this.requestComplete.bind(this, request));
+ request.addEventListener("error", this.requestFailed.bind(this, request));
+ request.open("GET", requestUrl);
+ request.send();
+ this.setState({ request, content: undefined })
+ }
+
+ requestComplete(request, e) {
+ if (request !== this.state.request) {
+ return // Stale request
+ }
+ this.setState({
+ content: request.responseText,
+ request: undefined
+ })
+ }
+
+ requestFailed(request, e) {
+ if (request !== this.state.request) {
+ return // Stale request
+ }
+ console.error(e)
+ // FIXME: Better error handling
+ this.setState({
+ content: "Error getting content.",
+ request: undefined
+ })
+ }
+
render() {
- return this.state.content ? (
- React.cloneElement(this.props.children, {
- content: this.state.content
- })
+ return this.state.content !== undefined ? (
+ <View content={this.state.content} {...this.props}/>
) : (
<div className="text-center">
<i className="fa fa-spinner fa-spin"></i>
</div>
)
}
-}
+};