-/** @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