Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
P
Pcap-Net
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Pcap-Net
Commits
55dce1dd
Commit
55dce1dd
authored
Aug 22, 2010
by
Brickner_cp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HTTP
parent
e18d30c8
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
164 additions
and
176 deletions
+164
-176
HttpDatagram.cs
PcapDotNet/src/PcapDotNet.Packets/Http/HttpDatagram.cs
+64
-121
HttpRequestDatagram.cs
...DotNet/src/PcapDotNet.Packets/Http/HttpRequestDatagram.cs
+48
-24
HttpResponseDatagram.cs
...otNet/src/PcapDotNet.Packets/Http/HttpResponseDatagram.cs
+52
-31
No files found.
PcapDotNet/src/PcapDotNet.Packets/Http/HttpDatagram.cs
View file @
55dce1dd
...
@@ -198,94 +198,85 @@ namespace PcapDotNet.Packets.Http
...
@@ -198,94 +198,85 @@ namespace PcapDotNet.Packets.Http
/// </summary>
/// </summary>
public
abstract
class
HttpDatagram
:
Datagram
public
abstract
class
HttpDatagram
:
Datagram
{
{
internal
class
ParseInfoBase
{
public
int
Length
{
get
;
set
;
}
public
HttpVersion
Version
{
get
;
set
;
}
public
HttpHeader
Header
{
get
;
set
;
}
public
Datagram
Body
{
get
;
set
;
}
}
public
abstract
bool
IsRequest
{
get
;
}
public
abstract
bool
IsRequest
{
get
;
}
public
bool
IsResponse
{
get
{
return
!
IsRequest
;
}
}
public
bool
IsResponse
{
get
{
return
!
IsRequest
;
}
}
public
HttpVersion
Version
public
HttpVersion
Version
{
get
;
private
set
;}
public
HttpHeader
Header
{
get
;
private
set
;}
public
Datagram
Body
{
get
;
private
set
;
}
internal
static
HttpDatagram
CreateDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
{
get
if
(
length
>=
_httpSlash
.
Length
&&
buffer
.
SequenceEqual
(
offset
,
_httpSlash
,
0
,
_httpSlash
.
Length
))
{
return
new
HttpResponseDatagram
(
buffer
,
offset
,
length
);
ParseFirstLine
();
return
new
HttpRequestDatagram
(
buffer
,
offset
,
length
);
return
_version
;
}
}
}
public
HttpHeader
Header
internal
HttpDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
,
HttpVersion
version
,
HttpHeader
header
,
Datagram
body
)
:
base
(
buffer
,
offset
,
length
)
{
{
get
Version
=
version
;
{
Header
=
header
;
ParseHeader
();
Body
=
body
;
return
_header
;
}
}
}
public
Datagram
Body
internal
static
Datagram
ParseBody
(
byte
[]
buffer
,
int
offset
,
int
length
,
bool
isBodyPossible
,
HttpHeader
header
)
{
{
get
if
(!
isBodyPossible
)
{
return
Empty
;
if
(
_body
==
null
)
{
ParseHeader
();
if
(
_bodyOffset
!=
null
)
{
int
bodyOffsetValue
=
_bodyOffset
.
Value
;
if
(!
IsBodyPossible
)
{
_body
=
Empty
;
return
_body
;
}
HttpTransferEncodingField
transferEncodingField
=
Header
.
TransferEncoding
;
if
(
transferEncodingField
!=
null
)
{
if
(
transferEncodingField
.
TransferCodings
.
Any
(
coding
=>
coding
!=
"identity"
))
{
_body
=
ReadChunked
();
return
_body
;
}
}
HttpContentLengthField
contentLengthField
=
Header
.
ContentLength
;
HttpTransferEncodingField
transferEncodingField
=
header
.
TransferEncoding
;
if
(
contentLengthField
!=
null
)
if
(
transferEncodingField
!=
null
)
{
{
uint
?
contentLength
=
contentLengthField
.
ContentLength
;
if
(
transferEncodingField
.
TransferCodings
.
Any
(
coding
=>
coding
!=
"identity"
))
if
(
contentLength
!=
null
)
return
ParseChunkedBody
(
buffer
,
offset
,
length
);
{
}
_body
=
new
Datagram
(
Buffer
,
StartOffset
+
bodyOffsetValue
,
Math
.
Min
((
int
)
contentLength
.
Value
,
Length
-
bodyOffsetValue
));
return
_body
;
}
}
HttpContentTypeField
contentTypeField
=
Header
.
ContentType
;
HttpContentLengthField
contentLengthField
=
header
.
ContentLength
;
if
(
contentTypeField
!=
null
)
if
(
contentLengthField
!=
null
)
{
{
if
(
contentTypeField
.
MediaType
==
"multipart"
&&
uint
?
contentLength
=
contentLengthField
.
ContentLength
;
contentTypeField
.
MediaSubType
==
"byteranges"
)
if
(
contentLength
!=
null
)
{
return
new
Datagram
(
buffer
,
offset
,
Math
.
Min
((
int
)
contentLength
.
Value
,
length
));
string
boundary
=
contentTypeField
.
Parameters
[
"boundary"
];
}
if
(
boundary
!=
null
)
{
byte
[]
lastBoundaryBuffer
=
Encoding
.
ASCII
.
GetBytes
(
string
.
Format
(
"--{0}--\r\n"
,
boundary
));
int
lastBoundaryOffset
=
Buffer
.
Find
(
StartOffset
+
bodyOffsetValue
,
Length
-
bodyOffsetValue
,
lastBoundaryBuffer
);
int
lastBoundaryEnd
=
lastBoundaryOffset
+
lastBoundaryBuffer
.
Length
;
_body
=
new
Datagram
(
Buffer
,
StartOffset
+
bodyOffsetValue
,
Math
.
Min
(
lastBoundaryEnd
-
StartOffset
-
bodyOffsetValue
,
Length
-
bodyOffsetValue
));
return
_body
;
}
}
}
_body
=
new
Datagram
(
Buffer
,
StartOffset
+
bodyOffsetValue
,
Length
-
bodyOffsetValue
);
HttpContentTypeField
contentTypeField
=
header
.
ContentType
;
if
(
contentTypeField
!=
null
)
{
if
(
contentTypeField
.
MediaType
==
"multipart"
&&
contentTypeField
.
MediaSubType
==
"byteranges"
)
{
string
boundary
=
contentTypeField
.
Parameters
[
"boundary"
];
if
(
boundary
!=
null
)
{
byte
[]
lastBoundaryBuffer
=
Encoding
.
ASCII
.
GetBytes
(
string
.
Format
(
"--{0}--\r\n"
,
boundary
));
int
lastBoundaryOffset
=
buffer
.
Find
(
offset
,
length
,
lastBoundaryBuffer
);
int
lastBoundaryEnd
=
lastBoundaryOffset
+
lastBoundaryBuffer
.
Length
;
return
new
Datagram
(
buffer
,
offset
,
Math
.
Min
(
lastBoundaryEnd
-
offset
,
length
));
}
}
}
}
return
_body
;
}
}
return
new
Datagram
(
buffer
,
offset
,
length
);
}
}
private
Datagram
ReadChunked
(
)
private
static
Datagram
ParseChunkedBody
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
{
List
<
Datagram
>
contentData
=
new
List
<
Datagram
>();
List
<
Datagram
>
contentData
=
new
List
<
Datagram
>();
HttpParser
parser
=
new
HttpParser
(
Buffer
,
StartOffset
+
_bodyOffset
.
Value
,
Length
-
_bodyOffset
.
Value
);
HttpParser
parser
=
new
HttpParser
(
buffer
,
offset
,
length
);
uint
?
chunkSize
;
uint
?
chunkSize
;
while
(
parser
.
HexadecimalNumber
(
out
chunkSize
).
SkipChunkExtensions
().
CarriageReturnLineFeed
().
Success
)
while
(
parser
.
HexadecimalNumber
(
out
chunkSize
).
SkipChunkExtensions
().
CarriageReturnLineFeed
().
Success
)
{
{
...
@@ -293,13 +284,13 @@ namespace PcapDotNet.Packets.Http
...
@@ -293,13 +284,13 @@ namespace PcapDotNet.Packets.Http
if
(
chunkSizeValue
==
0
)
if
(
chunkSizeValue
==
0
)
{
{
int
?
endOffset
;
int
?
endOffset
;
HttpHeader
trailerHeader
=
new
HttpHeader
(
GetHeaderFields
(
out
endOffset
,
Buffer
,
parser
.
Offset
,
B
uffer
.
Length
-
parser
.
Offset
));
HttpHeader
trailerHeader
=
new
HttpHeader
(
GetHeaderFields
(
out
endOffset
,
buffer
,
parser
.
Offset
,
b
uffer
.
Length
-
parser
.
Offset
));
parser
.
CarriageReturnLineFeed
();
parser
.
CarriageReturnLineFeed
();
break
;
break
;
}
}
int
actualChunkSize
=
(
int
)
Math
.
Min
(
chunkSizeValue
,
B
uffer
.
Length
-
parser
.
Offset
);
int
actualChunkSize
=
(
int
)
Math
.
Min
(
chunkSizeValue
,
b
uffer
.
Length
-
parser
.
Offset
);
contentData
.
Add
(
new
Datagram
(
B
uffer
,
parser
.
Offset
,
actualChunkSize
));
contentData
.
Add
(
new
Datagram
(
b
uffer
,
parser
.
Offset
,
actualChunkSize
));
parser
.
Skip
(
actualChunkSize
);
parser
.
Skip
(
actualChunkSize
);
parser
.
CarriageReturnLineFeed
();
parser
.
CarriageReturnLineFeed
();
}
}
...
@@ -314,58 +305,10 @@ namespace PcapDotNet.Packets.Http
...
@@ -314,58 +305,10 @@ namespace PcapDotNet.Packets.Http
}
}
Datagram
content
=
new
Datagram
(
contentBuffer
);
Datagram
content
=
new
Datagram
(
contentBuffer
);
return
new
Datagram
(
Buffer
,
StartOffset
+
_bodyOffset
.
Value
,
parser
.
Offset
-
StartOffset
);
return
new
Datagram
(
buffer
,
offset
,
parser
.
Offset
-
offset
);
}
protected
abstract
bool
IsBodyPossible
{
get
;
}
internal
static
HttpDatagram
CreateDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
if
(
length
>=
_httpSlash
.
Length
&&
buffer
.
SequenceEqual
(
offset
,
_httpSlash
,
0
,
_httpSlash
.
Length
))
return
new
HttpResponseDatagram
(
buffer
,
offset
,
length
);
return
new
HttpRequestDatagram
(
buffer
,
offset
,
length
);
}
internal
HttpDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
{
}
internal
void
ParseFirstLine
()
{
if
(
_isParsedFirstLine
)
return
;
_isParsedFirstLine
=
true
;
ParseSpecificFirstLine
(
out
_version
,
out
_headerOffset
);
}
internal
abstract
void
ParseSpecificFirstLine
(
out
HttpVersion
version
,
out
int
?
headerOffset
);
private
void
ParseHeader
()
{
if
(
_isParsedHeader
)
return
;
_isParsedHeader
=
true
;
ParseFirstLine
();
if
(
_headerOffset
==
null
)
return
;
_header
=
new
HttpHeader
(
GetHeaderFields
());
}
private
List
<
KeyValuePair
<
string
,
IEnumerable
<
byte
>>>
GetHeaderFields
()
{
int
headerOffsetValue
=
_headerOffset
.
Value
;
int
?
endOffset
;
var
result
=
GetHeaderFields
(
out
endOffset
,
Buffer
,
StartOffset
+
headerOffsetValue
,
Length
-
headerOffsetValue
);
if
(
endOffset
!=
null
)
_bodyOffset
=
endOffset
.
Value
-
StartOffset
;
return
result
;
}
}
private
static
List
<
KeyValuePair
<
string
,
IEnumerable
<
byte
>>>
GetHeaderFields
(
out
int
?
endOffset
,
byte
[]
buffer
,
int
offset
,
int
length
)
internal
static
List
<
KeyValuePair
<
string
,
IEnumerable
<
byte
>>>
GetHeaderFields
(
out
int
?
endOffset
,
byte
[]
buffer
,
int
offset
,
int
length
)
{
{
endOffset
=
null
;
endOffset
=
null
;
var
headerFields
=
new
List
<
KeyValuePair
<
string
,
IEnumerable
<
byte
>>>();
var
headerFields
=
new
List
<
KeyValuePair
<
string
,
IEnumerable
<
byte
>>>();
...
...
PcapDotNet/src/PcapDotNet.Packets/Http/HttpRequestDatagram.cs
View file @
55dce1dd
...
@@ -4,9 +4,10 @@ namespace PcapDotNet.Packets.Http
...
@@ -4,9 +4,10 @@ namespace PcapDotNet.Packets.Http
{
{
public
class
HttpRequestDatagram
:
HttpDatagram
public
class
HttpRequestDatagram
:
HttpDatagram
{
{
internal
HttpRequestDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
private
class
ParseInfo
:
ParseInfoBase
:
base
(
buffer
,
offset
,
length
)
{
{
public
string
Method
{
get
;
set
;
}
public
string
Uri
{
get
;
set
;
}
}
}
public
override
bool
IsRequest
public
override
bool
IsRequest
...
@@ -14,37 +15,60 @@ namespace PcapDotNet.Packets.Http
...
@@ -14,37 +15,60 @@ namespace PcapDotNet.Packets.Http
get
{
return
true
;
}
get
{
return
true
;
}
}
}
public
string
Method
public
string
Method
{
get
;
private
set
;
}
public
string
Uri
{
get
;
private
set
;
}
internal
HttpRequestDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
this
(
buffer
,
offset
,
Parse
(
buffer
,
offset
,
length
))
{
{
get
{
ParseFirstLine
();
return
_method
;
}
}
}
public
string
Uri
private
HttpRequestDatagram
(
byte
[]
buffer
,
int
offset
,
ParseInfo
parseInfo
)
:
base
(
buffer
,
offset
,
parseInfo
.
Length
,
parseInfo
.
Version
,
parseInfo
.
Header
,
parseInfo
.
Body
)
{
{
get
Method
=
parseInfo
.
Method
;
{
Uri
=
parseInfo
.
Uri
;
ParseFirstLine
();
return
_uri
;
}
}
}
pr
otected
override
bool
IsBodyPossible
pr
ivate
static
ParseInfo
Parse
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
{
get
{
return
Header
.
ContentLength
!=
null
;
}
// First Line
HttpParser
parser
=
new
HttpParser
(
buffer
,
offset
,
length
);
string
method
;
string
uri
;
HttpVersion
version
;
parser
.
Token
(
out
method
).
Space
().
RequestUri
(
out
uri
).
Space
().
Version
(
out
version
).
CarriageReturnLineFeed
();
ParseInfo
parseInfo
=
new
ParseInfo
{
Length
=
length
,
Version
=
version
,
Method
=
method
,
Uri
=
uri
,
};
if
(!
parser
.
Success
)
return
parseInfo
;
int
firstLineLength
=
parser
.
Offset
-
offset
;
// Header
int
?
endHeaderOffset
;
HttpHeader
header
=
new
HttpHeader
(
GetHeaderFields
(
out
endHeaderOffset
,
buffer
,
offset
+
firstLineLength
,
length
-
firstLineLength
));
parseInfo
.
Header
=
header
;
if
(
endHeaderOffset
==
null
)
return
parseInfo
;
int
headerLength
=
endHeaderOffset
.
Value
-
offset
-
firstLineLength
;
// Body
Datagram
body
=
ParseBody
(
buffer
,
offset
+
firstLineLength
+
headerLength
,
length
-
firstLineLength
-
headerLength
,
IsBodyPossible
(
header
),
header
);
parseInfo
.
Body
=
body
;
parseInfo
.
Length
=
firstLineLength
+
headerLength
+
body
.
Length
;
return
parseInfo
;
}
}
internal
override
void
ParseSpecificFirstLine
(
out
HttpVersion
version
,
out
int
?
headerOffset
)
private
static
bool
IsBodyPossible
(
HttpHeader
header
)
{
{
HttpParser
parser
=
new
HttpParser
(
Buffer
,
StartOffset
,
Length
);
return
header
.
ContentLength
!=
null
;
parser
.
Token
(
out
_method
).
Space
().
RequestUri
(
out
_uri
).
Space
().
Version
(
out
version
).
CarriageReturnLineFeed
();
headerOffset
=
parser
.
Success
?
(
int
?)(
parser
.
Offset
-
StartOffset
)
:
null
;
}
}
private
string
_uri
;
private
string
_method
;
}
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Packets/Http/HttpResponseDatagram.cs
View file @
55dce1dd
...
@@ -5,9 +5,10 @@ namespace PcapDotNet.Packets.Http
...
@@ -5,9 +5,10 @@ namespace PcapDotNet.Packets.Http
{
{
public
class
HttpResponseDatagram
:
HttpDatagram
public
class
HttpResponseDatagram
:
HttpDatagram
{
{
internal
HttpResponseDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
private
class
ParseInfo
:
ParseInfoBase
:
base
(
buffer
,
offset
,
length
)
{
{
public
Datagram
ReasonPhrase
{
get
;
set
;
}
public
uint
?
StatusCode
{
get
;
set
;}
}
}
public
override
bool
IsRequest
public
override
bool
IsRequest
...
@@ -15,45 +16,65 @@ namespace PcapDotNet.Packets.Http
...
@@ -15,45 +16,65 @@ namespace PcapDotNet.Packets.Http
get
{
return
false
;
}
get
{
return
false
;
}
}
}
public
uint
?
StatusCode
public
uint
?
StatusCode
{
get
;
private
set
;}
public
Datagram
ReasonPhrase
{
get
;
private
set
;}
internal
HttpResponseDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
this
(
buffer
,
offset
,
Parse
(
buffer
,
offset
,
length
))
{
{
get
{
ParseFirstLine
();
return
_statusCode
;
}
}
}
public
Datagram
ReasonPhrase
private
HttpResponseDatagram
(
byte
[]
buffer
,
int
offset
,
ParseInfo
parseInfo
)
:
base
(
buffer
,
offset
,
parseInfo
.
Length
,
parseInfo
.
Version
,
parseInfo
.
Header
,
parseInfo
.
Body
)
{
{
get
StatusCode
=
parseInfo
.
StatusCode
;
{
ReasonPhrase
=
parseInfo
.
ReasonPhrase
;
ParseFirstLine
();
return
_reasonPhrase
;
}
}
}
pr
otected
override
bool
IsBodyPossible
pr
ivate
static
ParseInfo
Parse
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
{
get
// First Line
{
HttpParser
parser
=
new
HttpParser
(
buffer
,
offset
,
length
);
uint
statusCodeValue
=
StatusCode
.
Value
;
HttpVersion
version
;
if
(
statusCodeValue
>=
100
&&
statusCodeValue
<=
199
||
statusCodeValue
==
204
||
statusCodeValue
==
205
||
statusCodeValue
==
304
)
uint
?
statusCode
;
return
false
;
Datagram
reasonPhrase
;
// if (IsResponseToHeadRequest)
parser
.
Version
(
out
version
).
Space
().
DecimalNumber
(
3
,
out
statusCode
).
Space
().
ReasonPhrase
(
out
reasonPhrase
).
CarriageReturnLineFeed
();
// return false;
ParseInfo
parseInfo
=
new
ParseInfo
return
true
;
{
}
Length
=
length
,
Version
=
version
,
StatusCode
=
statusCode
,
ReasonPhrase
=
reasonPhrase
};
if
(!
parser
.
Success
)
return
parseInfo
;
int
firstLineLength
=
parser
.
Offset
-
offset
;
// Header
int
?
endHeaderOffset
;
HttpHeader
header
=
new
HttpHeader
(
GetHeaderFields
(
out
endHeaderOffset
,
buffer
,
offset
+
firstLineLength
,
length
-
firstLineLength
));
parseInfo
.
Header
=
header
;
if
(
endHeaderOffset
==
null
)
return
parseInfo
;
int
headerLength
=
endHeaderOffset
.
Value
-
offset
-
firstLineLength
;
// Body
Datagram
body
=
ParseBody
(
buffer
,
offset
+
firstLineLength
+
headerLength
,
length
-
firstLineLength
-
headerLength
,
IsBodyPossible
(
statusCode
.
Value
),
header
);
parseInfo
.
Body
=
body
;
parseInfo
.
Length
=
firstLineLength
+
headerLength
+
body
.
Length
;
return
parseInfo
;
}
}
internal
override
void
ParseSpecificFirstLine
(
out
HttpVersion
version
,
out
int
?
headerOffset
)
private
static
bool
IsBodyPossible
(
uint
statusCode
)
{
{
HttpParser
parser
=
new
HttpParser
(
Buffer
,
StartOffset
,
Length
);
if
(
statusCode
>=
100
&&
statusCode
<=
199
||
statusCode
==
204
||
statusCode
==
205
||
statusCode
==
304
)
parser
.
Version
(
out
version
).
Space
().
DecimalNumber
(
3
,
out
_statusCode
).
Space
().
ReasonPhrase
(
out
_reasonPhrase
).
CarriageReturnLineFeed
();
return
false
;
headerOffset
=
parser
.
Success
?
(
int
?)(
parser
.
Offset
-
StartOffset
)
:
null
;
// if (IsResponseToHeadRequest)
// return false;
return
true
;
}
}
private
uint
?
_statusCode
;
private
Datagram
_reasonPhrase
;
}
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment