HttpUtilitiesProtocol = NULL;\r
\r
//\r
- // Locate the HTTP_UTILITIES protocol.\r
+ // 1. If we have a Request, we cannot have a NULL Url\r
+ // 2. If we have a Request, HeaderCount can not be non-zero\r
+ // 3. If we do not have a Request, HeaderCount should be zero\r
+ // 4. If we do not have Request and Headers, we need at least a message-body\r
//\r
- Status = gBS->LocateProtocol (\r
- &gEfiHttpUtilitiesProtocolGuid,\r
- NULL,\r
- (VOID **)&HttpUtilitiesProtocol\r
- );\r
+ if ((Message->Data.Request != NULL && Url == NULL) ||\r
+ (Message->Data.Request != NULL && Message->HeaderCount == 0) ||\r
+ (Message->Data.Request == NULL && Message->HeaderCount != 0) ||\r
+ (Message->Data.Request == NULL && Message->HeaderCount == 0 && Message->BodyLength == 0)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status = %r.\n", Status));\r
- return Status;\r
+ if (Message->HeaderCount != 0) {\r
+ //\r
+ // Locate the HTTP_UTILITIES protocol.\r
+ //\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiHttpUtilitiesProtocolGuid,\r
+ NULL,\r
+ (VOID **)&HttpUtilitiesProtocol\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR,"Failed to locate Http Utilities protocol. Status = %r.\n", Status));\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Build AppendList to send into HttpUtilitiesBuild\r
+ //\r
+ AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));\r
+ if (AppendList == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ for(Index = 0; Index < Message->HeaderCount; Index++){\r
+ AppendList[Index] = &Message->Headers[Index];\r
+ }\r
+\r
+ //\r
+ // Build raw HTTP Headers\r
+ //\r
+ Status = HttpUtilitiesProtocol->Build (\r
+ HttpUtilitiesProtocol,\r
+ 0,\r
+ NULL,\r
+ 0,\r
+ NULL,\r
+ Message->HeaderCount,\r
+ AppendList,\r
+ &HttpHdrSize,\r
+ &HttpHdr\r
+ );\r
+\r
+ if (AppendList != NULL) {\r
+ FreePool (AppendList);\r
+ }\r
+\r
+ if (EFI_ERROR (Status) || HttpHdr == NULL){\r
+ return Status;\r
+ }\r
}\r
\r
//\r
- // Build AppendList to send into HttpUtilitiesBuild\r
+ // If we have headers to be sent, account for it.\r
//\r
- AppendList = AllocateZeroPool (sizeof (EFI_HTTP_HEADER *) * (Message->HeaderCount));\r
- if (AppendList == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- for(Index = 0; Index < Message->HeaderCount; Index++){\r
- AppendList[Index] = &Message->Headers[Index];\r
+ if (Message->HeaderCount != 0) {\r
+ MsgSize = HttpHdrSize;\r
}\r
\r
//\r
- // Build raw HTTP Headers\r
+ // If we have a request line, account for the fields.\r
//\r
- Status = HttpUtilitiesProtocol->Build (\r
- HttpUtilitiesProtocol,\r
- 0,\r
- NULL,\r
- 0,\r
- NULL,\r
- Message->HeaderCount,\r
- AppendList,\r
- &HttpHdrSize,\r
- &HttpHdr\r
- );\r
-\r
- if (AppendList != NULL) {\r
- FreePool (AppendList);\r
- }\r
-\r
- if (EFI_ERROR (Status) || HttpHdr == NULL){\r
- return Status;\r
+ if (Message->Data.Request != NULL) {\r
+ MsgSize += HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (HTTP_VERSION_CRLF_STR) + AsciiStrLen (Url);\r
}\r
\r
+\r
//\r
- // Calculate HTTP message length.\r
+ // If we have a message body to be sent, account for it.\r
//\r
- MsgSize = Message->BodyLength + HTTP_METHOD_MAXIMUM_LEN + AsciiStrLen (Url) +\r
- AsciiStrLen (HTTP_VERSION_CRLF_STR) + HttpHdrSize;\r
-\r
+ MsgSize += Message->BodyLength;\r
\r
+ //\r
+ // memory for the string that needs to be sent to TCP\r
+ //\r
*RequestMsg = AllocateZeroPool (MsgSize);\r
if (*RequestMsg == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\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 HttpMethodPut:\r
- StrLength = sizeof (HTTP_METHOD_PUT) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);\r
- RequestPtr += StrLength;\r
- break;\r
- case HttpMethodPatch:\r
- StrLength = sizeof (HTTP_METHOD_PATCH) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);\r
- RequestPtr += StrLength;\r
- break;\r
- case HttpMethodPost:\r
- StrLength = sizeof (HTTP_METHOD_POST) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_POST, 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
- case HttpMethodDelete:\r
- StrLength = sizeof (HTTP_METHOD_DELETE) - 1;\r
- CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);\r
- RequestPtr += StrLength;\r
- break;\r
- default:\r
- ASSERT (FALSE);\r
- Status = EFI_INVALID_PARAMETER;\r
- goto Exit;\r
- }\r
+ if (Message->Data.Request != NULL) {\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 HttpMethodPut:\r
+ StrLength = sizeof (HTTP_METHOD_PUT) - 1;\r
+ CopyMem (RequestPtr, HTTP_METHOD_PUT, StrLength);\r
+ RequestPtr += StrLength;\r
+ break;\r
+ case HttpMethodPatch:\r
+ StrLength = sizeof (HTTP_METHOD_PATCH) - 1;\r
+ CopyMem (RequestPtr, HTTP_METHOD_PATCH, StrLength);\r
+ RequestPtr += StrLength;\r
+ break;\r
+ case HttpMethodPost:\r
+ StrLength = sizeof (HTTP_METHOD_POST) - 1;\r
+ CopyMem (RequestPtr, HTTP_METHOD_POST, 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
+ case HttpMethodDelete:\r
+ StrLength = sizeof (HTTP_METHOD_DELETE) - 1;\r
+ CopyMem (RequestPtr, HTTP_METHOD_DELETE, StrLength);\r
+ RequestPtr += StrLength;\r
+ break;\r
+ default:\r
+ ASSERT (FALSE);\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Exit;\r
+ }\r
\r
- StrLength = AsciiStrLen(EMPTY_SPACE);\r
- CopyMem (RequestPtr, EMPTY_SPACE, StrLength);\r
- RequestPtr += StrLength;\r
+ StrLength = AsciiStrLen(EMPTY_SPACE);\r
+ CopyMem (RequestPtr, EMPTY_SPACE, StrLength);\r
+ RequestPtr += StrLength;\r
\r
- StrLength = AsciiStrLen (Url);\r
- CopyMem (RequestPtr, Url, StrLength);\r
- RequestPtr += StrLength;\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
+ 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
+ if (HttpHdr != NULL) {\r
+ //\r
+ // Construct header\r
+ //\r
+ CopyMem (RequestPtr, HttpHdr, HttpHdrSize);\r
+ RequestPtr += HttpHdrSize;\r
+ }\r
+ }\r
\r
//\r
// Construct body\r