anyproxy
Version:
A fully configurable HTTP/HTTPS proxy in Node.js
214 lines (188 loc) • 5.85 kB
JSX
/**
* The panel to display the detial of the record
*
*/
import React, { PropTypes } from 'react';
import ClassBind from 'classnames/bind';
import { Menu, Table, notification, Spin } from 'antd';
import clipboard from 'clipboard-js'
import JsonViewer from 'component/json-viewer';
import ModalPanel from 'component/modal-panel';
import { hideRecordDetail } from 'action/recordAction';
import { selectText } from 'common/commonUtil';
import { curlify } from 'common/curlUtil';
import Style from './record-detail.less';
import CommonStyle from '../style/common.less';
const StyleBind = ClassBind.bind(Style);
const PageIndexMap = {
REQUEST_INDEX: 'REQUEST_INDEX',
RESPONSE_INDEX: 'RESPONSE_INDEX'
};
// the maximum length of the request body to decide whether to offer a download link for the request body
const MAXIMUM_REQ_BODY_LENGTH = 10000;
class RecordRequestDetail extends React.Component {
constructor() {
super();
this.state = {
};
this.copyCurlCmd = this.copyCurlCmd.bind(this);
}
static propTypes = {
requestRecord: PropTypes.object
}
onSelectText(e) {
selectText(e.target);
}
getLiDivs(targetObj) {
const liDom = Object.keys(targetObj).map((key) => {
return (
<li key={key} className={Style.liItem} >
<strong>{key} : </strong>
<span>{targetObj[key]}</span>
</li>
);
});
return liDom;
}
getCookieDiv(cookies) {
let cookieArray = [];
if (cookies) {
const cookieStringArray = cookies.split(';');
cookieArray = cookieStringArray.map((cookieString) => {
const cookie = cookieString.split('=');
return {
name: cookie[0],
value: cookie.slice(1).join('=') // cookie的值本身可能含有"=", 此处进行修正
};
});
} else {
return <div className={Style.noCookes}>No Cookies</div>;
}
const columns = [
{
title: 'Name',
dataIndex: 'name',
width: 300
},
{
title: 'Value',
dataIndex: 'value'
}
];
const rowClassFunc = function (record, index) {
// return index % 2 === 0 ? null : Style.odd;
return null;
};
const locale = {
emptyText: 'No Cookies'
};
return (
<div className={Style.cookieWrapper} >
<Table
columns={columns}
dataSource={cookieArray}
pagination={false}
size="middle"
rowClassName={rowClassFunc}
bordered
locale={locale}
rowKey="name"
/>
</div>
);
}
getReqBodyDiv() {
const { recordDetail } = this.props;
const requestBody = recordDetail.reqBody;
const reqDownload = <a href={`/fetchReqBody?id=${recordDetail.id}&_t=${Date.now()}`} target="_blank">download</a>;
const getReqBodyContent = () => {
const bodyLength = requestBody.length;
if (bodyLength > MAXIMUM_REQ_BODY_LENGTH) {
return reqDownload;
} else {
return <div>{requestBody}</div>
}
}
return (
<div className={Style.reqBody} >
{getReqBodyContent()}
</div>
);
}
notify(message, type = 'info', duration = 1.6, opts = {}) {
notification[type]({ message, duration, ...opts })
}
copyCurlCmd() {
const recordDetail = this.props.recordDetail
clipboard
.copy(curlify(recordDetail))
.then(() => this.notify('COPY SUCCESS', 'success'))
.catch(() => this.notify('COPY FAILED', 'error'))
}
getRequestDiv() {
const recordDetail = this.props.recordDetail;
const reqHeader = Object.assign({}, recordDetail.reqHeader);
const cookieString = reqHeader.cookie || reqHeader.Cookie;
delete reqHeader.cookie; // cookie will be displayed seperately
const { protocol, host, path } = recordDetail;
return (
<div>
<div className={Style.section} >
<div >
<span className={CommonStyle.sectionTitle}>General</span>
</div>
<div className={CommonStyle.whiteSpace10} />
<ul className={Style.ulItem} >
<li className={Style.liItem} >
<strong>Method:</strong>
<span>{recordDetail.method} </span>
</li>
<li className={Style.liItem} >
<strong>URL:</strong>
<span onClick={this.onSelectText} >{`${protocol}://${host}${path}`} </span>
</li>
<li className={Style.liItem} >
<strong>Protocol:</strong>
<span >HTTP/1.1</span>
</li>
</ul>
<div className={CommonStyle.whiteSpace10} />
<ul className={Style.ulItem} >
<li className={Style.liItem} >
<strong>CURL:</strong>
<span>
<a href="javascript:void(0)" onClick={this.copyCurlCmd} >copy as CURL</a>
</span>
</li>
</ul>
</div>
<div className={Style.section} >
<div >
<span className={CommonStyle.sectionTitle}>Header</span>
</div>
<div className={CommonStyle.whiteSpace10} />
<ul className={Style.ulItem} >
{this.getLiDivs(reqHeader)}
</ul>
</div>
<div className={Style.section + ' ' + Style.noBorder} >
<div >
<span className={CommonStyle.sectionTitle}>Cookies</span>
</div>
{this.getCookieDiv(cookieString)}
</div>
<div className={Style.section} >
<div >
<span className={CommonStyle.sectionTitle}>Body</span>
</div>
<div className={CommonStyle.whiteSpace10} />
{this.getReqBodyDiv()}
</div>
</div>
);
}
render() {
return this.getRequestDiv();
}
}
export default RecordRequestDetail;