Skip to content

Commit 154d3e7

Browse files
committed
Show a 'closed' card with timing info on raw connections
1 parent 81d0d1f commit 154d3e7

File tree

5 files changed

+41
-11
lines changed

5 files changed

+41
-11
lines changed

src/components/common/duration-pill.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { TimingEvents } from '../../types';
55
import { observableClock } from '../../util/observable';
66

77
import { Pill } from './pill';
8+
import { formatDuration } from '../../util/text';
89

910
function sigFig(num: number, figs: number): string {
1011
return num.toFixed(figs);
@@ -41,11 +42,5 @@ export const DurationPill = observer((p: DurationPillProps) => {
4142

4243
if (duration === undefined) return null;
4344

44-
return <Pill className={p.className}>{
45-
duration < 100 ? sigFig(duration, 1) + 'ms' : // 22.3ms
46-
duration < 1000 ? sigFig(duration, 0) + 'ms' : // 999ms
47-
duration < 5000 ? sigFig(duration / 1000, 2) + ' seconds' : // 3.04 seconds
48-
duration < 9900 ? sigFig(duration / 1000, 1) + ' seconds' : // 8.2 seconds
49-
sigFig(duration / 1000, 0) + ' seconds' // 30 seconds
50-
}</Pill>;
45+
return <Pill className={p.className}>{formatDuration(duration)}</Pill>;
5146
});

src/components/view/raw-tunnel-details-pane.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ContentLabelBlock, Content, CopyableMonoValue } from '../common/text-co
1212
import { PaneScrollContainer } from './view-details-pane';
1313
import { StreamMessageListCard } from './stream-message-list-card';
1414
import { SelfSizedEditor } from '../editor/base-editor';
15+
import { formatDuration } from '../../util/text';
1516

1617
@inject('uiStore')
1718
@observer
@@ -54,7 +55,7 @@ export class RawTunnelDetailsPane extends React.Component<{
5455
<Content>
5556
<p>
5657
This connection was not intercepted by HTTP Toolkit, as it contains
57-
an unrecognized (non-HTTP) protocol.
58+
an unrecognized non-HTTP protocol, so was tunnelled directly to its destination.
5859
</p>
5960
</Content>
6061
<Content>
@@ -72,6 +73,22 @@ export class RawTunnelDetailsPane extends React.Component<{
7273
</Content>
7374
</MediumCard>
7475
{ packetsListCard }
76+
{
77+
!tunnel.isOpen() &&
78+
<MediumCard>
79+
<header>
80+
<h1>Connection Closed</h1>
81+
</header>
82+
<Content>
83+
This tunnel was closed {
84+
tunnel.timingEvents.disconnectTimestamp
85+
? <>after {formatDuration(
86+
tunnel.timingEvents.disconnectTimestamp - tunnel.timingEvents.connectTimestamp
87+
)}</> : <></>
88+
}.
89+
</Content>
90+
</MediumCard>
91+
}
7592
</PaneScrollContainer>;
7693
}
7794
}

src/model/raw-tunnel.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,11 @@ export class RawTunnel extends HTKEventBase {
7474

7575
@action
7676
markClosed(closeEvent: InputRawPassthrough) {
77-
this.timingEvents.disconnectTimestamp = closeEvent.timingEvents.disconnectTimestamp;
77+
this.timingEvents.disconnectTimestamp = (
78+
// Work around for incorrect timing field name:
79+
(closeEvent.timingEvents as any).disconnectedTimestamp ||
80+
closeEvent.timingEvents.disconnectTimestamp
81+
);
7882
this.open = false;
7983
}
8084

src/model/tls/tls-tunnel.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ export class TlsTunnel extends HTKEventBase {
3535
private open = true;
3636

3737
markClosed(closeEvent: InputTlsPassthrough) {
38-
this.timingEvents.disconnectTimestamp = closeEvent.timingEvents.disconnectTimestamp;
38+
this.timingEvents.disconnectTimestamp = (
39+
// Work around for incorrect timing field name:
40+
(closeEvent.timingEvents as any).disconnectedTimestamp ||
41+
closeEvent.timingEvents.disconnectTimestamp
42+
);
3943
this.open = false;
4044
}
4145

src/util/text.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,14 @@ export function camelToSentenceCase(value: string) {
2727
value.replace(/([a-z])([A-Z])/g, '$1 $2')
2828
.toLowerCase()
2929
);
30-
}
30+
}
31+
32+
const sigFig = (num: number, figs: number): string =>
33+
num.toFixed(figs);
34+
35+
export const formatDuration = (duration: number) =>
36+
duration < 100 ? sigFig(duration, 1) + 'ms' : // 22.3ms
37+
duration < 1000 ? sigFig(duration, 0) + 'ms' : // 999ms
38+
duration < 5000 ? sigFig(duration / 1000, 2) + ' seconds' : // 3.04 seconds
39+
duration < 9900 ? sigFig(duration / 1000, 1) + ' seconds' : // 8.2 seconds
40+
sigFig(duration / 1000, 0) + ' seconds'; // 30 seconds

0 commit comments

Comments
 (0)