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
940895ae
Commit
940895ae
authored
Jun 09, 2010
by
Brickner_cp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HTTP
parent
ed97ea2a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
212 additions
and
39 deletions
+212
-39
IListExtensions.cs
PcapDotNet/src/PcapDotNet.Base/IListExtensions.cs
+8
-0
HttpDatagram.cs
PcapDotNet/src/PcapDotNet.Packets/Http/HttpDatagram.cs
+204
-39
No files found.
PcapDotNet/src/PcapDotNet.Base/IListExtensions.cs
View file @
940895ae
using
System
;
using
System.Collections.Generic
;
using
System.Collections.ObjectModel
;
...
...
@@ -20,5 +21,12 @@ namespace PcapDotNet.Base
{
return
new
ReadOnlyCollection
<
T
>(
list
);
}
public
static
IEnumerable
<
T
>
Range
<
T
>(
this
IList
<
T
>
list
,
int
offset
,
int
count
)
{
int
length
=
Math
.
Min
(
offset
+
count
,
list
.
Count
);
for
(
int
i
=
offset
;
i
<
length
;
++
i
)
yield
return
list
[
i
];
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Packets/Http/HttpDatagram.cs
View file @
940895ae
using
System
;
using
System.Collections.Generic
;
using
PcapDotNet.Base
;
using
System.Linq
;
using
System.Text
;
...
...
@@ -167,83 +169,242 @@ namespace PcapDotNet.Packets.Http
/// entity-body := Content-Encoding( Content-Type( data ) )
/// </pre>
/// </summary>
public
abstract
class
Http
StartLine
Datagram
:
Datagram
public
abstract
class
HttpDatagram
:
Datagram
{
private
static
readonly
byte
[]
_httpSlash
=
Encoding
.
ASCII
.
GetBytes
(
"HTTP/"
);
// public HttpHeaderDatagram Header
// {
// get {return }
// }
public
abstract
bool
IsRequest
{
get
;
}
public
bool
IsResponse
{
get
{
return
!
IsRequest
;
}
}
public
HttpHeader
Header
{
get
{
if
(
_header
==
null
)
_header
=
new
HttpHeader
(
Buffer
,
StartOffset
+
HeaderOffset
,
Length
-
HeaderOffset
);
return
_header
;
}
}
internal
HttpStartLineDatagram
CreateDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
protected
abstract
int
HeaderOffset
{
get
;
}
internal
HttpDatagram
CreateDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
if
(
length
>=
_httpSlash
.
Length
&&
buffer
.
SequenceEqual
(
offset
,
_httpSlash
,
0
,
_httpSlash
.
Length
))
return
new
HttpResponse
StartLine
Datagram
(
buffer
,
offset
,
length
);
return
new
HttpRequest
StartLine
Datagram
(
buffer
,
offset
,
length
);
return
new
HttpResponseDatagram
(
buffer
,
offset
,
length
);
return
new
HttpRequestDatagram
(
buffer
,
offset
,
length
);
}
internal
Http
StartLine
Datagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
internal
HttpDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
{
}
private
static
readonly
byte
[]
_httpSlash
=
Encoding
.
ASCII
.
GetBytes
(
"HTTP/"
);
private
HttpHeader
_header
;
}
public
class
Http
RequestStartLineDatagram
:
HttpStartLineDatagram
public
class
Http
Header
{
internal
HttpRequestStartLineDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
private
class
Parser
{
public
Parser
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
_buffer
=
buffer
;
_offset
=
offset
;
_totalLength
=
offset
+
length
;
Success
=
offset
>=
0
&&
length
>=
0
&&
offset
+
length
<=
buffer
.
Length
;
}
public
bool
Success
{
get
;
private
set
;}
public
Parser
Token
(
out
string
token
)
{
if
(!
Success
)
{
token
=
null
;
return
this
;
}
int
tokenLength
=
Range
.
TakeWhile
(
value
=>
value
.
IsToken
()).
Count
();
if
(
tokenLength
==
0
)
{
token
=
null
;
return
Fail
();
}
token
=
Encoding
.
ASCII
.
GetString
(
_buffer
,
_offset
,
tokenLength
);
_offset
+=
token
.
Length
;
return
this
;
}
public
Parser
Colon
()
{
if
(!
Success
)
return
this
;
if
(
Range
.
First
()
!=
AsciiBytes
.
Colon
)
return
Fail
();
++
_offset
;
return
this
;
}
public
Parser
FieldValue
()
{
if
(!
Success
)
return
this
;
throw
new
NotImplementedException
();
// SkipLws();
// while (Success)
// {
//
// }
}
private
Parser
Fail
()
{
Success
=
false
;
return
this
;
}
private
IEnumerable
<
byte
>
Range
{
get
{
return
_buffer
.
Range
(
_offset
,
_totalLength
-
_offset
);}
}
private
readonly
byte
[]
_buffer
;
private
int
_offset
;
private
readonly
int
_totalLength
;
}
}
public
class
HttpResponseStartLineDatagram
:
HttpStartLineDatagram
{
internal
HttpResponseStartLineDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
internal
HttpHeader
(
byte
[]
buffer
,
int
offset
,
int
length
)
{
Parser
parser
=
new
Parser
(
buffer
,
offset
,
length
);
string
fieldName
;
parser
.
Token
(
out
fieldName
).
Colon
().
FieldValue
();
// int totalLength = offset + length;
// Datagram data = new Datagram(buffer, offset, totalLength - offset);
// Parse field-name = token
// string fieldName;
// if (!TryParseToken(buffer, offset, totalLength - offset, out fieldName))
// return;
// offset += fieldName.Length;
// data = new Datagram(buffer, offset, totalLength - offset);
// Parse ":"
// if (data.FirstOrDefault() != AsciiBytes.Colon)
// return;
//
// ++offset;
// Parse field-value
// if (!TryParseFieldValue(buffer, offset, totalLength - offset))
// return;
// data = new Datagram(buffer, offset, totalLength - offset);
// Parse field-value = *( field-content | LWS )
// IEnumerable<byte> fieldValue = new byte[0];
//
// int lwsCount = data.CountLinearWhiteSpaces();
// if (lwsCount != 0)
// {
// offset += lwsCount;
// data = new Datagram(buffer, offset, totalLength - offset);
// }
//
// int fieldContentCount;
// IEnumerable<byte> fieldContent = data.TakeFieldContent(out fieldContentCount);
//
// if (fieldContentCount != 0)
// {
// if (fieldValue.Any())
// fieldValue = fieldValue.Concat(AsciiBytes.Space);
// fieldValue = fieldValue.Concat(fieldContent);
// offset += fieldContentCount;
// }
// data.SkipWhile
// buffer..Take(count).TakeWhile(value => value.IsToken()).Count))
// Encoding.ASCII.GetString()
}
// private HttpHeaderPart _generalHeader;
// private HttpHeaderPart _requestHeader;
// private HttpHeaderPart _responseHeader;
// private HttpHeaderPart _entityHeader;
// private Dictionary<string, >
}
public
class
Http
HeaderDatagram
:
Datagram
public
class
Http
RequestDatagram
:
Http
Datagram
{
internal
Http
Header
Datagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
internal
Http
Request
Datagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
{
}
// public HttpEntityBodyDatagram EntityBody { get;}
}
public
class
HttpEntityBodyDatagram
:
Datagram
{
internal
HttpEntityBodyDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
public
override
bool
IsRequest
{
get
{
return
true
;
}
}
// public HttpMessageBodyDatagram MessageBody { get;}
}
public
class
HttpMessageBodyDatagram
:
Datagram
{
internal
HttpMessageBodyDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
protected
override
int
HeaderOffset
{
get
{
throw
new
NotImplementedException
();
}
}
}
public
class
HttpRe
questHeaderDatagram
:
HttpHeader
Datagram
public
class
HttpRe
sponseDatagram
:
Http
Datagram
{
internal
HttpRe
questHeader
Datagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
internal
HttpRe
sponse
Datagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
{
}
public
override
bool
IsRequest
{
get
{
return
false
;
}
}
protected
override
int
HeaderOffset
{
get
{
throw
new
NotImplementedException
();
}
}
}
public
class
HttpResponseHeaderDatagram
:
HttpHeaderDatagram
internal
static
class
IEnumerableExtensions
{
internal
HttpResponseHeaderDatagram
(
byte
[]
buffer
,
int
offset
,
int
length
)
:
base
(
buffer
,
offset
,
length
)
public
static
int
CountLinearWhiteSpaces
(
this
IEnumerable
<
byte
>
sequence
)
{
int
count
=
0
;
while
(
true
)
{
byte
first
=
sequence
.
FirstOrDefault
();
if
(
first
==
AsciiBytes
.
CarriageReturn
)
// CR
{
IEnumerable
<
byte
>
skippedSequence
=
sequence
.
Skip
(
1
);
if
(
skippedSequence
.
FirstOrDefault
()
==
AsciiBytes
.
LineFeed
)
// CRLF
{
skippedSequence
=
skippedSequence
.
Skip
(
1
);
if
(
skippedSequence
.
FirstOrDefault
().
IsSpaceOrHorizontalTab
())
// CRLF ( SP | HT )
{
sequence
=
skippedSequence
.
Skip
(
1
);
count
+=
3
;
}
else
// CRLF without ( SP | HT )
return
count
;
}
else
// CR without LF
return
count
;
}
else
if
(
first
.
IsSpaceOrHorizontalTab
())
// ( SP | HT )
{
++
count
;
sequence
=
sequence
.
Skip
(
1
);
}
else
// Doesn't start with ( CR | SP | HT )
return
count
;
}
}
}
...
...
@@ -283,7 +444,6 @@ namespace PcapDotNet.Packets.Http
internal
static
class
ByteExtensions
{
// CHAR
public
static
bool
IsChar
(
this
byte
value
)
{
...
...
@@ -322,6 +482,11 @@ namespace PcapDotNet.Packets.Http
value
.
IsDigit
();
}
public
static
bool
IsSpaceOrHorizontalTab
(
this
byte
value
)
{
return
value
==
AsciiBytes
.
Space
||
value
==
AsciiBytes
.
HorizontalTab
;
}
// CTL
public
static
bool
IsControl
(
this
byte
value
)
{
...
...
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