-\r
-/**\r
- Generate HTTP request string.\r
-\r
- @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.\r
- @param[in] Message Pointer to storage containing HTTP message data.\r
- @param[in] Url The URL of a remote host.\r
-\r
- @return Pointer to the created HTTP request string.\r
- @return NULL if any error occured.\r
-\r
-**/\r
-CHAR8 *\r
-HttpGenRequestString (\r
- IN HTTP_PROTOCOL *HttpInstance,\r
- IN EFI_HTTP_MESSAGE *Message,\r
- IN CHAR8 *Url\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN StrLength;\r
- UINT8 *Request;\r
- UINT8 *RequestPtr;\r
- UINTN HttpHdrSize;\r
- UINTN MsgSize;\r
- BOOLEAN Success;\r
- VOID *HttpHdr;\r
- EFI_HTTP_HEADER **AppendList; \r
- UINTN Index;\r
- \r
- ASSERT (HttpInstance != NULL);\r
- ASSERT (Message != NULL);\r
-\r
- DEBUG ((EFI_D_ERROR, "HttpMethod - %x\n", Message->Data.Request->Method));\r
-\r
- Request = NULL;\r
- Success = FALSE;\r
- HttpHdr = NULL;\r
- AppendList = NULL;\r
-\r
- //\r
- // Build AppendList\r
- //\r
- AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));\r
- if (AppendList == NULL) {\r
- return NULL;\r
- }\r
-\r
- for(Index = 0; Index < Message->HeaderCount; Index++){\r
- AppendList[Index] = &Message->Headers[Index];\r
- }\r
-\r
- //\r
- // Check whether the EFI_HTTP_UTILITIES_PROTOCOL is available.\r
- //\r
- if (mHttpUtilities == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Build raw unformatted HTTP headers.\r
- //\r
- Status = mHttpUtilities->Build (\r
- mHttpUtilities,\r
- 0,\r
- NULL,\r
- 0,\r
- NULL,\r
- Message->HeaderCount,\r
- AppendList,\r
- &HttpHdrSize,\r
- &HttpHdr\r
- );\r
- FreePool (AppendList);\r
- if (EFI_ERROR (Status) || HttpHdr == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Calculate HTTP message length.\r
- //\r
- MsgSize = Message->BodyLength + HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (Url) +\r
- AsciiStrLen (HTTP_VERSION_CRLF_STR) + HttpHdrSize;\r
- Request = AllocateZeroPool (MsgSize);\r
- if (Request == NULL) {\r
- goto Exit;\r
- } \r
-\r
- RequestPtr = Request;\r
- //\r
- // Construct header request\r
- //\r
- switch (Message->Data.Request->Method) {\r
- case HttpMethodGet:\r
- StrLength = sizeof (HTTP_METHOD_GET) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_GET, StrLength);\r
- RequestPtr += StrLength;\r
- break;\r
- case HttpMethodHead:\r
- StrLength = sizeof (HTTP_METHOD_HEAD) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_HEAD, StrLength);\r
- RequestPtr += StrLength;\r
- break;\r
- default:\r
- ASSERT (FALSE);\r
- goto Exit;\r
- }\r
-\r
- StrLength = AsciiStrLen(" ");\r
- CopyMem (RequestPtr, " ", StrLength);\r
- RequestPtr += StrLength;\r
-\r
- StrLength = AsciiStrLen (Url);\r
- CopyMem (RequestPtr, Url, StrLength);\r
- RequestPtr += StrLength;\r
-\r
- StrLength = sizeof (HTTP_VERSION_CRLF_STR) - 1;\r
- CopyMem (RequestPtr, HTTP_VERSION_CRLF_STR, StrLength);\r
- RequestPtr += StrLength;\r
-\r
- //\r
- // Construct header\r
- //\r
- CopyMem (RequestPtr, HttpHdr, HttpHdrSize);\r
- RequestPtr += HttpHdrSize;\r
-\r
- //\r
- // Construct body\r
- //\r
- if (Message->Body != NULL) {\r
- CopyMem (RequestPtr, Message->Body, Message->BodyLength);\r
- RequestPtr += Message->BodyLength;\r
- }\r
-\r
- //\r
- // Done\r
- //\r
- *RequestPtr = 0;\r
- Success = TRUE;\r
- \r
-Exit:\r
-\r
- if (!Success) {\r
- if (Request != NULL) {\r
- FreePool (Request);\r
- }\r
-\r
- Request = NULL;\r
- }\r
-\r
- if (HttpHdr != NULL) {\r
- FreePool (HttpHdr);\r
- }\r
-\r
- return (CHAR8*) Request;\r
-}\r