summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/HttpDxe
diff options
context:
space:
mode:
Diffstat (limited to 'NetworkPkg/HttpDxe')
-rw-r--r--NetworkPkg/HttpDxe/HttpImpl.c112
-rw-r--r--NetworkPkg/HttpDxe/HttpProto.c10
-rw-r--r--NetworkPkg/HttpDxe/HttpProto.h10
3 files changed, 78 insertions, 54 deletions
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index f70e116f38..17deceb395 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -916,6 +916,7 @@ HttpBodyParserCallback (
IN VOID *Context
)
{
+ HTTP_CALLBACK_DATA *CallbackData;
HTTP_TOKEN_WRAP *Wrap;
UINTN BodyLength;
CHAR8 *Body;
@@ -928,21 +929,18 @@ HttpBodyParserCallback (
return EFI_SUCCESS;
}
- Wrap = (HTTP_TOKEN_WRAP *) Context;
- Body = Wrap->HttpToken->Message->Body;
- BodyLength = Wrap->HttpToken->Message->BodyLength;
+ CallbackData = (HTTP_CALLBACK_DATA *) Context;
+
+ Wrap = (HTTP_TOKEN_WRAP *) (CallbackData->Wrap);
+ Body = CallbackData->ParseData;
+ BodyLength = CallbackData->ParseDataLength;
+
if (Data < Body + BodyLength) {
Wrap->HttpInstance->NextMsg = Data;
} else {
Wrap->HttpInstance->NextMsg = NULL;
}
-
- //
- // Free Tx4Token or Tx6Token since already received corrsponding HTTP response.
- //
- FreePool (Wrap);
-
return EFI_SUCCESS;
}
@@ -1191,7 +1189,7 @@ HttpResponseWorker (
HttpMsg->HeaderCount,
HttpMsg->Headers,
HttpBodyParserCallback,
- (VOID *) ValueInItem,
+ (VOID *) (&HttpInstance->CallbackData),
&HttpInstance->MsgParser
);
if (EFI_ERROR (Status)) {
@@ -1202,18 +1200,28 @@ HttpResponseWorker (
// Check whether we received a complete HTTP message.
//
if (HttpInstance->CacheBody != NULL) {
+ //
+ // Record the CallbackData data.
+ //
+ HttpInstance->CallbackData.Wrap = (VOID *) Wrap;
+ HttpInstance->CallbackData.ParseData = (VOID *) HttpInstance->CacheBody;
+ HttpInstance->CallbackData.ParseDataLength = HttpInstance->CacheLen;
+
+ //
+ // Parse message with CallbackData data.
+ //
Status = HttpParseMessageBody (HttpInstance->MsgParser, HttpInstance->CacheLen, HttpInstance->CacheBody);
if (EFI_ERROR (Status)) {
goto Error2;
}
+ }
- if (HttpIsMessageComplete (HttpInstance->MsgParser)) {
- //
- // Free the MsgParse since we already have a full HTTP message.
- //
- HttpFreeMsgParser (HttpInstance->MsgParser);
- HttpInstance->MsgParser = NULL;
- }
+ if (HttpIsMessageComplete (HttpInstance->MsgParser)) {
+ //
+ // Free the MsgParse since we already have a full HTTP message.
+ //
+ HttpFreeMsgParser (HttpInstance->MsgParser);
+ HttpInstance->MsgParser = NULL;
}
}
@@ -1332,12 +1340,26 @@ HttpResponseWorker (
}
//
- // Check whether we receive a complete HTTP message.
+ // Process the received the body packet.
+ //
+ HttpMsg->BodyLength = MIN (Fragment.Len, (UINT32) HttpMsg->BodyLength);
+
+ CopyMem (HttpMsg->Body, Fragment.Bulk, HttpMsg->BodyLength);
+
+ //
+ // Record the CallbackData data.
+ //
+ HttpInstance->CallbackData.Wrap = (VOID *) Wrap;
+ HttpInstance->CallbackData.ParseData = HttpMsg->Body;
+ HttpInstance->CallbackData.ParseDataLength = HttpMsg->BodyLength;
+
+ //
+ // Parse Body with CallbackData data.
//
Status = HttpParseMessageBody (
HttpInstance->MsgParser,
- (UINTN) Fragment.Len,
- (CHAR8 *) Fragment.Bulk
+ HttpMsg->BodyLength,
+ HttpMsg->Body
);
if (EFI_ERROR (Status)) {
goto Error2;
@@ -1352,46 +1374,28 @@ HttpResponseWorker (
}
//
- // We receive part of header of next HTTP msg.
+ // Check whether there is the next message header in the HttpMsg->Body.
//
if (HttpInstance->NextMsg != NULL) {
- HttpMsg->BodyLength = MIN ((UINTN) HttpInstance->NextMsg - (UINTN) Fragment.Bulk, HttpMsg->BodyLength);
- CopyMem (HttpMsg->Body, Fragment.Bulk, HttpMsg->BodyLength);
-
- HttpInstance->CacheLen = Fragment.Len - HttpMsg->BodyLength;
- if (HttpInstance->CacheLen != 0) {
- if (HttpInstance->CacheBody != NULL) {
- FreePool (HttpInstance->CacheBody);
- }
-
- HttpInstance->CacheBody = AllocateZeroPool (HttpInstance->CacheLen);
- if (HttpInstance->CacheBody == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Error2;
- }
-
- CopyMem (HttpInstance->CacheBody, Fragment.Bulk + HttpMsg->BodyLength, HttpInstance->CacheLen);
- HttpInstance->CacheOffset = 0;
+ HttpMsg->BodyLength = HttpInstance->NextMsg - (CHAR8 *) HttpMsg->Body;
+ }
- HttpInstance->NextMsg = HttpInstance->CacheBody + ((UINTN) HttpInstance->NextMsg - (UINTN) (Fragment.Bulk + HttpMsg->BodyLength));
+ HttpInstance->CacheLen = Fragment.Len - HttpMsg->BodyLength;
+ if (HttpInstance->CacheLen != 0) {
+ if (HttpInstance->CacheBody != NULL) {
+ FreePool (HttpInstance->CacheBody);
}
- } else {
- HttpMsg->BodyLength = MIN (Fragment.Len, (UINT32) HttpMsg->BodyLength);
- CopyMem (HttpMsg->Body, Fragment.Bulk, HttpMsg->BodyLength);
- HttpInstance->CacheLen = Fragment.Len - HttpMsg->BodyLength;
- if (HttpInstance->CacheLen != 0) {
- if (HttpInstance->CacheBody != NULL) {
- FreePool (HttpInstance->CacheBody);
- }
- HttpInstance->CacheBody = AllocateZeroPool (HttpInstance->CacheLen);
- if (HttpInstance->CacheBody == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Error2;
- }
+ HttpInstance->CacheBody = AllocateZeroPool (HttpInstance->CacheLen);
+ if (HttpInstance->CacheBody == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Error2;
+ }
- CopyMem (HttpInstance->CacheBody, Fragment.Bulk + HttpMsg->BodyLength, HttpInstance->CacheLen);
- HttpInstance->CacheOffset = 0;
+ CopyMem (HttpInstance->CacheBody, Fragment.Bulk + HttpMsg->BodyLength, HttpInstance->CacheLen);
+ HttpInstance->CacheOffset = 0;
+ if (HttpInstance->NextMsg != NULL) {
+ HttpInstance->NextMsg = HttpInstance->CacheBody;
}
}
diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 5356cd35c0..94f89f5665 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -197,6 +197,16 @@ HttpTcpReceiveNotifyDpc (
Length = (UINTN) Wrap->TcpWrap.Rx4Data.FragmentTable[0].FragmentLength;
}
+ //
+ // Record the CallbackData data.
+ //
+ HttpInstance->CallbackData.Wrap = (VOID *) Wrap;
+ HttpInstance->CallbackData.ParseData = Wrap->HttpToken->Message->Body;
+ HttpInstance->CallbackData.ParseDataLength = Length;
+
+ //
+ // Parse Body with CallbackData data.
+ //
Status = HttpParseMessageBody (
HttpInstance->MsgParser,
Length,
diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h
index cc6c1eb566..fa57dbfd39 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -91,6 +91,15 @@ typedef struct {
EFI_TLS_SESSION_STATE SessionState;
} TLS_CONFIG_DATA;
+//
+// Callback data for HTTP_PARSER_CALLBACK()
+//
+typedef struct {
+ UINTN ParseDataLength;
+ VOID *ParseData;
+ VOID *Wrap;
+} HTTP_CALLBACK_DATA;
+
typedef struct _HTTP_PROTOCOL {
UINT32 Signature;
EFI_HTTP_PROTOCOL Http;
@@ -149,6 +158,7 @@ typedef struct _HTTP_PROTOCOL {
// HTTP message-body parser.
//
VOID *MsgParser;
+ HTTP_CALLBACK_DATA CallbackData;
EFI_HTTP_VERSION HttpVersion;
UINT32 TimeOutMillisec;