-/** @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;
-}
-
+/** @file\r
+ The functions for HttpUtilities driver.\r
+\r
+ Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+\r
+ This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php.\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "HttpUtilitiesDxe.h"\r
+\r
+\r
+/**\r
+ Get the next string, which is distinguished by specified seperator. \r
+\r
+ @param[in] String Pointer to the string.\r
+ @param[in] Seperator Specified seperator used to distinguish where is the beginning \r
+ of next string.\r
+\r
+ @return Pointer to the next string.\r
+ @return NULL if not find or String is NULL.\r
+\r
+**/\r
+CHAR8 *\r
+AsciiStrGetNextToken (\r
+ IN CONST CHAR8 *String,\r
+ IN CHAR8 Seperator\r
+ )\r
+{\r
+ CONST CHAR8 *Token;\r
+\r
+ Token = String;\r
+ while (TRUE) {\r
+ if (*Token == 0) {\r
+ return NULL;\r
+ }\r
+ if (*Token == Seperator) {\r
+ return (CHAR8 *)(Token + 1);\r
+ }\r
+ Token++;\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ Free existing HeaderFields.\r
+\r
+ @param[in] HeaderFields Pointer to array of key/value header pairs waitting for free.\r
+ @param[in] FieldCount The number of header pairs in HeaderFields.\r
+\r
+**/\r
+VOID\r
+FreeHeaderFields (\r
+ IN EFI_HTTP_HEADER *HeaderFields,\r
+ IN UINTN FieldCount\r
+ )\r
+{\r
+ UINTN Index;\r
+ \r
+ if (HeaderFields != NULL) {\r
+ for (Index = 0; Index < FieldCount; Index++) {\r
+ if (HeaderFields[Index].FieldName != NULL) {\r
+ FreePool (HeaderFields[Index].FieldName);\r
+ }\r
+ if (HeaderFields[Index].FieldValue != NULL) {\r
+ FreePool (HeaderFields[Index].FieldValue);\r
+ }\r
+ }\r
+\r
+ FreePool (HeaderFields);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ Find required header field in HeaderFields.\r
+\r
+ @param[in] HeaderFields Pointer to array of key/value header pairs.\r
+ @param[in] FieldCount The number of header pairs.\r
+ @param[in] FieldName Pointer to header field's name.\r
+\r
+ @return Pointer to the queried header field.\r
+ @return NULL if not find this required header field.\r
+\r
+**/\r
+EFI_HTTP_HEADER *\r
+FindHttpHeader (\r
+ IN EFI_HTTP_HEADER *HeaderFields,\r
+ IN UINTN FieldCount,\r
+ IN CHAR8 *FieldName\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < FieldCount; Index++) {\r
+ if (AsciiStrCmp (FieldName, HeaderFields[Index].FieldName) == 0) {\r
+ //\r
+ // Find the required header field.\r
+ //\r
+ return &HeaderFields[Index];\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
+\r
+\r
+/**\r
+ Check whether header field called FieldName is in DeleteList.\r
+\r
+ @param[in] DeleteList Pointer to array of key/value header pairs.\r
+ @param[in] DeleteCount The number of header pairs.\r
+ @param[in] FieldName Pointer to header field's name.\r
+\r
+ @return TRUE if FieldName is not in DeleteList, that means this header field is valid.\r
+ @return FALSE if FieldName is in DeleteList, that means this header field is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+IsValidHttpHeader (\r
+ IN CHAR8 *DeleteList[],\r
+ IN UINTN DeleteCount,\r
+ IN CHAR8 *FieldName\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < DeleteCount; Index++) {\r
+ if (AsciiStrCmp (FieldName, DeleteList[Index]) == 0) {\r
+ return FALSE;\r
+ }\r
+ }\r
+ \r
+ return TRUE;\r
+}\r
+\r
+\r
+/**\r
+ Set FieldName and FieldValue into specified HttpHeader.\r
+\r
+ @param[in] HttpHeader Specified HttpHeader.\r
+ @param[in] FieldName FieldName of this HttpHeader.\r
+ @param[in] FieldValue FieldValue of this HttpHeader.\r
+\r
+\r
+ @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
+\r
+**/\r
+EFI_STATUS\r
+SetFieldNameAndValue (\r
+ IN EFI_HTTP_HEADER *HttpHeader,\r
+ IN CHAR8 *FieldName, \r
+ IN CHAR8 *FieldValue\r
+ )\r
+{ \r
+ UINTN FieldNameSize;\r
+ UINTN FieldValueSize;\r
+\r
+ if (HttpHeader->FieldName != NULL) {\r
+ FreePool (HttpHeader->FieldName);\r
+ }\r
+ if (HttpHeader->FieldValue != NULL) {\r
+ FreePool (HttpHeader->FieldValue);\r
+ }\r
+\r
+ FieldNameSize = AsciiStrSize (FieldName);\r
+ HttpHeader->FieldName = AllocateZeroPool (FieldNameSize);\r
+ if (HttpHeader->FieldName == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (HttpHeader->FieldName, FieldName, FieldNameSize);\r
+ HttpHeader->FieldName[FieldNameSize - 1] = 0;\r
+\r
+ FieldValueSize = AsciiStrSize (FieldValue);\r
+ HttpHeader->FieldValue = AllocateZeroPool (FieldValueSize);\r
+ if (HttpHeader->FieldValue == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (HttpHeader->FieldValue, FieldValue, FieldValueSize);\r
+ HttpHeader->FieldValue[FieldValueSize - 1] = 0;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+ Get one key/value header pair from the raw string.\r
+\r
+ @param[in] String Pointer to the raw string.\r
+ @param[out] FieldName Pointer to header field's name.\r
+ @param[out] FieldValue Pointer to header field's value.\r
+\r
+ @return Pointer to the next raw string.\r
+ @return NULL if no key/value header pair from this raw string.\r
+\r
+**/\r
+CHAR8 *\r
+GetFieldNameAndValue (\r
+ IN CHAR8 *String,\r
+ OUT CHAR8 **FieldName,\r
+ OUT CHAR8 **FieldValue\r
+ )\r
+{\r
+ CHAR8 *FieldNameStr;\r
+ CHAR8 *FieldValueStr;\r
+ CHAR8 *StrPtr;\r
+\r
+ if (String == NULL || FieldName == NULL || FieldValue == NULL) {\r
+ return NULL;\r
+ }\r
+ \r
+ *FieldName = NULL;\r
+ *FieldValue = NULL;\r
+ FieldNameStr = NULL;\r
+ FieldValueStr = NULL;\r
+ StrPtr = NULL;\r
+\r
+ //\r
+ // Each header field consists of a name followed by a colon (":") and the field value.\r
+ //\r
+ FieldNameStr = String;\r
+ FieldValueStr = AsciiStrGetNextToken (FieldNameStr, ':');\r
+ if (FieldValueStr == NULL) {\r
+ return NULL;\r
+ }\r
+ \r
+ //\r
+ // Replace ':' with 0\r
+ //\r
+ *(FieldValueStr - 1) = 0; \r
+ \r
+ //\r
+ // The field value MAY be preceded by any amount of LWS, though a single SP is preferred.\r
+ //\r
+ while (TRUE) {\r
+ if (*FieldValueStr == ' ' || *FieldValueStr == '\t') {\r
+ FieldValueStr ++;\r
+ } else if (*FieldValueStr == '\r' && *(FieldValueStr + 1) == '\n' && \r
+ (*(FieldValueStr + 2) == ' ' || *(FieldValueStr + 2) == '\t')) {\r
+ FieldValueStr = FieldValueStr + 3;\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Header fields can be extended over multiple lines by preceding each extra \r
+ // line with at least one SP or HT.\r
+ //\r
+ StrPtr = FieldValueStr;\r
+ do {\r
+ StrPtr = AsciiStrGetNextToken (StrPtr, '\r');\r
+ if (StrPtr == NULL || *StrPtr != '\n') {\r
+ return NULL;\r
+ }\r
+ \r
+ StrPtr++;\r
+ } while (*StrPtr == ' ' || *StrPtr == '\t');\r
+\r
+ //\r
+ // Replace '\r' with 0\r
+ //\r
+ *(StrPtr - 2) = 0; \r
+\r
+ //\r
+ // Get FieldName and FieldValue.\r
+ //\r
+ *FieldName = FieldNameStr;\r
+ *FieldValue = FieldValueStr;\r
+ \r
+ return StrPtr;\r
+}\r
+\r