NetworkPkg: Use the New Functions from HttpLib
After submitting changes for HttpLib, other modules should be able to use those functions 1 remove the private function and their calls 2 update it with the functions from httpLib Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ghazi Belaam <Ghazi.belaam@hpe.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Samer EL-Haj-Mahmoud <elhaj@hpe.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
This commit is contained in:
@ -2,8 +2,9 @@
|
|||||||
Support functions implementation for UEFI HTTP boot driver.
|
Support functions implementation for UEFI HTTP boot driver.
|
||||||
|
|
||||||
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials are licensed and made available under
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
the terms and conditions of the BSD License that accompanies this distribution.
|
This program and the accompanying materials are licensed and made available under
|
||||||
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
The full text of the license may be found at
|
The full text of the license may be found at
|
||||||
http://opensource.org/licenses/bsd-license.php.
|
http://opensource.org/licenses/bsd-license.php.
|
||||||
|
|
||||||
@ -547,45 +548,11 @@ HttpBootFreeHeader (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Find a specified header field according to the field name.
|
|
||||||
|
|
||||||
@param[in] HeaderCount Number of HTTP header structures in Headers list.
|
|
||||||
@param[in] Headers Array containing list of HTTP headers.
|
|
||||||
@param[in] FieldName Null terminated string which describes a field name.
|
|
||||||
|
|
||||||
@return Pointer to the found header or NULL.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_HTTP_HEADER *
|
|
||||||
HttpBootFindHeader (
|
|
||||||
IN UINTN HeaderCount,
|
|
||||||
IN EFI_HTTP_HEADER *Headers,
|
|
||||||
IN CHAR8 *FieldName
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
if (HeaderCount == 0 || Headers == NULL || FieldName == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Index = 0; Index < HeaderCount; Index++){
|
|
||||||
//
|
|
||||||
// Field names are case-insensitive (RFC 2616).
|
|
||||||
//
|
|
||||||
if (AsciiStriCmp (Headers[Index].FieldName, FieldName) == 0) {
|
|
||||||
return &Headers[Index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set or update a HTTP header with the field name and corresponding value.
|
Set or update a HTTP header with the field name and corresponding value.
|
||||||
|
|
||||||
@param[in] HttpIoHeader Point to the HTTP header holder.
|
@param[in] HttpIoHeader Point to the HTTP header holder.
|
||||||
@param[in] FieldName Null terminated string which describes a field name.
|
@param[in] FieldName Null terminated string which describes a field name.
|
||||||
@param[in] FieldValue Null terminated string which describes the corresponding field value.
|
@param[in] FieldValue Null terminated string which describes the corresponding field value.
|
||||||
|
|
||||||
@retval EFI_SUCCESS The HTTP header has been set or updated.
|
@retval EFI_SUCCESS The HTTP header has been set or updated.
|
||||||
@ -609,7 +576,7 @@ HttpBootSetHeader (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Header = HttpBootFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName);
|
Header = HttpFindHeader (HttpIoHeader->HeaderCount, HttpIoHeader->Headers, FieldName);
|
||||||
if (Header == NULL) {
|
if (Header == NULL) {
|
||||||
//
|
//
|
||||||
// Add a new header.
|
// Add a new header.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
|
Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
|
||||||
|
|
||||||
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
|
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
|
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
@ -497,9 +497,10 @@ EfiHttpRequest (
|
|||||||
goto Error3;
|
goto Error3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
RequestStr = HttpGenRequestString (HttpInstance, HttpMsg, FileUrl);
|
|
||||||
if (RequestStr == NULL) {
|
Status = HttpGenRequestString (HttpMsg, FileUrl, &RequestStr);
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
goto Error3;
|
goto Error3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1375,107 +1375,6 @@ HttpTransmitTcp (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined
|
|
||||||
in UEFI 2.5 specification.
|
|
||||||
|
|
||||||
@param[in] StatusCode The status code value in HTTP message.
|
|
||||||
|
|
||||||
@return Value defined in EFI_HTTP_STATUS_CODE .
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_HTTP_STATUS_CODE
|
|
||||||
HttpMappingToStatusCode (
|
|
||||||
IN UINTN StatusCode
|
|
||||||
)
|
|
||||||
{
|
|
||||||
switch (StatusCode) {
|
|
||||||
case 100:
|
|
||||||
return HTTP_STATUS_100_CONTINUE;
|
|
||||||
case 101:
|
|
||||||
return HTTP_STATUS_101_SWITCHING_PROTOCOLS;
|
|
||||||
case 200:
|
|
||||||
return HTTP_STATUS_200_OK;
|
|
||||||
case 201:
|
|
||||||
return HTTP_STATUS_201_CREATED;
|
|
||||||
case 202:
|
|
||||||
return HTTP_STATUS_202_ACCEPTED;
|
|
||||||
case 203:
|
|
||||||
return HTTP_STATUS_203_NON_AUTHORITATIVE_INFORMATION;
|
|
||||||
case 204:
|
|
||||||
return HTTP_STATUS_204_NO_CONTENT;
|
|
||||||
case 205:
|
|
||||||
return HTTP_STATUS_205_RESET_CONTENT;
|
|
||||||
case 206:
|
|
||||||
return HTTP_STATUS_206_PARTIAL_CONTENT;
|
|
||||||
case 300:
|
|
||||||
return HTTP_STATUS_300_MULTIPLE_CHIOCES;
|
|
||||||
case 301:
|
|
||||||
return HTTP_STATUS_301_MOVED_PERMANENTLY;
|
|
||||||
case 302:
|
|
||||||
return HTTP_STATUS_302_FOUND;
|
|
||||||
case 303:
|
|
||||||
return HTTP_STATUS_303_SEE_OTHER;
|
|
||||||
case 304:
|
|
||||||
return HTTP_STATUS_304_NOT_MODIFIED;
|
|
||||||
case 305:
|
|
||||||
return HTTP_STATUS_305_USE_PROXY;
|
|
||||||
case 307:
|
|
||||||
return HTTP_STATUS_307_TEMPORARY_REDIRECT;
|
|
||||||
case 400:
|
|
||||||
return HTTP_STATUS_400_BAD_REQUEST;
|
|
||||||
case 401:
|
|
||||||
return HTTP_STATUS_401_UNAUTHORIZED;
|
|
||||||
case 402:
|
|
||||||
return HTTP_STATUS_402_PAYMENT_REQUIRED;
|
|
||||||
case 403:
|
|
||||||
return HTTP_STATUS_403_FORBIDDEN;
|
|
||||||
case 404:
|
|
||||||
return HTTP_STATUS_404_NOT_FOUND;
|
|
||||||
case 405:
|
|
||||||
return HTTP_STATUS_405_METHOD_NOT_ALLOWED;
|
|
||||||
case 406:
|
|
||||||
return HTTP_STATUS_406_NOT_ACCEPTABLE;
|
|
||||||
case 407:
|
|
||||||
return HTTP_STATUS_407_PROXY_AUTHENTICATION_REQUIRED;
|
|
||||||
case 408:
|
|
||||||
return HTTP_STATUS_408_REQUEST_TIME_OUT;
|
|
||||||
case 409:
|
|
||||||
return HTTP_STATUS_409_CONFLICT;
|
|
||||||
case 410:
|
|
||||||
return HTTP_STATUS_410_GONE;
|
|
||||||
case 411:
|
|
||||||
return HTTP_STATUS_411_LENGTH_REQUIRED;
|
|
||||||
case 412:
|
|
||||||
return HTTP_STATUS_412_PRECONDITION_FAILED;
|
|
||||||
case 413:
|
|
||||||
return HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE;
|
|
||||||
case 414:
|
|
||||||
return HTTP_STATUS_414_REQUEST_URI_TOO_LARGE;
|
|
||||||
case 415:
|
|
||||||
return HTTP_STATUS_415_UNSUPPORTED_MEDIA_TYPE;
|
|
||||||
case 416:
|
|
||||||
return HTTP_STATUS_416_REQUESTED_RANGE_NOT_SATISFIED;
|
|
||||||
case 417:
|
|
||||||
return HTTP_STATUS_417_EXPECTATION_FAILED;
|
|
||||||
case 500:
|
|
||||||
return HTTP_STATUS_500_INTERNAL_SERVER_ERROR;
|
|
||||||
case 501:
|
|
||||||
return HTTP_STATUS_501_NOT_IMPLEMENTED;
|
|
||||||
case 502:
|
|
||||||
return HTTP_STATUS_502_BAD_GATEWAY;
|
|
||||||
case 503:
|
|
||||||
return HTTP_STATUS_503_SERVICE_UNAVAILABLE;
|
|
||||||
case 504:
|
|
||||||
return HTTP_STATUS_504_GATEWAY_TIME_OUT;
|
|
||||||
case 505:
|
|
||||||
return HTTP_STATUS_505_HTTP_VERSION_NOT_SUPPORTED;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return HTTP_STATUS_UNSUPPORTED_STATUS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the user's token or event has already
|
Check whether the user's token or event has already
|
||||||
been enqueue on HTTP Tx or Rx Token list.
|
been enqueue on HTTP Tx or Rx Token list.
|
||||||
@ -1584,14 +1483,15 @@ HttpTcpTransmit (
|
|||||||
//
|
//
|
||||||
// Create request message.
|
// Create request message.
|
||||||
//
|
//
|
||||||
RequestStr = HttpGenRequestString (
|
Status = HttpGenRequestString (
|
||||||
ValueInItem->HttpInstance,
|
|
||||||
ValueInItem->HttpToken->Message,
|
ValueInItem->HttpToken->Message,
|
||||||
Url
|
Url,
|
||||||
|
&RequestStr
|
||||||
);
|
);
|
||||||
FreePool (Url);
|
FreePool (Url);
|
||||||
if (RequestStr == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
if (EFI_ERROR (Status)){
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1942,159 +1842,3 @@ HttpTcpTokenCleanup (
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Generate HTTP request string.
|
|
||||||
|
|
||||||
@param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
|
|
||||||
@param[in] Message Pointer to storage containing HTTP message data.
|
|
||||||
@param[in] Url The URL of a remote host.
|
|
||||||
|
|
||||||
@return Pointer to the created HTTP request string.
|
|
||||||
@return NULL if any error occured.
|
|
||||||
|
|
||||||
**/
|
|
||||||
CHAR8 *
|
|
||||||
HttpGenRequestString (
|
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
|
||||||
IN EFI_HTTP_MESSAGE *Message,
|
|
||||||
IN CHAR8 *Url
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
UINTN StrLength;
|
|
||||||
UINT8 *Request;
|
|
||||||
UINT8 *RequestPtr;
|
|
||||||
UINTN HttpHdrSize;
|
|
||||||
UINTN MsgSize;
|
|
||||||
BOOLEAN Success;
|
|
||||||
VOID *HttpHdr;
|
|
||||||
EFI_HTTP_HEADER **AppendList;
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
ASSERT (HttpInstance != NULL);
|
|
||||||
ASSERT (Message != NULL);
|
|
||||||
|
|
||||||
DEBUG ((EFI_D_ERROR, "HttpMethod - %x\n", Message->Data.Request->Method));
|
|
||||||
|
|
||||||
Request = NULL;
|
|
||||||
Success = FALSE;
|
|
||||||
HttpHdr = NULL;
|
|
||||||
AppendList = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Build AppendList
|
|
||||||
//
|
|
||||||
AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));
|
|
||||||
if (AppendList == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Index = 0; Index < Message->HeaderCount; Index++){
|
|
||||||
AppendList[Index] = &Message->Headers[Index];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check whether the EFI_HTTP_UTILITIES_PROTOCOL is available.
|
|
||||||
//
|
|
||||||
if (mHttpUtilities == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Build raw unformatted HTTP headers.
|
|
||||||
//
|
|
||||||
Status = mHttpUtilities->Build (
|
|
||||||
mHttpUtilities,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
Message->HeaderCount,
|
|
||||||
AppendList,
|
|
||||||
&HttpHdrSize,
|
|
||||||
&HttpHdr
|
|
||||||
);
|
|
||||||
FreePool (AppendList);
|
|
||||||
if (EFI_ERROR (Status) || HttpHdr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Calculate HTTP message length.
|
|
||||||
//
|
|
||||||
MsgSize = Message->BodyLength + HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (Url) +
|
|
||||||
AsciiStrLen (HTTP_VERSION_CRLF_STR) + HttpHdrSize;
|
|
||||||
Request = AllocateZeroPool (MsgSize);
|
|
||||||
if (Request == NULL) {
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
RequestPtr = Request;
|
|
||||||
//
|
|
||||||
// Construct header request
|
|
||||||
//
|
|
||||||
switch (Message->Data.Request->Method) {
|
|
||||||
case HttpMethodGet:
|
|
||||||
StrLength = sizeof (HTTP_METHOD_GET) - 1;
|
|
||||||
CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);
|
|
||||||
RequestPtr += StrLength;
|
|
||||||
break;
|
|
||||||
case HttpMethodHead:
|
|
||||||
StrLength = sizeof (HTTP_METHOD_HEAD) - 1;
|
|
||||||
CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);
|
|
||||||
RequestPtr += StrLength;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ASSERT (FALSE);
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
StrLength = AsciiStrLen(" ");
|
|
||||||
CopyMem (RequestPtr, " ", StrLength);
|
|
||||||
RequestPtr += StrLength;
|
|
||||||
|
|
||||||
StrLength = AsciiStrLen (Url);
|
|
||||||
CopyMem (RequestPtr, Url, StrLength);
|
|
||||||
RequestPtr += StrLength;
|
|
||||||
|
|
||||||
StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;
|
|
||||||
CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);
|
|
||||||
RequestPtr += StrLength;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Construct header
|
|
||||||
//
|
|
||||||
CopyMem (RequestPtr, HttpHdr, HttpHdrSize);
|
|
||||||
RequestPtr += HttpHdrSize;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Construct body
|
|
||||||
//
|
|
||||||
if (Message->Body != NULL) {
|
|
||||||
CopyMem (RequestPtr, Message->Body, Message->BodyLength);
|
|
||||||
RequestPtr += Message->BodyLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Done
|
|
||||||
//
|
|
||||||
*RequestPtr = 0;
|
|
||||||
Success = TRUE;
|
|
||||||
|
|
||||||
Exit:
|
|
||||||
|
|
||||||
if (!Success) {
|
|
||||||
if (Request != NULL) {
|
|
||||||
FreePool (Request);
|
|
||||||
}
|
|
||||||
|
|
||||||
Request = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HttpHdr != NULL) {
|
|
||||||
FreePool (HttpHdr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (CHAR8*) Request;
|
|
||||||
}
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
The header files of miscellaneous routines for HttpDxe driver.
|
The header files of miscellaneous routines for HttpDxe driver.
|
||||||
|
|
||||||
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -398,20 +399,6 @@ HttpTransmitTcp (
|
|||||||
IN UINTN TxStringLen
|
IN UINTN TxStringLen
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined
|
|
||||||
in UEFI 2.5 specification.
|
|
||||||
|
|
||||||
@param[in] StatusCode The status code value in HTTP message.
|
|
||||||
|
|
||||||
@return Value defined in EFI_HTTP_STATUS_CODE .
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_HTTP_STATUS_CODE
|
|
||||||
HttpMappingToStatusCode (
|
|
||||||
IN UINTN StatusCode
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the user's token or event has already
|
Check whether the user's token or event has already
|
||||||
been enqueue on HTTP Tx or Rx Token list.
|
been enqueue on HTTP Tx or Rx Token list.
|
||||||
@ -556,24 +543,6 @@ HttpTcpTokenCleanup (
|
|||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Generate HTTP request string.
|
|
||||||
|
|
||||||
@param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
|
|
||||||
@param[in] Message Pointer to storage containing HTTP message data.
|
|
||||||
@param[in] Url The URL of a remote host.
|
|
||||||
|
|
||||||
@return Pointer to the created HTTP request string.
|
|
||||||
@return NULL if any error occured.
|
|
||||||
|
|
||||||
**/
|
|
||||||
CHAR8 *
|
|
||||||
HttpGenRequestString (
|
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
|
||||||
IN EFI_HTTP_MESSAGE *Message,
|
|
||||||
IN CHAR8 *Url
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The work function of EfiHttpResponse().
|
The work function of EfiHttpResponse().
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
The header files of Http Utilities functions for HttpUtilities driver.
|
The header files of Http Utilities functions for HttpUtilities driver.
|
||||||
|
|
||||||
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
|
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
@ -27,6 +28,7 @@
|
|||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/HttpLib.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consumed Protocols
|
// Consumed Protocols
|
||||||
@ -39,98 +41,6 @@
|
|||||||
//
|
//
|
||||||
extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
|
extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Free existing HeaderFields.
|
|
||||||
|
|
||||||
@param[in] HeaderFields Pointer to array of key/value header pairs waitting for free.
|
|
||||||
@param[in] FieldCount The number of header pairs in HeaderFields.
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
FreeHeaderFields (
|
|
||||||
IN EFI_HTTP_HEADER *HeaderFields,
|
|
||||||
IN UINTN FieldCount
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Find required header field in HeaderFields.
|
|
||||||
|
|
||||||
@param[in] HeaderFields Pointer to array of key/value header pairs.
|
|
||||||
@param[in] FieldCount The number of header pairs.
|
|
||||||
@param[in] FieldName Pointer to header field's name.
|
|
||||||
|
|
||||||
@return Pointer to the queried header field.
|
|
||||||
@return NULL if not find this required header field.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_HTTP_HEADER *
|
|
||||||
FindHttpHeader (
|
|
||||||
IN EFI_HTTP_HEADER *HeaderFields,
|
|
||||||
IN UINTN FieldCount,
|
|
||||||
IN CHAR8 *FieldName
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Check whether header field called FieldName is in DeleteList.
|
|
||||||
|
|
||||||
@param[in] DeleteList Pointer to array of key/value header pairs.
|
|
||||||
@param[in] DeleteCount The number of header pairs.
|
|
||||||
@param[in] FieldName Pointer to header field's name.
|
|
||||||
|
|
||||||
@return TRUE if FieldName is not in DeleteList, that means this header field is valid.
|
|
||||||
@return FALSE if FieldName is in DeleteList, that means this header field is invalid.
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
IsValidHttpHeader (
|
|
||||||
IN CHAR8 *DeleteList[],
|
|
||||||
IN UINTN DeleteCount,
|
|
||||||
IN CHAR8 *FieldName
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Set FieldName and FieldValue into specified HttpHeader.
|
|
||||||
|
|
||||||
@param[in] HttpHeader Specified HttpHeader.
|
|
||||||
@param[in] FieldName FieldName of this HttpHeader.
|
|
||||||
@param[in] FieldValue FieldValue of this HttpHeader.
|
|
||||||
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
SetFieldNameAndValue (
|
|
||||||
IN EFI_HTTP_HEADER *HttpHeader,
|
|
||||||
IN CHAR8 *FieldName,
|
|
||||||
IN CHAR8 *FieldValue
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Get one key/value header pair from the raw string.
|
|
||||||
|
|
||||||
@param[in] String Pointer to the raw string.
|
|
||||||
@param[out] FieldName Pointer to header field's name.
|
|
||||||
@param[out] FieldValue Pointer to header field's value.
|
|
||||||
|
|
||||||
@return Pointer to the next raw string.
|
|
||||||
@return NULL if no key/value header pair from this raw string.
|
|
||||||
|
|
||||||
**/
|
|
||||||
CHAR8 *
|
|
||||||
GetFieldNameAndValue (
|
|
||||||
IN CHAR8 *String,
|
|
||||||
OUT CHAR8 **FieldName,
|
|
||||||
OUT CHAR8 **FieldValue
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create HTTP header based on a combination of seed header, fields
|
Create HTTP header based on a combination of seed header, fields
|
||||||
to delete, and fields to append.
|
to delete, and fields to append.
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# Implementation of EFI Http Utilities Protocol interfaces.
|
# Implementation of EFI Http Utilities Protocol interfaces.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
|
# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
@ -30,7 +31,6 @@
|
|||||||
[Sources]
|
[Sources]
|
||||||
HttpUtilitiesDxe.h
|
HttpUtilitiesDxe.h
|
||||||
HttpUtilitiesDxe.c
|
HttpUtilitiesDxe.c
|
||||||
HttpUtilitiesImpl.c
|
|
||||||
HttpUtilitiesProtocol.c
|
HttpUtilitiesProtocol.c
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
@ -41,6 +41,7 @@
|
|||||||
BaseLib
|
BaseLib
|
||||||
UefiLib
|
UefiLib
|
||||||
DebugLib
|
DebugLib
|
||||||
|
HttpLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiHttpUtilitiesProtocolGuid ## PRODUCES
|
gEfiHttpUtilitiesProtocolGuid ## PRODUCES
|
||||||
|
@ -1,279 +0,0 @@
|
|||||||
/** @file
|
|
||||||
The functions for HttpUtilities driver.
|
|
||||||
|
|
||||||
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
|
||||||
|
|
||||||
This program and the accompanying materials
|
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
|
||||||
http://opensource.org/licenses/bsd-license.php.
|
|
||||||
|
|
||||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
||||||
|
|
||||||
**/
|
|
||||||
|
|
||||||
#include "HttpUtilitiesDxe.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Get the next string, which is distinguished by specified seperator.
|
|
||||||
|
|
||||||
@param[in] String Pointer to the string.
|
|
||||||
@param[in] Seperator Specified seperator used to distinguish where is the beginning
|
|
||||||
of next string.
|
|
||||||
|
|
||||||
@return Pointer to the next string.
|
|
||||||
@return NULL if not find or String is NULL.
|
|
||||||
|
|
||||||
**/
|
|
||||||
CHAR8 *
|
|
||||||
AsciiStrGetNextToken (
|
|
||||||
IN CONST CHAR8 *String,
|
|
||||||
IN CHAR8 Seperator
|
|
||||||
)
|
|
||||||
{
|
|
||||||
CONST CHAR8 *Token;
|
|
||||||
|
|
||||||
Token = String;
|
|
||||||
while (TRUE) {
|
|
||||||
if (*Token == 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (*Token == Seperator) {
|
|
||||||
return (CHAR8 *)(Token + 1);
|
|
||||||
}
|
|
||||||
Token++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Free existing HeaderFields.
|
|
||||||
|
|
||||||
@param[in] HeaderFields Pointer to array of key/value header pairs waitting for free.
|
|
||||||
@param[in] FieldCount The number of header pairs in HeaderFields.
|
|
||||||
|
|
||||||
**/
|
|
||||||
VOID
|
|
||||||
FreeHeaderFields (
|
|
||||||
IN EFI_HTTP_HEADER *HeaderFields,
|
|
||||||
IN UINTN FieldCount
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
if (HeaderFields != NULL) {
|
|
||||||
for (Index = 0; Index < FieldCount; Index++) {
|
|
||||||
if (HeaderFields[Index].FieldName != NULL) {
|
|
||||||
FreePool (HeaderFields[Index].FieldName);
|
|
||||||
}
|
|
||||||
if (HeaderFields[Index].FieldValue != NULL) {
|
|
||||||
FreePool (HeaderFields[Index].FieldValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FreePool (HeaderFields);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Find required header field in HeaderFields.
|
|
||||||
|
|
||||||
@param[in] HeaderFields Pointer to array of key/value header pairs.
|
|
||||||
@param[in] FieldCount The number of header pairs.
|
|
||||||
@param[in] FieldName Pointer to header field's name.
|
|
||||||
|
|
||||||
@return Pointer to the queried header field.
|
|
||||||
@return NULL if not find this required header field.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_HTTP_HEADER *
|
|
||||||
FindHttpHeader (
|
|
||||||
IN EFI_HTTP_HEADER *HeaderFields,
|
|
||||||
IN UINTN FieldCount,
|
|
||||||
IN CHAR8 *FieldName
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
for (Index = 0; Index < FieldCount; Index++) {
|
|
||||||
if (AsciiStrCmp (FieldName, HeaderFields[Index].FieldName) == 0) {
|
|
||||||
//
|
|
||||||
// Find the required header field.
|
|
||||||
//
|
|
||||||
return &HeaderFields[Index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Check whether header field called FieldName is in DeleteList.
|
|
||||||
|
|
||||||
@param[in] DeleteList Pointer to array of key/value header pairs.
|
|
||||||
@param[in] DeleteCount The number of header pairs.
|
|
||||||
@param[in] FieldName Pointer to header field's name.
|
|
||||||
|
|
||||||
@return TRUE if FieldName is not in DeleteList, that means this header field is valid.
|
|
||||||
@return FALSE if FieldName is in DeleteList, that means this header field is invalid.
|
|
||||||
|
|
||||||
**/
|
|
||||||
BOOLEAN
|
|
||||||
IsValidHttpHeader (
|
|
||||||
IN CHAR8 *DeleteList[],
|
|
||||||
IN UINTN DeleteCount,
|
|
||||||
IN CHAR8 *FieldName
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN Index;
|
|
||||||
|
|
||||||
for (Index = 0; Index < DeleteCount; Index++) {
|
|
||||||
if (AsciiStrCmp (FieldName, DeleteList[Index]) == 0) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Set FieldName and FieldValue into specified HttpHeader.
|
|
||||||
|
|
||||||
@param[in] HttpHeader Specified HttpHeader.
|
|
||||||
@param[in] FieldName FieldName of this HttpHeader.
|
|
||||||
@param[in] FieldValue FieldValue of this HttpHeader.
|
|
||||||
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.
|
|
||||||
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
SetFieldNameAndValue (
|
|
||||||
IN EFI_HTTP_HEADER *HttpHeader,
|
|
||||||
IN CHAR8 *FieldName,
|
|
||||||
IN CHAR8 *FieldValue
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UINTN FieldNameSize;
|
|
||||||
UINTN FieldValueSize;
|
|
||||||
|
|
||||||
if (HttpHeader->FieldName != NULL) {
|
|
||||||
FreePool (HttpHeader->FieldName);
|
|
||||||
}
|
|
||||||
if (HttpHeader->FieldValue != NULL) {
|
|
||||||
FreePool (HttpHeader->FieldValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
FieldNameSize = AsciiStrSize (FieldName);
|
|
||||||
HttpHeader->FieldName = AllocateZeroPool (FieldNameSize);
|
|
||||||
if (HttpHeader->FieldName == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
CopyMem (HttpHeader->FieldName, FieldName, FieldNameSize);
|
|
||||||
HttpHeader->FieldName[FieldNameSize - 1] = 0;
|
|
||||||
|
|
||||||
FieldValueSize = AsciiStrSize (FieldValue);
|
|
||||||
HttpHeader->FieldValue = AllocateZeroPool (FieldValueSize);
|
|
||||||
if (HttpHeader->FieldValue == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
|
||||||
CopyMem (HttpHeader->FieldValue, FieldValue, FieldValueSize);
|
|
||||||
HttpHeader->FieldValue[FieldValueSize - 1] = 0;
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Get one key/value header pair from the raw string.
|
|
||||||
|
|
||||||
@param[in] String Pointer to the raw string.
|
|
||||||
@param[out] FieldName Pointer to header field's name.
|
|
||||||
@param[out] FieldValue Pointer to header field's value.
|
|
||||||
|
|
||||||
@return Pointer to the next raw string.
|
|
||||||
@return NULL if no key/value header pair from this raw string.
|
|
||||||
|
|
||||||
**/
|
|
||||||
CHAR8 *
|
|
||||||
GetFieldNameAndValue (
|
|
||||||
IN CHAR8 *String,
|
|
||||||
OUT CHAR8 **FieldName,
|
|
||||||
OUT CHAR8 **FieldValue
|
|
||||||
)
|
|
||||||
{
|
|
||||||
CHAR8 *FieldNameStr;
|
|
||||||
CHAR8 *FieldValueStr;
|
|
||||||
CHAR8 *StrPtr;
|
|
||||||
|
|
||||||
if (String == NULL || FieldName == NULL || FieldValue == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
*FieldName = NULL;
|
|
||||||
*FieldValue = NULL;
|
|
||||||
FieldNameStr = NULL;
|
|
||||||
FieldValueStr = NULL;
|
|
||||||
StrPtr = NULL;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Each header field consists of a name followed by a colon (":") and the field value.
|
|
||||||
//
|
|
||||||
FieldNameStr = String;
|
|
||||||
FieldValueStr = AsciiStrGetNextToken (FieldNameStr, ':');
|
|
||||||
if (FieldValueStr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Replace ':' with 0
|
|
||||||
//
|
|
||||||
*(FieldValueStr - 1) = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
// The field value MAY be preceded by any amount of LWS, though a single SP is preferred.
|
|
||||||
//
|
|
||||||
while (TRUE) {
|
|
||||||
if (*FieldValueStr == ' ' || *FieldValueStr == '\t') {
|
|
||||||
FieldValueStr ++;
|
|
||||||
} else if (*FieldValueStr == '\r' && *(FieldValueStr + 1) == '\n' &&
|
|
||||||
(*(FieldValueStr + 2) == ' ' || *(FieldValueStr + 2) == '\t')) {
|
|
||||||
FieldValueStr = FieldValueStr + 3;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Header fields can be extended over multiple lines by preceding each extra
|
|
||||||
// line with at least one SP or HT.
|
|
||||||
//
|
|
||||||
StrPtr = FieldValueStr;
|
|
||||||
do {
|
|
||||||
StrPtr = AsciiStrGetNextToken (StrPtr, '\r');
|
|
||||||
if (StrPtr == NULL || *StrPtr != '\n') {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
StrPtr++;
|
|
||||||
} while (*StrPtr == ' ' || *StrPtr == '\t');
|
|
||||||
|
|
||||||
//
|
|
||||||
// Replace '\r' with 0
|
|
||||||
//
|
|
||||||
*(StrPtr - 2) = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get FieldName and FieldValue.
|
|
||||||
//
|
|
||||||
*FieldName = FieldNameStr;
|
|
||||||
*FieldValue = FieldValueStr;
|
|
||||||
|
|
||||||
return StrPtr;
|
|
||||||
}
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
|||||||
Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
|
Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
|
||||||
|
|
||||||
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@ -122,8 +123,8 @@ HttpUtilitiesBuild (
|
|||||||
//
|
//
|
||||||
// Check whether each SeedHeaderFields member is in DeleteList
|
// Check whether each SeedHeaderFields member is in DeleteList
|
||||||
//
|
//
|
||||||
if (IsValidHttpHeader( DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) {
|
if (HttpIsValidHttpHeader( DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) {
|
||||||
Status = SetFieldNameAndValue (
|
Status = HttpSetFieldNameAndValue (
|
||||||
&TempHeaderFields[TempFieldCount],
|
&TempHeaderFields[TempFieldCount],
|
||||||
SeedHeaderFields[Index].FieldName,
|
SeedHeaderFields[Index].FieldName,
|
||||||
SeedHeaderFields[Index].FieldValue
|
SeedHeaderFields[Index].FieldValue
|
||||||
@ -149,7 +150,7 @@ HttpUtilitiesBuild (
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < TempFieldCount; Index++) {
|
for (Index = 0; Index < TempFieldCount; Index++) {
|
||||||
Status = SetFieldNameAndValue (
|
Status = HttpSetFieldNameAndValue (
|
||||||
&NewHeaderFields[Index],
|
&NewHeaderFields[Index],
|
||||||
TempHeaderFields[Index].FieldName,
|
TempHeaderFields[Index].FieldName,
|
||||||
TempHeaderFields[Index].FieldValue
|
TempHeaderFields[Index].FieldValue
|
||||||
@ -162,9 +163,9 @@ HttpUtilitiesBuild (
|
|||||||
NewFieldCount = TempFieldCount;
|
NewFieldCount = TempFieldCount;
|
||||||
|
|
||||||
for (Index = 0; Index < AppendCount; Index++) {
|
for (Index = 0; Index < AppendCount; Index++) {
|
||||||
HttpHeader = FindHttpHeader (NewHeaderFields, NewFieldCount, AppendList[Index]->FieldName);
|
HttpHeader = HttpFindHeader (NewFieldCount, NewHeaderFields, AppendList[Index]->FieldName);
|
||||||
if (HttpHeader != NULL) {
|
if (HttpHeader != NULL) {
|
||||||
Status = SetFieldNameAndValue (
|
Status = HttpSetFieldNameAndValue (
|
||||||
HttpHeader,
|
HttpHeader,
|
||||||
AppendList[Index]->FieldName,
|
AppendList[Index]->FieldName,
|
||||||
AppendList[Index]->FieldValue
|
AppendList[Index]->FieldValue
|
||||||
@ -173,7 +174,7 @@ HttpUtilitiesBuild (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Status = SetFieldNameAndValue (
|
Status = HttpSetFieldNameAndValue (
|
||||||
&NewHeaderFields[NewFieldCount],
|
&NewHeaderFields[NewFieldCount],
|
||||||
AppendList[Index]->FieldName,
|
AppendList[Index]->FieldName,
|
||||||
AppendList[Index]->FieldValue
|
AppendList[Index]->FieldValue
|
||||||
@ -251,15 +252,15 @@ HttpUtilitiesBuild (
|
|||||||
//
|
//
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
if (SeedHeaderFields != NULL) {
|
if (SeedHeaderFields != NULL) {
|
||||||
FreeHeaderFields(SeedHeaderFields, SeedFieldCount);
|
HttpFreeHeaderFields(SeedHeaderFields, SeedFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TempHeaderFields != NULL) {
|
if (TempHeaderFields != NULL) {
|
||||||
FreeHeaderFields(TempHeaderFields, TempFieldCount);
|
HttpFreeHeaderFields(TempHeaderFields, TempFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NewHeaderFields != NULL) {
|
if (NewHeaderFields != NULL) {
|
||||||
FreeHeaderFields(NewHeaderFields, NewFieldCount);
|
HttpFreeHeaderFields(NewHeaderFields, NewFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -332,7 +333,7 @@ HttpUtilitiesParse (
|
|||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
FieldName = NULL;
|
FieldName = NULL;
|
||||||
FieldValue = NULL;
|
FieldValue = NULL;
|
||||||
NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
||||||
Token = NextToken;
|
Token = NextToken;
|
||||||
if (FieldName == NULL || FieldValue == NULL) {
|
if (FieldName == NULL || FieldValue == NULL) {
|
||||||
break;
|
break;
|
||||||
@ -365,16 +366,16 @@ HttpUtilitiesParse (
|
|||||||
while (Index < *FieldCount) {
|
while (Index < *FieldCount) {
|
||||||
FieldName = NULL;
|
FieldName = NULL;
|
||||||
FieldValue = NULL;
|
FieldValue = NULL;
|
||||||
NextToken = GetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
||||||
Token = NextToken;
|
Token = NextToken;
|
||||||
if (FieldName == NULL || FieldValue == NULL) {
|
if (FieldName == NULL || FieldValue == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = SetFieldNameAndValue (&(*HeaderFields)[Index], FieldName, FieldValue);
|
Status = HttpSetFieldNameAndValue (&(*HeaderFields)[Index], FieldName, FieldValue);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
*FieldCount = 0;
|
*FieldCount = 0;
|
||||||
FreeHeaderFields (*HeaderFields, Index);
|
HttpFreeHeaderFields (*HeaderFields, Index);
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user