summaryrefslogtreecommitdiffstats
path: root/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
diff options
context:
space:
mode:
Diffstat (limited to 'NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c')
-rw-r--r--NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c369
1 files changed, 200 insertions, 169 deletions
diff --git a/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c b/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
index 134bd72266..509a13cbda 100644
--- a/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
+++ b/NetworkPkg/Library/DxeHttpIoLib/DxeHttpIoLib.c
@@ -26,10 +26,10 @@
VOID
EFIAPI
HttpIoNotifyDpc (
- IN VOID *Context
+ IN VOID *Context
)
{
- *((BOOLEAN *) Context) = TRUE;
+ *((BOOLEAN *)Context) = TRUE;
}
/**
@@ -42,8 +42,8 @@ HttpIoNotifyDpc (
VOID
EFIAPI
HttpIoNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
//
@@ -60,11 +60,11 @@ HttpIoNotify (
**/
VOID
HttpIoDestroyIo (
- IN HTTP_IO *HttpIo
+ IN HTTP_IO *HttpIo
)
{
- EFI_HTTP_PROTOCOL *Http;
- EFI_EVENT Event;
+ EFI_HTTP_PROTOCOL *Http;
+ EFI_EVENT Event;
if (HttpIo == NULL) {
return;
@@ -128,27 +128,27 @@ HttpIoDestroyIo (
**/
EFI_STATUS
HttpIoCreateIo (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller,
- IN UINT8 IpVersion,
- IN HTTP_IO_CONFIG_DATA *ConfigData OPTIONAL,
- IN HTTP_IO_CALLBACK Callback,
- IN VOID *Context,
- OUT HTTP_IO *HttpIo
+ IN EFI_HANDLE Image,
+ IN EFI_HANDLE Controller,
+ IN UINT8 IpVersion,
+ IN HTTP_IO_CONFIG_DATA *ConfigData OPTIONAL,
+ IN HTTP_IO_CALLBACK Callback,
+ IN VOID *Context,
+ OUT HTTP_IO *HttpIo
)
{
- EFI_STATUS Status;
- EFI_HTTP_CONFIG_DATA HttpConfigData;
- EFI_HTTPv4_ACCESS_POINT Http4AccessPoint;
- EFI_HTTPv6_ACCESS_POINT Http6AccessPoint;
- EFI_HTTP_PROTOCOL *Http;
- EFI_EVENT Event;
+ EFI_STATUS Status;
+ EFI_HTTP_CONFIG_DATA HttpConfigData;
+ EFI_HTTPv4_ACCESS_POINT Http4AccessPoint;
+ EFI_HTTPv6_ACCESS_POINT Http6AccessPoint;
+ EFI_HTTP_PROTOCOL *Http;
+ EFI_EVENT Event;
if ((Image == NULL) || (Controller == NULL) || (HttpIo == NULL)) {
return EFI_INVALID_PARAMETER;
}
- if (IpVersion != IP_VERSION_4 && IpVersion != IP_VERSION_6) {
+ if ((IpVersion != IP_VERSION_4) && (IpVersion != IP_VERSION_6)) {
return EFI_UNSUPPORTED;
}
@@ -171,7 +171,7 @@ HttpIoCreateIo (
Status = gBS->OpenProtocol (
HttpIo->Handle,
&gEfiHttpProtocolGuid,
- (VOID **) &Http,
+ (VOID **)&Http,
Image,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
@@ -183,19 +183,19 @@ HttpIoCreateIo (
//
// Init the configuration data and configure the HTTP child.
//
- HttpIo->Image = Image;
- HttpIo->Controller = Controller;
- HttpIo->IpVersion = IpVersion;
- HttpIo->Http = Http;
- HttpIo->Callback = Callback;
- HttpIo->Context = Context;
- HttpIo->Timeout = PcdGet32 (PcdHttpIoTimeout);
+ HttpIo->Image = Image;
+ HttpIo->Controller = Controller;
+ HttpIo->IpVersion = IpVersion;
+ HttpIo->Http = Http;
+ HttpIo->Callback = Callback;
+ HttpIo->Context = Context;
+ HttpIo->Timeout = PcdGet32 (PcdHttpIoTimeout);
if (ConfigData != NULL) {
if (HttpIo->IpVersion == IP_VERSION_4) {
- HttpConfigData.LocalAddressIsIPv6 = FALSE;
- HttpConfigData.HttpVersion = ConfigData->Config4.HttpVersion;
- HttpConfigData.TimeOutMillisec = ConfigData->Config4.RequestTimeOut;
+ HttpConfigData.LocalAddressIsIPv6 = FALSE;
+ HttpConfigData.HttpVersion = ConfigData->Config4.HttpVersion;
+ HttpConfigData.TimeOutMillisec = ConfigData->Config4.RequestTimeOut;
Http4AccessPoint.UseDefaultAddress = ConfigData->Config4.UseDefaultAddress;
Http4AccessPoint.LocalPort = ConfigData->Config4.LocalPort;
@@ -204,10 +204,10 @@ HttpIoCreateIo (
HttpConfigData.AccessPoint.IPv4Node = &Http4AccessPoint;
} else {
HttpConfigData.LocalAddressIsIPv6 = TRUE;
- HttpConfigData.HttpVersion = ConfigData->Config6.HttpVersion;
- HttpConfigData.TimeOutMillisec = ConfigData->Config6.RequestTimeOut;
+ HttpConfigData.HttpVersion = ConfigData->Config6.HttpVersion;
+ HttpConfigData.TimeOutMillisec = ConfigData->Config6.RequestTimeOut;
- Http6AccessPoint.LocalPort = ConfigData->Config6.LocalPort;
+ Http6AccessPoint.LocalPort = ConfigData->Config6.LocalPort;
IP6_COPY_ADDRESS (&Http6AccessPoint.LocalAddress, &ConfigData->Config6.LocalIp);
HttpConfigData.AccessPoint.IPv6Node = &Http6AccessPoint;
}
@@ -231,7 +231,8 @@ HttpIoCreateIo (
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
- HttpIo->ReqToken.Event = Event;
+
+ HttpIo->ReqToken.Event = Event;
HttpIo->ReqToken.Message = &HttpIo->ReqMessage;
Status = gBS->CreateEvent (
@@ -244,7 +245,8 @@ HttpIoCreateIo (
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
- HttpIo->RspToken.Event = Event;
+
+ HttpIo->RspToken.Event = Event;
HttpIo->RspToken.Message = &HttpIo->RspMessage;
//
@@ -260,6 +262,7 @@ HttpIoCreateIo (
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
+
HttpIo->TimeoutEvent = Event;
return EFI_SUCCESS;
@@ -296,14 +299,14 @@ HttpIoSendRequest (
IN VOID *Body
)
{
- EFI_STATUS Status;
- EFI_HTTP_PROTOCOL *Http;
+ EFI_STATUS Status;
+ EFI_HTTP_PROTOCOL *Http;
- if (HttpIo == NULL || HttpIo->Http == NULL) {
+ if ((HttpIo == NULL) || (HttpIo->Http == NULL)) {
return EFI_INVALID_PARAMETER;
}
- HttpIo->ReqToken.Status = EFI_NOT_READY;
+ HttpIo->ReqToken.Status = EFI_NOT_READY;
HttpIo->ReqToken.Message->Data.Request = Request;
HttpIo->ReqToken.Message->HeaderCount = HeaderCount;
HttpIo->ReqToken.Message->Headers = Headers;
@@ -312,10 +315,10 @@ HttpIoSendRequest (
if (HttpIo->Callback != NULL) {
Status = HttpIo->Callback (
- HttpIoRequest,
- HttpIo->ReqToken.Message,
- HttpIo->Context
- );
+ HttpIoRequest,
+ HttpIo->ReqToken.Message,
+ HttpIo->Context
+ );
if (EFI_ERROR (Status)) {
return Status;
}
@@ -324,12 +327,12 @@ HttpIoSendRequest (
//
// Queue the request token to HTTP instances.
//
- Http = HttpIo->Http;
+ Http = HttpIo->Http;
HttpIo->IsTxDone = FALSE;
- Status = Http->Request (
- Http,
- &HttpIo->ReqToken
- );
+ Status = Http->Request (
+ Http,
+ &HttpIo->ReqToken
+ );
if (EFI_ERROR (Status)) {
return Status;
}
@@ -361,33 +364,34 @@ HttpIoSendRequest (
**/
EFI_STATUS
HttpIoRecvResponse (
- IN HTTP_IO *HttpIo,
- IN BOOLEAN RecvMsgHeader,
- OUT HTTP_IO_RESPONSE_DATA *ResponseData
+ IN HTTP_IO *HttpIo,
+ IN BOOLEAN RecvMsgHeader,
+ OUT HTTP_IO_RESPONSE_DATA *ResponseData
)
{
- EFI_STATUS Status;
- EFI_HTTP_PROTOCOL *Http;
+ EFI_STATUS Status;
+ EFI_HTTP_PROTOCOL *Http;
- if (HttpIo == NULL || HttpIo->Http == NULL || ResponseData == NULL) {
+ if ((HttpIo == NULL) || (HttpIo->Http == NULL) || (ResponseData == NULL)) {
return EFI_INVALID_PARAMETER;
}
//
// Queue the response token to HTTP instances.
//
- HttpIo->RspToken.Status = EFI_NOT_READY;
+ HttpIo->RspToken.Status = EFI_NOT_READY;
if (RecvMsgHeader) {
HttpIo->RspToken.Message->Data.Response = &ResponseData->Response;
} else {
HttpIo->RspToken.Message->Data.Response = NULL;
}
- HttpIo->RspToken.Message->HeaderCount = 0;
- HttpIo->RspToken.Message->Headers = NULL;
- HttpIo->RspToken.Message->BodyLength = ResponseData->BodyLength;
- HttpIo->RspToken.Message->Body = ResponseData->Body;
- Http = HttpIo->Http;
+ HttpIo->RspToken.Message->HeaderCount = 0;
+ HttpIo->RspToken.Message->Headers = NULL;
+ HttpIo->RspToken.Message->BodyLength = ResponseData->BodyLength;
+ HttpIo->RspToken.Message->Body = ResponseData->Body;
+
+ Http = HttpIo->Http;
HttpIo->IsRxDone = FALSE;
//
@@ -437,12 +441,13 @@ HttpIoRecvResponse (
}
if ((HttpIo->Callback != NULL) &&
- (HttpIo->RspToken.Status == EFI_SUCCESS || HttpIo->RspToken.Status == EFI_HTTP_ERROR)) {
+ ((HttpIo->RspToken.Status == EFI_SUCCESS) || (HttpIo->RspToken.Status == EFI_HTTP_ERROR)))
+ {
Status = HttpIo->Callback (
- HttpIoResponse,
- HttpIo->RspToken.Message,
- HttpIo->Context
- );
+ HttpIoResponse,
+ HttpIo->RspToken.Message,
+ HttpIo->Context
+ );
if (EFI_ERROR (Status)) {
return Status;
}
@@ -451,7 +456,7 @@ HttpIoRecvResponse (
//
// Store the received data into the wrapper.
//
- ResponseData->Status = HttpIo->RspToken.Status;
+ ResponseData->Status = HttpIo->RspToken.Status;
ResponseData->HeaderCount = HttpIo->RspToken.Message->HeaderCount;
ResponseData->Headers = HttpIo->RspToken.Message->Headers;
ResponseData->BodyLength = HttpIo->RspToken.Message->BodyLength;
@@ -472,20 +477,21 @@ HttpIoRecvResponse (
**/
EFI_STATUS
HttpIoGetContentLength (
- IN UINTN HeaderCount,
- IN EFI_HTTP_HEADER *Headers,
- OUT UINTN *ContentLength
+ IN UINTN HeaderCount,
+ IN EFI_HTTP_HEADER *Headers,
+ OUT UINTN *ContentLength
)
{
- EFI_HTTP_HEADER *Header;
+ EFI_HTTP_HEADER *Header;
Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_CONTENT_LENGTH);
if (Header == NULL) {
return EFI_NOT_FOUND;
}
- return AsciiStrDecimalToUintnS (Header->FieldValue, (CHAR8 **) NULL, ContentLength);
+ return AsciiStrDecimalToUintnS (Header->FieldValue, (CHAR8 **)NULL, ContentLength);
}
+
/**
Send HTTP request in chunks.
@@ -499,21 +505,21 @@ HttpIoGetContentLength (
**/
EFI_STATUS
HttpIoSendChunkedTransfer (
- IN HTTP_IO *HttpIo,
- IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,
- IN EFI_HTTP_MESSAGE *RequestMessage
-)
+ IN HTTP_IO *HttpIo,
+ IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,
+ IN EFI_HTTP_MESSAGE *RequestMessage
+ )
{
- EFI_STATUS Status;
- EFI_HTTP_HEADER *NewHeaders;
- EFI_HTTP_HEADER *ContentLengthHeader;
- UINTN AddNewHeader;
- UINTN HeaderCount;
- CHAR8 *MessageBody;
- UINTN MessageBodyLength;
- UINTN ChunkLength;
- CHAR8 ChunkLengthStr [HTTP_IO_CHUNK_SIZE_STRING_LEN];
- EFI_HTTP_REQUEST_DATA *SentRequestData;
+ EFI_STATUS Status;
+ EFI_HTTP_HEADER *NewHeaders;
+ EFI_HTTP_HEADER *ContentLengthHeader;
+ UINTN AddNewHeader;
+ UINTN HeaderCount;
+ CHAR8 *MessageBody;
+ UINTN MessageBodyLength;
+ UINTN ChunkLength;
+ CHAR8 ChunkLengthStr[HTTP_IO_CHUNK_SIZE_STRING_LEN];
+ EFI_HTTP_REQUEST_DATA *SentRequestData;
AddNewHeader = 0;
NewHeaders = NULL;
@@ -522,75 +528,79 @@ HttpIoSendChunkedTransfer (
MessageBodyLength = 0;
switch (*SendChunkProcess) {
- case HttpIoSendChunkHeaderZeroContent:
+ case HttpIoSendChunkHeaderZeroContent:
ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, RequestMessage->Headers, HTTP_HEADER_CONTENT_LENGTH);
if (ContentLengthHeader == NULL) {
AddNewHeader = 1;
}
- NewHeaders = AllocateZeroPool ((RequestMessage->HeaderCount + AddNewHeader) * sizeof(EFI_HTTP_HEADER));
- CopyMem ((VOID*)NewHeaders, (VOID *)RequestMessage->Headers, RequestMessage->HeaderCount * sizeof (EFI_HTTP_HEADER));
+ NewHeaders = AllocateZeroPool ((RequestMessage->HeaderCount + AddNewHeader) * sizeof (EFI_HTTP_HEADER));
+ CopyMem ((VOID *)NewHeaders, (VOID *)RequestMessage->Headers, RequestMessage->HeaderCount * sizeof (EFI_HTTP_HEADER));
if (AddNewHeader == 0) {
//
// Override content-length to Transfer-Encoding.
//
- ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, NewHeaders, HTTP_HEADER_CONTENT_LENGTH);
- ContentLengthHeader->FieldName = NULL;
+ ContentLengthHeader = HttpFindHeader (RequestMessage->HeaderCount, NewHeaders, HTTP_HEADER_CONTENT_LENGTH);
+ ContentLengthHeader->FieldName = NULL;
ContentLengthHeader->FieldValue = NULL;
} else {
ContentLengthHeader = NewHeaders + RequestMessage->HeaderCount;
}
+
HttpSetFieldNameAndValue (ContentLengthHeader, HTTP_HEADER_TRANSFER_ENCODING, HTTP_HEADER_TRANSFER_ENCODING_CHUNKED);
- HeaderCount = RequestMessage->HeaderCount + AddNewHeader;
+ HeaderCount = RequestMessage->HeaderCount + AddNewHeader;
MessageBodyLength = 0;
- MessageBody = NULL;
- SentRequestData = RequestMessage->Data.Request;
+ MessageBody = NULL;
+ SentRequestData = RequestMessage->Data.Request;
break;
- case HttpIoSendChunkContent:
- HeaderCount = 0;
- NewHeaders = NULL;
+ case HttpIoSendChunkContent:
+ HeaderCount = 0;
+ NewHeaders = NULL;
SentRequestData = NULL;
if (RequestMessage->BodyLength > HTTP_IO_MAX_SEND_PAYLOAD) {
MessageBodyLength = HTTP_IO_MAX_SEND_PAYLOAD;
} else {
MessageBodyLength = RequestMessage->BodyLength;
}
+
AsciiSPrint (
- ChunkLengthStr,
- HTTP_IO_CHUNK_SIZE_STRING_LEN,
- "%x%c%c",
- MessageBodyLength,
- CHUNKED_TRANSFER_CODING_CR,
- CHUNKED_TRANSFER_CODING_LF
- );
+ ChunkLengthStr,
+ HTTP_IO_CHUNK_SIZE_STRING_LEN,
+ "%x%c%c",
+ MessageBodyLength,
+ CHUNKED_TRANSFER_CODING_CR,
+ CHUNKED_TRANSFER_CODING_LF
+ );
ChunkLength = AsciiStrLen (ChunkLengthStr);
MessageBody = AllocatePool (ChunkLength + MessageBodyLength + 2);
if (MessageBody == NULL) {
- DEBUG((DEBUG_ERROR, "Not enough memory for chunk transfer\n"));
+ DEBUG ((DEBUG_ERROR, "Not enough memory for chunk transfer\n"));
return EFI_OUT_OF_RESOURCES;
}
+
//
// Build up the chunk transfer paylaod.
//
CopyMem (MessageBody, ChunkLengthStr, ChunkLength);
CopyMem (MessageBody + ChunkLength, RequestMessage->Body, MessageBodyLength);
- *(MessageBody + ChunkLength + MessageBodyLength) = CHUNKED_TRANSFER_CODING_CR;
+ *(MessageBody + ChunkLength + MessageBodyLength) = CHUNKED_TRANSFER_CODING_CR;
*(MessageBody + ChunkLength + MessageBodyLength + 1) = CHUNKED_TRANSFER_CODING_LF;
//
// Change variables for the next chunk trasnfer.
//
RequestMessage->BodyLength -= MessageBodyLength;
- RequestMessage->Body = (VOID *)((CHAR8 *)RequestMessage->Body + MessageBodyLength);
- MessageBodyLength += (ChunkLength + 2);
+ RequestMessage->Body = (VOID *)((CHAR8 *)RequestMessage->Body + MessageBodyLength);
+ MessageBodyLength += (ChunkLength + 2);
if (RequestMessage->BodyLength == 0) {
*SendChunkProcess = HttpIoSendChunkEndChunk;
}
+
break;
- case HttpIoSendChunkEndChunk:
- HeaderCount = 0;
- NewHeaders = NULL;
+ case HttpIoSendChunkEndChunk:
+ HeaderCount = 0;
+ NewHeaders = NULL;
SentRequestData = NULL;
AsciiSPrint (
ChunkLengthStr,
@@ -601,17 +611,18 @@ HttpIoSendChunkedTransfer (
CHUNKED_TRANSFER_CODING_CR,
CHUNKED_TRANSFER_CODING_LF
);
- MessageBody = AllocatePool (AsciiStrLen(ChunkLengthStr));
+ MessageBody = AllocatePool (AsciiStrLen (ChunkLengthStr));
if (MessageBody == NULL) {
- DEBUG((DEBUG_ERROR, "Not enough memory for the end chunk transfer\n"));
+ DEBUG ((DEBUG_ERROR, "Not enough memory for the end chunk transfer\n"));
return EFI_OUT_OF_RESOURCES;
}
+
CopyMem (MessageBody, ChunkLengthStr, AsciiStrLen (ChunkLengthStr));
MessageBodyLength = AsciiStrLen (ChunkLengthStr);
*SendChunkProcess = HttpIoSendChunkFinish;
break;
- default:
+ default:
return EFI_INVALID_PARAMETER;
}
@@ -627,16 +638,20 @@ HttpIoSendChunkedTransfer (
if (ContentLengthHeader->FieldName != NULL) {
FreePool (ContentLengthHeader->FieldName);
}
+
if (ContentLengthHeader->FieldValue != NULL) {
FreePool (ContentLengthHeader->FieldValue);
}
}
+
if (NewHeaders != NULL) {
FreePool (NewHeaders);
}
+
if (MessageBody != NULL) {
FreePool (MessageBody);
}
+
return Status;
}
@@ -661,30 +676,30 @@ HttpIoSendChunkedTransfer (
**/
EFI_STATUS
HttpIoGetChunkedTransferContent (
- IN HTTP_IO *HttpIo,
- IN UINTN HeaderCount,
- IN EFI_HTTP_HEADER *Headers,
- OUT LIST_ENTRY **ChunkListHead,
- OUT UINTN *ContentLength
+ IN HTTP_IO *HttpIo,
+ IN UINTN HeaderCount,
+ IN EFI_HTTP_HEADER *Headers,
+ OUT LIST_ENTRY **ChunkListHead,
+ OUT UINTN *ContentLength
)
{
- EFI_HTTP_HEADER *Header;
- CHAR8 ChunkSizeAscii [256];
- EFI_STATUS Status;
- UINTN Index;
- HTTP_IO_RESPONSE_DATA ResponseData;
- UINTN TotalLength;
- UINTN MaxTotalLength;
- LIST_ENTRY *HttpChunks;
- HTTP_IO_CHUNKS *ThisChunk;
- LIST_ENTRY *ThisListEntry;
-
- if (ChunkListHead == NULL || ContentLength == NULL) {
+ EFI_HTTP_HEADER *Header;
+ CHAR8 ChunkSizeAscii[256];
+ EFI_STATUS Status;
+ UINTN Index;
+ HTTP_IO_RESPONSE_DATA ResponseData;
+ UINTN TotalLength;
+ UINTN MaxTotalLength;
+ LIST_ENTRY *HttpChunks;
+ HTTP_IO_CHUNKS *ThisChunk;
+ LIST_ENTRY *ThisListEntry;
+
+ if ((ChunkListHead == NULL) || (ContentLength == NULL)) {
return EFI_INVALID_PARAMETER;
}
*ContentLength = 0;
- Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_TRANSFER_ENCODING);
+ Header = HttpFindHeader (HeaderCount, Headers, HTTP_HEADER_TRANSFER_ENCODING);
if (Header == NULL) {
return EFI_NOT_FOUND;
}
@@ -692,30 +707,33 @@ HttpIoGetChunkedTransferContent (
if (AsciiStrCmp (Header->FieldValue, HTTP_HEADER_TRANSFER_ENCODING_CHUNKED) != 0) {
return EFI_NOT_FOUND;
}
+
//
// Loop to get all chunks.
//
- TotalLength = 0;
+ TotalLength = 0;
MaxTotalLength = PcdGet32 (PcdMaxHttpChunkTransfer);
- HttpChunks = (LIST_ENTRY *)AllocateZeroPool (sizeof (LIST_ENTRY));
+ HttpChunks = (LIST_ENTRY *)AllocateZeroPool (sizeof (LIST_ENTRY));
if (HttpChunks == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ExitDeleteChunks;
}
+
InitializeListHead (HttpChunks);
DEBUG ((DEBUG_INFO, " Chunked transfer\n"));
while (TRUE) {
- ZeroMem((VOID *)&ResponseData, sizeof(HTTP_IO_RESPONSE_DATA));
+ ZeroMem ((VOID *)&ResponseData, sizeof (HTTP_IO_RESPONSE_DATA));
ResponseData.BodyLength = HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH;
- ResponseData.Body = ChunkSizeAscii;
- Status = HttpIoRecvResponse (
- HttpIo,
- FALSE,
- &ResponseData
- );
+ ResponseData.Body = ChunkSizeAscii;
+ Status = HttpIoRecvResponse (
+ HttpIo,
+ FALSE,
+ &ResponseData
+ );
if (EFI_ERROR (Status)) {
goto ExitDeleteChunks;
}
+
//
// Decoding Chunked Transfer Coding.
// Only decode chunk-size and last chunk.
@@ -724,13 +742,14 @@ HttpIoGetChunkedTransferContent (
//
// Break if this is last chunk.
//
- if (ChunkSizeAscii [0] == CHUNKED_TRANSFER_CODING_LAST_CHUNK) {
+ if (ChunkSizeAscii[0] == CHUNKED_TRANSFER_CODING_LAST_CHUNK) {
//
// Check if this is a valid Last-Chunk.
//
- if ((ChunkSizeAscii [1] != CHUNKED_TRANSFER_CODING_CR) ||
- (ChunkSizeAscii [2] != CHUNKED_TRANSFER_CODING_LF)
- ) {
+ if ((ChunkSizeAscii[1] != CHUNKED_TRANSFER_CODING_CR) ||
+ (ChunkSizeAscii[2] != CHUNKED_TRANSFER_CODING_LF)
+ )
+ {
DEBUG ((DEBUG_ERROR, " This is an invalid Last-chunk\n"));
Status = EFI_INVALID_PARAMETER;
goto ExitDeleteChunks;
@@ -746,12 +765,13 @@ HttpIoGetChunkedTransferContent (
InitializeListHead (&ThisChunk->NextChunk);
ThisChunk->Length = ResponseData.BodyLength - 1 - 2; // Minus sizeof '0' and CRLF.
- ThisChunk->Data = (CHAR8 *)AllocatePool (ThisChunk->Length);
+ ThisChunk->Data = (CHAR8 *)AllocatePool (ThisChunk->Length);
if (ThisChunk->Data == NULL) {
FreePool ((UINT8 *)ThisChunk);
Status = EFI_OUT_OF_RESOURCES;
goto ExitDeleteChunks;
}
+
CopyMem ((UINT8 *)ThisChunk->Data, (UINT8 *)ResponseData.Body + 1, ThisChunk->Length);
TotalLength += ThisChunk->Length;
InsertTailList (HttpChunks, &ThisChunk->NextChunk);
@@ -762,16 +782,18 @@ HttpIoGetChunkedTransferContent (
// Get the chunk length
//
Index = 0;
- while ((ChunkSizeAscii [Index] != CHUNKED_TRANSFER_CODING_EXTENSION_SEPARATOR) &&
- (ChunkSizeAscii [Index] != (CHAR8)CHUNKED_TRANSFER_CODING_CR) &&
- (Index != HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH)) {
- Index ++;
+ while ((ChunkSizeAscii[Index] != CHUNKED_TRANSFER_CODING_EXTENSION_SEPARATOR) &&
+ (ChunkSizeAscii[Index] != (CHAR8)CHUNKED_TRANSFER_CODING_CR) &&
+ (Index != HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH))
+ {
+ Index++;
}
if (Index == HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH) {
Status = EFI_NOT_FOUND;
goto ExitDeleteChunks;
}
+
ChunkSizeAscii[Index] = 0;
AsciiStrHexToUintnS (ChunkSizeAscii, NULL, ContentLength);
DEBUG ((DEBUG_INFO, " Length of this chunk %d\n", *ContentLength));
@@ -783,16 +805,18 @@ HttpIoGetChunkedTransferContent (
Status = EFI_OUT_OF_RESOURCES;
goto ExitDeleteChunks;
}
+
ResponseData.BodyLength = *ContentLength;
- ResponseData.Body = (CHAR8 *)AllocatePool (*ContentLength);
+ ResponseData.Body = (CHAR8 *)AllocatePool (*ContentLength);
if (ResponseData.Body == NULL) {
FreePool (ThisChunk);
Status = EFI_OUT_OF_RESOURCES;
goto ExitDeleteChunks;
}
+
InitializeListHead (&ThisChunk->NextChunk);
ThisChunk->Length = *ContentLength;
- ThisChunk->Data = ResponseData.Body;
+ ThisChunk->Data = ResponseData.Body;
InsertTailList (HttpChunks, &ThisChunk->NextChunk);
Status = HttpIoRecvResponse (
HttpIo,
@@ -802,33 +826,37 @@ HttpIoGetChunkedTransferContent (
if (EFI_ERROR (Status)) {
goto ExitDeleteChunks;
}
+
//
// Read CRLF
//
- ZeroMem((VOID *)&ResponseData, sizeof(HTTP_IO_RESPONSE_DATA));
+ ZeroMem ((VOID *)&ResponseData, sizeof (HTTP_IO_RESPONSE_DATA));
ResponseData.BodyLength = 2;
- ResponseData.Body = ChunkSizeAscii;
- Status = HttpIoRecvResponse (
- HttpIo,
- FALSE,
- &ResponseData
- );
+ ResponseData.Body = ChunkSizeAscii;
+ Status = HttpIoRecvResponse (
+ HttpIo,
+ FALSE,
+ &ResponseData
+ );
if (EFI_ERROR (Status)) {
goto ExitDeleteChunks;
}
+
//
// Verify the end of chunk payload.
//
- if ((ChunkSizeAscii [0] != CHUNKED_TRANSFER_CODING_CR) ||
- (ChunkSizeAscii [1] != CHUNKED_TRANSFER_CODING_LF)
- ) {
- DEBUG ((DEBUG_ERROR, " This is an invalid End-of-chunk notation.\n"));
- goto ExitDeleteChunks;
+ if ((ChunkSizeAscii[0] != CHUNKED_TRANSFER_CODING_CR) ||
+ (ChunkSizeAscii[1] != CHUNKED_TRANSFER_CODING_LF)
+ )
+ {
+ DEBUG ((DEBUG_ERROR, " This is an invalid End-of-chunk notation.\n"));
+ goto ExitDeleteChunks;
}
+
TotalLength += *ContentLength;
if (TotalLength > MaxTotalLength) {
- DEBUG ((DEBUG_ERROR, " Total chunk transfer payload exceeds the size defined by PcdMaxHttpChunkTransfer.\n"));
- goto ExitDeleteChunks;
+ DEBUG ((DEBUG_ERROR, " Total chunk transfer payload exceeds the size defined by PcdMaxHttpChunkTransfer.\n"));
+ goto ExitDeleteChunks;
}
}
@@ -839,16 +867,19 @@ HttpIoGetChunkedTransferContent (
ExitDeleteChunks:
if (HttpChunks != NULL) {
- while (!IsListEmpty(HttpChunks)) {
+ while (!IsListEmpty (HttpChunks)) {
ThisListEntry = GetFirstNode (HttpChunks);
RemoveEntryList (ThisListEntry);
ThisChunk = (HTTP_IO_CHUNKS *)ThisListEntry;
if (ThisChunk->Data != NULL) {
FreePool (ThisChunk->Data);
}
- FreePool(ThisListEntry);
+
+ FreePool (ThisListEntry);
}
+
FreePool (HttpChunks);
}
+
return Status;
}