FileAnalysis: improve HTTP integration.

Seems to be working with various examples I tested, now including
multipart/byteranges.
This commit is contained in:
Jon Siwek 2013-03-14 17:05:05 -05:00
parent e0f3713912
commit 31590fbb9b
3 changed files with 40 additions and 9 deletions

View file

@ -45,6 +45,9 @@ HTTP_Entity::HTTP_Entity(HTTP_Message *arg_message, MIME_Entity* parent_entity,
deliver_body = (http_entity_data != 0); deliver_body = (http_entity_data != 0);
encoding = IDENTITY; encoding = IDENTITY;
zip = 0; zip = 0;
is_partial_content = false;
offset = 0;
content_size = -1; // unspecified
} }
void HTTP_Entity::EndOfData() void HTTP_Entity::EndOfData()
@ -195,12 +198,6 @@ void HTTP_Entity::DeliverBody(int len, const char* data, int trailing_CRLF)
} }
else else
DeliverBodyClear(len, data, trailing_CRLF); DeliverBodyClear(len, data, trailing_CRLF);
file_mgr->DataIn(reinterpret_cast<const u_char*>(data), len,
http_message->MyHTTP_Analyzer()->Conn(),
http_message->IsOrig());
// TODO: set size if we have content_length?
// TODO: handle partial content and multipart/byteranges
} }
void HTTP_Entity::DeliverBodyClear(int len, const char* data, int trailing_CRLF) void HTTP_Entity::DeliverBodyClear(int len, const char* data, int trailing_CRLF)
@ -284,6 +281,28 @@ void HTTP_Entity::SubmitData(int len, const char* buf)
{ {
if ( deliver_body ) if ( deliver_body )
MIME_Entity::SubmitData(len, buf); MIME_Entity::SubmitData(len, buf);
if ( is_partial_content )
{
file_mgr->DataIn(reinterpret_cast<const u_char*>(buf), len, offset,
http_message->MyHTTP_Analyzer()->Conn(),
http_message->IsOrig());
offset += len;
if ( content_size >= 0 )
file_mgr->SetSize(content_size,
http_message->MyHTTP_Analyzer()->Conn(),
http_message->IsOrig());
}
else
{
file_mgr->DataIn(reinterpret_cast<const u_char*>(buf), len,
http_message->MyHTTP_Analyzer()->Conn(),
http_message->IsOrig());
if ( content_length >= 0 )
file_mgr->SetSize(content_length,
http_message->MyHTTP_Analyzer()->Conn(),
http_message->IsOrig());
}
} }
void HTTP_Entity::SetPlainDelivery(int64_t length) void HTTP_Entity::SetPlainDelivery(int64_t length)
@ -366,7 +385,14 @@ void HTTP_Entity::SubmitHeader(MIME_Header* h)
DEBUG_MSG("Content-Range length = %"PRId64"\n", len); DEBUG_MSG("Content-Range length = %"PRId64"\n", len);
if ( len > 0 ) if ( len > 0 )
{
if ( instance_length != "*" )
atoi_n(instance_length.size(), instance_length.c_str(), 0, 10,
content_size);
is_partial_content = true;
offset = f;
content_length = len; content_length = len;
}
else else
{ {
http_message->Weird("HTTP_non_positive_content_range"); http_message->Weird("HTTP_non_positive_content_range");
@ -529,6 +555,7 @@ void HTTP_Message::Done(const int interrupted, const char* detail)
} }
MyHTTP_Analyzer()->HTTP_MessageDone(is_orig, this); MyHTTP_Analyzer()->HTTP_MessageDone(is_orig, this);
file_mgr->EndOfFile(MyHTTP_Analyzer()->Conn(), is_orig);
delete_strings(buffers); delete_strings(buffers);
@ -593,8 +620,9 @@ void HTTP_Message::EndEntity(MIME_Entity* entity)
// SubmitAllHeaders (through EndOfData). // SubmitAllHeaders (through EndOfData).
if ( entity == top_level ) if ( entity == top_level )
Done(); Done();
else if ( ! ( current_entity->MIMEContentType() == CONTENT_TYPE_MULTIPART &&
file_mgr->EndOfFile(MyHTTP_Analyzer()->Conn(), is_orig); MyHTTP_Analyzer()->HTTP_ReplyCode() == 206 ) )
file_mgr->EndOfFile(MyHTTP_Analyzer()->Conn(), is_orig);
} }
void HTTP_Message::SubmitHeader(MIME_Header* h) void HTTP_Message::SubmitHeader(MIME_Header* h)

View file

@ -55,6 +55,9 @@ protected:
int deliver_body; int deliver_body;
enum { IDENTITY, GZIP, COMPRESS, DEFLATE } encoding; enum { IDENTITY, GZIP, COMPRESS, DEFLATE } encoding;
ZIP_Analyzer* zip; ZIP_Analyzer* zip;
bool is_partial_content;
uint64_t offset;
int64_t content_size; // total size of content specified by content-range
MIME_Entity* NewChildEntity() { return new HTTP_Entity(http_message, this, 1); } MIME_Entity* NewChildEntity() { return new HTTP_Entity(http_message, this, 1); }

View file

@ -131,7 +131,7 @@ protected:
int GetDataBuffer(); int GetDataBuffer();
void DataOctet(char ch); void DataOctet(char ch);
void DataOctets(int len, const char* data); void DataOctets(int len, const char* data);
void SubmitData(int len, const char* buf); virtual void SubmitData(int len, const char* buf);
virtual void SubmitHeader(MIME_Header* h); virtual void SubmitHeader(MIME_Header* h);
// Submit all headers in member "headers". // Submit all headers in member "headers".