mirror of
https://github.com/acidanthera/audk.git
synced 2025-04-08 17:05:09 +02:00
NetworkPkg: Fix the HttpCloseConnection fail issue
When HTTP server is unavailable,HttpCloseConnection will enter infinite loop to wait for TCP4->close Event return, So we need to decide the Http Instance state whether in the appropriate state before close it. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Zhang Lubo <lubo.zhang@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18400 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
0a4f7aa056
commit
374ecd0450
NetworkPkg/HttpDxe
@ -516,6 +516,7 @@ Error2:
|
||||
HttpCloseTcp4ConnCloseEvent (HttpInstance);
|
||||
if (NULL != Wrap->TcpWrap.TxToken.CompletionToken.Event) {
|
||||
gBS->CloseEvent (Wrap->TcpWrap.TxToken.CompletionToken.Event);
|
||||
Wrap->TcpWrap.TxToken.CompletionToken.Event = NULL;
|
||||
}
|
||||
|
||||
Error1:
|
||||
|
@ -243,10 +243,12 @@ HttpCloseTcp4ConnCloseEvent (
|
||||
|
||||
if (NULL != HttpInstance->ConnToken.CompletionToken.Event) {
|
||||
gBS->CloseEvent (HttpInstance->ConnToken.CompletionToken.Event);
|
||||
HttpInstance->ConnToken.CompletionToken.Event = NULL;
|
||||
}
|
||||
|
||||
if (NULL != HttpInstance->CloseToken.CompletionToken.Event) {
|
||||
gBS->CloseEvent(HttpInstance->CloseToken.CompletionToken.Event);
|
||||
HttpInstance->CloseToken.CompletionToken.Event = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -581,21 +583,22 @@ HttpCloseConnection (
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
HttpInstance->CloseToken.AbortOnClose = TRUE;
|
||||
HttpInstance->IsCloseDone = FALSE;
|
||||
|
||||
if (HttpInstance->State == HTTP_STATE_TCP_CONNECTED) {
|
||||
HttpInstance->CloseToken.AbortOnClose = TRUE;
|
||||
HttpInstance->IsCloseDone = FALSE;
|
||||
|
||||
Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = HttpInstance->Tcp4->Close (HttpInstance->Tcp4, &HttpInstance->CloseToken);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
while (!HttpInstance->IsCloseDone) {
|
||||
HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
|
||||
while (!HttpInstance->IsCloseDone) {
|
||||
HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
|
||||
}
|
||||
}
|
||||
|
||||
HttpInstance->State = HTTP_STATE_TCP_CLOSED;
|
||||
return Status;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user