/** @file\r
Miscellaneous routines for HttpDxe driver.\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
\r
if (UsingIpv6) {\r
gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);\r
+ Wrap->TcpWrap.Rx6Token.CompletionToken.Event = NULL;\r
\r
if (EFI_ERROR (Wrap->TcpWrap.Rx6Token.CompletionToken.Status)) {\r
+ DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx6Token.CompletionToken.Status));\r
Wrap->HttpToken->Status = Wrap->TcpWrap.Rx6Token.CompletionToken.Status;\r
gBS->SignalEvent (Wrap->HttpToken->Event);\r
+\r
+ Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken);\r
+ if (Item != NULL) {\r
+ NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
+ }\r
+ \r
FreePool (Wrap);\r
+ Wrap = NULL;\r
+ \r
return ;\r
}\r
\r
} else {\r
gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event);\r
+ Wrap->TcpWrap.Rx4Token.CompletionToken.Event = NULL;\r
\r
if (EFI_ERROR (Wrap->TcpWrap.Rx4Token.CompletionToken.Status)) {\r
+ DEBUG ((EFI_D_ERROR, "HttpTcpReceiveNotifyDpc: %r!\n", Wrap->TcpWrap.Rx4Token.CompletionToken.Status));\r
Wrap->HttpToken->Status = Wrap->TcpWrap.Rx4Token.CompletionToken.Status;\r
gBS->SignalEvent (Wrap->HttpToken->Event);\r
+ \r
+ Item = NetMapFindKey (&HttpInstance->RxTokens, Wrap->HttpToken);\r
+ if (Item != NULL) {\r
+ NetMapRemoveItem (&HttpInstance->RxTokens, Item, NULL);\r
+ }\r
+ \r
FreePool (Wrap);\r
+ Wrap = NULL;\r
+ \r
return ;\r
}\r
}\r
// Check pending RxTokens and receive the HTTP message.\r
//\r
NetMapIterate (&Wrap->HttpInstance->RxTokens, HttpTcpReceive, NULL);\r
- \r
+\r
FreePool (Wrap);\r
+ Wrap = NULL;\r
}\r
\r
/**\r
Wrap,\r
&TcpWrap->Tx4Token.CompletionToken.Event\r
);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- \r
- TcpWrap->Tx4Data.Push = TRUE;\r
- TcpWrap->Tx4Data.Urgent = FALSE;\r
- TcpWrap->Tx4Data.FragmentCount = 1;\r
- TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data;\r
- TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY;\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ TcpWrap->Tx4Data.Push = TRUE;\r
+ TcpWrap->Tx4Data.Urgent = FALSE;\r
+ TcpWrap->Tx4Data.FragmentCount = 1;\r
+ TcpWrap->Tx4Token.Packet.TxData = &Wrap->TcpWrap.Tx4Data;\r
+ TcpWrap->Tx4Token.CompletionToken.Status = EFI_NOT_READY;\r
\r
} else {\r
Status = gBS->CreateEvent (\r
TcpWrap->Tx6Token.Packet.TxData = &Wrap->TcpWrap.Tx6Data;\r
TcpWrap->Tx6Token.CompletionToken.Status =EFI_NOT_READY;\r
\r
- \r
}\r
\r
return EFI_SUCCESS;\r
EFI_STATUS Status;\r
CHAR8 *RequestMsg;\r
CHAR8 *Url;\r
+ UINTN UrlSize;\r
UINTN RequestMsgSize;\r
\r
ValueInItem = (HTTP_TOKEN_WRAP *) Item->Value;\r
//\r
// Parse the URI of the remote host.\r
//\r
- Url = AllocatePool (StrLen (ValueInItem->HttpToken->Message->Data.Request->Url) + 1);\r
+ UrlSize = StrLen (ValueInItem->HttpToken->Message->Data.Request->Url) + 1;\r
+ Url = AllocatePool (UrlSize);\r
if (Url == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- UnicodeStrToAsciiStr (ValueInItem->HttpToken->Message->Data.Request->Url, Url);\r
+ UnicodeStrToAsciiStrS (ValueInItem->HttpToken->Message->Data.Request->Url, Url, UrlSize);\r
\r
//\r
// Create request message.\r
}\r
\r
if (!HttpInstance->IsRxDone) {\r
+ //\r
+ // Cancle the Token before close its Event.\r
+ //\r
+ Tcp4->Cancel (HttpInstance->Tcp4, &Rx4Token->CompletionToken);\r
gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
Rx4Token->CompletionToken.Status = EFI_TIMEOUT;\r
}\r
}\r
\r
if (!HttpInstance->IsRxDone) {\r
+ //\r
+ // Cancle the Token before close its Event.\r
+ //\r
+ Tcp6->Cancel (HttpInstance->Tcp6, &Rx6Token->CompletionToken);\r
gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
Rx6Token->CompletionToken.Status = EFI_TIMEOUT;\r
}\r
\r
@param[in] Wrap The HTTP token's wrap data.\r
@param[in] HttpMsg The HTTP message data.\r
- @param[in] Timeout The time to wait for receiving the body packet.\r
\r
@retval EFI_SUCCESS The HTTP body is received. \r
@retval Others Other error as indicated.\r
EFI_STATUS\r
HttpTcpReceiveBody (\r
IN HTTP_TOKEN_WRAP *Wrap,\r
- IN EFI_HTTP_MESSAGE *HttpMsg,\r
- IN EFI_EVENT Timeout\r
+ IN EFI_HTTP_MESSAGE *HttpMsg\r
)\r
{\r
EFI_STATUS Status;\r
DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status));\r
return Status;\r
}\r
-\r
- while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {\r
- Tcp6->Poll (Tcp6);\r
- }\r
-\r
- if (!Wrap->TcpWrap.IsRxDone) {\r
- gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
- Rx6Token->CompletionToken.Status = EFI_TIMEOUT;\r
- Wrap->HttpToken->Status = Rx6Token->CompletionToken.Status;\r
- gBS->SignalEvent (Wrap->HttpToken->Event);\r
- }\r
} else {\r
Rx4Token = &Wrap->TcpWrap.Rx4Token;\r
Rx4Token->Packet.RxData->DataLength = (UINT32) HttpMsg->BodyLength;\r
DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status));\r
return Status;\r
}\r
-\r
- while (!Wrap->TcpWrap.IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {\r
- Tcp4->Poll (Tcp4);\r
- }\r
-\r
- if (!Wrap->TcpWrap.IsRxDone) {\r
- gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
- Rx4Token->CompletionToken.Status = EFI_TIMEOUT;\r
- Wrap->HttpToken->Status = Rx4Token->CompletionToken.Status;\r
- gBS->SignalEvent (Wrap->HttpToken->Event);\r
- }\r
}\r
\r
return EFI_SUCCESS;\r
Rx6Token = NULL;\r
\r
if (HttpInstance->LocalAddressIsIPv6) {\r
- if (Wrap->TcpWrap.Rx6Token.CompletionToken.Event != NULL) {\r
- gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);\r
- }\r
-\r
Rx6Token = &Wrap->TcpWrap.Rx6Token;\r
- if (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
- FreePool (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
- Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r
+ \r
+ if (Rx6Token->CompletionToken.Event != NULL) {\r
+ gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
+ Rx6Token->CompletionToken.Event = NULL;\r
}\r
- FreePool (Wrap);\r
\r
- if (HttpInstance->Rx6Token.CompletionToken.Event != NULL) {\r
- gBS->CloseEvent (HttpInstance->Rx6Token.CompletionToken.Event);\r
- HttpInstance->Rx6Token.CompletionToken.Event = NULL;\r
- }\r
+ FreePool (Wrap);\r
\r
Rx6Token = &HttpInstance->Rx6Token;\r
+ \r
+ if (Rx6Token->CompletionToken.Event != NULL) {\r
+ gBS->CloseEvent (Rx6Token->CompletionToken.Event);\r
+ Rx6Token->CompletionToken.Event = NULL;\r
+ }\r
+ \r
if (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
FreePool (Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
Rx6Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r
}\r
\r
} else {\r
- if (Wrap->TcpWrap.Rx4Token.CompletionToken.Event != NULL) {\r
- gBS->CloseEvent (Wrap->TcpWrap.Rx4Token.CompletionToken.Event);\r
- }\r
Rx4Token = &Wrap->TcpWrap.Rx4Token;\r
- if (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
- FreePool (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
- Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r
+ \r
+ if (Rx4Token->CompletionToken.Event != NULL) {\r
+ gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
+ Rx4Token->CompletionToken.Event = NULL;\r
}\r
+ \r
FreePool (Wrap);\r
\r
- if (HttpInstance->Rx4Token.CompletionToken.Event != NULL) {\r
- gBS->CloseEvent (HttpInstance->Rx4Token.CompletionToken.Event);\r
- HttpInstance->Rx4Token.CompletionToken.Event = NULL;\r
+ Rx4Token = &HttpInstance->Rx4Token;\r
+\r
+ if (Rx4Token->CompletionToken.Event != NULL) {\r
+ gBS->CloseEvent (Rx4Token->CompletionToken.Event);\r
+ Rx4Token->CompletionToken.Event = NULL;\r
}\r
\r
- Rx4Token = &HttpInstance->Rx4Token;\r
+ \r
if (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer != NULL) {\r
FreePool (Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer);\r
Rx4Token->Packet.RxData->FragmentTable[0].FragmentBuffer = NULL;\r