4
4
* GPLv3 licensed, see LICENSE for full text
5
5
* Commercial licensing available
6
6
*/
7
- using System . Collections . Generic ;
8
- using System . Reflection ;
9
- using SharpPcap ;
10
- using SharpPcap . LibPcap ;
7
+ using log4net ;
11
8
using PacketDotNet ;
12
9
using PacketDotNet . Connections ;
13
10
using PacketDotNet . Connections . Http ;
14
- using log4net ;
11
+ using SharpPcap ;
12
+ using SharpPcap . LibPcap ;
13
+ using System . Collections . Generic ;
14
+ using System . Reflection ;
15
15
using Xunit ;
16
16
17
17
namespace Test
18
18
{
19
19
public class HttpSessionWatcherTests
20
20
{
21
- private static readonly log4net . ILog log = log4net . LogManager . GetLogger ( System . Reflection . MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
21
+ private static readonly log4net . ILog log = log4net . LogManager . GetLogger ( System . Reflection . MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
22
22
23
23
private class ExpectedMessageContainer
24
24
{
@@ -63,51 +63,54 @@ private void CheckMessage(HttpMessage httpMessage, ExpectedMessageContainer.Mess
63
63
{
64
64
log . DebugFormat ( "expectedMessageIndex {0}" , expectedMessageIndex ) ;
65
65
66
- if ( expectedMessageIndex > expectedMessages . Count )
66
+ if ( expectedMessageIndex > expectedMessages . Count )
67
67
{
68
68
throw new System . InvalidOperationException ( "expectedMessageIndex "
69
69
+ expectedMessageIndex
70
70
+ " > expectedMessages.Count"
71
71
+ expectedMessages . Count ) ;
72
72
}
73
-
73
+
74
74
ExpectedMessageContainer expectedMessage = expectedMessages [ expectedMessageIndex ] ;
75
-
75
+
76
76
Assert . True ( expectedMessage . messageType == theMessageType , "Message type does not match" ) ;
77
77
78
78
// perform comparisons that are generic to all HttpMessages
79
79
Assert . Equal ( expectedMessage . message . HttpVersion , httpMessage . HttpVersion ) ;
80
80
81
81
// if we expected a zero length body then we expect that
82
82
// the actual message has a null body since it was never set
83
- if ( expectedMessage . message . Body . Length == 0 )
83
+ if ( expectedMessage . message . Body . Length == 0 )
84
84
{
85
85
Assert . True ( httpMessage . Body == null ) ;
86
- } else
86
+ }
87
+ else
87
88
{
88
89
Assert . Equal ( expectedMessage . message . Body . Length , httpMessage . Body . Length ) ;
89
90
}
90
91
91
- if ( theMessageType == ExpectedMessageContainer . MessageTypes . HttpRequest )
92
+ if ( theMessageType == ExpectedMessageContainer . MessageTypes . HttpRequest )
92
93
{
93
94
HttpRequest expected = ( HttpRequest ) expectedMessage . message ;
94
95
HttpRequest request = ( HttpRequest ) httpMessage ;
95
-
96
+
96
97
Assert . Equal ( expected . Url , request . Url ) ;
97
98
Assert . Equal ( expected . Method , request . Method ) ;
98
- } else
99
+ }
100
+ else
99
101
{
100
102
HttpStatus expected = ( HttpStatus ) expectedMessage . message ;
101
103
HttpStatus status = ( HttpStatus ) httpMessage ;
102
-
104
+
103
105
Assert . Equal ( expected . StatusCode , status . StatusCode ) ;
104
106
}
105
-
107
+
106
108
// move to the next message
107
109
expectedMessageIndex ++ ;
108
-
110
+
109
111
log . Debug ( "message matched" ) ;
110
- } catch ( System . Exception e )
112
+ }
113
+ catch ( System . Exception e )
111
114
{
112
115
// catch exceptions because the HttpSessionMonitor code will drop them
113
116
@@ -124,15 +127,15 @@ private void ProcessPackets(ICaptureDevice dev,
124
127
125
128
GetPacketStatus status ;
126
129
PacketCapture e ;
127
- while ( ( status = dev . GetNextPacket ( out e ) ) == GetPacketStatus . PacketRead )
130
+ while ( ( status = dev . GetNextPacket ( out e ) ) == GetPacketStatus . PacketRead )
128
131
{
129
132
var rawCapture = e . GetPacket ( ) ;
130
133
var p = Packet . ParsePacket ( rawCapture . LinkLayerType , rawCapture . Data ) ;
131
134
132
135
var tcpPacket = p . Extract < TcpPacket > ( ) ;
133
136
134
137
// skip non-tcp packets, http is a tcp based protocol
135
- if ( p == null )
138
+ if ( p == null )
136
139
{
137
140
continue ;
138
141
}
@@ -206,13 +209,13 @@ public void TestHttpPostSession()
206
209
status . StatusCode = HttpStatus . StatusCodes . OK_200 ;
207
210
status . HttpVersion = HttpMessage . HttpVersions . Http11 ;
208
211
status . Body = new byte [ 1132 ] ;
209
- expectedMessage . message = status ;
212
+ expectedMessage . message = status ;
210
213
expectedMessages . Add ( expectedMessage ) ;
211
214
212
215
ProcessPackets ( dev , tcpConnectionManager ) ;
213
216
}
214
217
215
- void HandleTcpConnectionManagerOnConnectionFound ( TcpConnection c )
218
+ void HandleTcpConnectionManagerOnConnectionFound ( TcpConnection c )
216
219
{
217
220
var httpSessionWatcher = new HttpSessionWatcher ( c ,
218
221
OnHttpRequestFound ,
@@ -221,6 +224,54 @@ void HandleTcpConnectionManagerOnConnectionFound (TcpConnection c)
221
224
}
222
225
#endif
223
226
227
+ #if true
228
+
229
+ [ Fact ]
230
+ public void TestHttpGetSession ( )
231
+ {
232
+ log4net . Config . XmlConfigurator . Configure ( LogManager . GetRepository ( Assembly . GetCallingAssembly ( ) ) ) ;
233
+
234
+ string captureFilename = "../../../captureFiles/http_get_request_and_response_brotli_compressed.pcap" ;
235
+ var tcpConnectionManager = new TcpConnectionManager ( ) ;
236
+ tcpConnectionManager . OnConnectionFound += HandleTcpConnectionManagerOnConnectionFound ;
237
+
238
+ // open the offline file
239
+ var dev = new CaptureFileReaderDevice ( captureFilename ) ;
240
+ dev . Open ( ) ;
241
+ Assert . True ( dev != null , "failed to open " + captureFilename ) ;
242
+
243
+ // setup the expected events
244
+ ExpectedMessageContainer expectedMessage ;
245
+ HttpRequest request ;
246
+ HttpStatus status ;
247
+ expectedMessages = new List < ExpectedMessageContainer > ( ) ;
248
+
249
+ // GET /api/areaInformation/?requestAction=GetMapMunicipalityList
250
+ expectedMessage = new ExpectedMessageContainer ( ) ;
251
+ expectedMessage . messageType = ExpectedMessageContainer . MessageTypes . HttpRequest ;
252
+ request = new HttpRequest ( ) ;
253
+ request . Url = "/api/areaInformation/?requestAction=GetMapMunicipalityList" ;
254
+ request . Method = HttpRequest . Methods . Get ;
255
+ request . HttpVersion = HttpMessage . HttpVersions . Http11 ;
256
+ request . Body = new byte [ 0 ] ;
257
+ expectedMessage . message = request ;
258
+ expectedMessages . Add ( expectedMessage ) ;
259
+
260
+ // HTTP 1.1 OK
261
+ expectedMessage = new ExpectedMessageContainer ( ) ;
262
+ expectedMessage . messageType = ExpectedMessageContainer . MessageTypes . HttpStatus ;
263
+ status = new HttpStatus ( ) ;
264
+ status . StatusCode = HttpStatus . StatusCodes . OK_200 ;
265
+ status . HttpVersion = HttpMessage . HttpVersions . Http11 ;
266
+ status . Body = new byte [ 8269 ] ;
267
+ expectedMessage . message = status ;
268
+ expectedMessages . Add ( expectedMessage ) ;
269
+
270
+ ProcessPackets ( dev , tcpConnectionManager ) ;
271
+ }
272
+
273
+ #endif
274
+
224
275
#if false
225
276
[ Fact ]
226
277
public void TestHttpGetWithGzippedContent ( )
@@ -295,7 +346,7 @@ public void TestHttpPipelining()
295
346
status . StatusCode = HttpStatus . StatusCodes . OK_200 ;
296
347
status . HttpVersion = HttpMessage . HttpVersions . Http11 ;
297
348
status . Body = new byte [ 1123 ] ;
298
- expectedMessage . message = status ;
349
+ expectedMessage . message = status ;
299
350
expectedMessages . Add ( expectedMessage ) ;
300
351
301
352
// GET /img/menu-secondary.gif
@@ -316,7 +367,7 @@ public void TestHttpPipelining()
316
367
status . StatusCode = HttpStatus . StatusCodes . OK_200 ;
317
368
status . HttpVersion = HttpMessage . HttpVersions . Http11 ;
318
369
status . Body = new byte [ 227 ] ;
319
- expectedMessage . message = status ;
370
+ expectedMessage . message = status ;
320
371
expectedMessages . Add ( expectedMessage ) ;
321
372
322
373
0 commit comments