This patch is used to handle handle HTTPS indefinite poll
case.
Cc: El-Haj-Mahmoud Samer <[email protected]>
Cc: Ye Ting <[email protected]>
Cc: Fu Siyuan <[email protected]>
Cc: Long Qin <[email protected]>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <[email protected]>
---
NetworkPkg/HttpDxe/HttpImpl.c | 55 ++++++++++++++++++----------------
NetworkPkg/HttpDxe/HttpProto.c | 68 ++++++++++++++++++++++++++++++++++++++----
2 files changed, 93 insertions(+), 30 deletions(-)
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index cf58b13..cd8fe05 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1179,47 +1179,50 @@ HttpResponseWorker (
}
}
ASSERT (HttpInstance->MsgParser != NULL);
- //
- // We still need receive more data when there is no cache data and MsgParser
is not NULL;
- //
- if (!HttpInstance->UseHttps) {
- if (HttpInstance->TimeoutEvent == NULL) {
- //
- // Create TimeoutEvent for response
- //
- Status = gBS->CreateEvent (
- EVT_TIMER,
- TPL_CALLBACK,
- NULL,
- NULL,
- &HttpInstance->TimeoutEvent
- );
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- }
-
+ if (HttpInstance->TimeoutEvent == NULL) {
//
- // Start the timer, and wait Timeout seconds to receive the body packet.
+ // Create TimeoutEvent for response
//
- Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative,
HTTP_RESPONSE_TIMEOUT * TICKS_PER_SECOND);
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &HttpInstance->TimeoutEvent
+ );
if (EFI_ERROR (Status)) {
goto Error;
}
-
+ }
+
+ //
+ // Start the timer, and wait Timeout seconds to receive the body packet.
+ //
+ Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative,
HTTP_RESPONSE_TIMEOUT * TICKS_PER_SECOND);
+ if (EFI_ERROR (Status)) {
+ goto Error;
+ }
+
+ //
+ // We still need receive more data when there is no cache data and MsgParser
is not NULL;
+ //
+ if (!HttpInstance->UseHttps) {
Status = HttpTcpReceiveBody (Wrap, HttpMsg, HttpInstance->TimeoutEvent);
gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
if (EFI_ERROR (Status)) {
goto Error;
}
} else {
- Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+ Status = HttpsReceive (HttpInstance, &Fragment,
HttpInstance->TimeoutEvent);
+
+ gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+
if (EFI_ERROR (Status)) {
goto Error;
}
//
@@ -1315,11 +1318,13 @@ Exit:
Error2:
NetMapInsertHead (&HttpInstance->TxTokens, ValueInItem->HttpToken,
ValueInItem);
Error:
- HttpTcpTokenCleanup (Wrap);
+ if (!HttpInstance->UseHttps) {
+ HttpTcpTokenCleanup (Wrap);
+ }
if (HttpHeaders != NULL) {
FreePool (HttpHeaders);
HttpHeaders = NULL;
}
diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 965a49f..ebb9dd9 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1230,11 +1230,40 @@ HttpConnectTcp4 (
//
// Tls session connection.
//
if (HttpInstance->UseHttps) {
- Status = TlsConnectSession (HttpInstance, NULL);
+ if (HttpInstance->TimeoutEvent == NULL) {
+ //
+ // Create TimeoutEvent for TLS connection.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &HttpInstance->TimeoutEvent
+ );
+ if (EFI_ERROR (Status)) {
+ TlsCloseTxRxEvent (HttpInstance);
+ return Status;
+ }
+ }
+
+ //
+ // Start the timer, and wait Timeout seconds for connection.
+ //
+ Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative,
HTTP_CONNECTION_TIMEOUT * TICKS_PER_SECOND);
+ if (EFI_ERROR (Status)) {
+ TlsCloseTxRxEvent (HttpInstance);
+ return Status;
+ }
+
+ Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
+
+ gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+
if (EFI_ERROR (Status)) {
TlsCloseTxRxEvent (HttpInstance);
return Status;
}
}
@@ -1293,11 +1322,40 @@ HttpConnectTcp6 (
//
// Tls session connection.
//
if (HttpInstance->UseHttps) {
- Status = TlsConnectSession (HttpInstance, NULL);
+ if (HttpInstance->TimeoutEvent == NULL) {
+ //
+ // Create TimeoutEvent for TLS connection.
+ //
+ Status = gBS->CreateEvent (
+ EVT_TIMER,
+ TPL_CALLBACK,
+ NULL,
+ NULL,
+ &HttpInstance->TimeoutEvent
+ );
+ if (EFI_ERROR (Status)) {
+ TlsCloseTxRxEvent (HttpInstance);
+ return Status;
+ }
+ }
+
+ //
+ // Start the timer, and wait Timeout seconds for connection.
+ //
+ Status = gBS->SetTimer (HttpInstance->TimeoutEvent, TimerRelative,
HTTP_CONNECTION_TIMEOUT * TICKS_PER_SECOND);
+ if (EFI_ERROR (Status)) {
+ TlsCloseTxRxEvent (HttpInstance);
+ return Status;
+ }
+
+ Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
+
+ gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
+
if (EFI_ERROR (Status)) {
TlsCloseTxRxEvent (HttpInstance);
return Status;
}
}
@@ -1758,11 +1816,11 @@ HttpTcpReceiveHeader (
if (Fragment.Bulk != NULL) {
FreePool (Fragment.Bulk);
Fragment.Bulk = NULL;
}
- Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+ Status = HttpsReceive (HttpInstance, &Fragment, Timeout);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "Tcp4 receive failed: %r\n", Status));
return Status;
}
}
@@ -1838,11 +1896,11 @@ HttpTcpReceiveHeader (
}
if (!HttpInstance->IsRxDone) {
gBS->CloseEvent (Rx6Token->CompletionToken.Event);
Rx6Token->CompletionToken.Status = EFI_TIMEOUT;
- }
+ }
Status = Rx6Token->CompletionToken.Status;
if (EFI_ERROR (Status)) {
return Status;
}
@@ -1853,11 +1911,11 @@ HttpTcpReceiveHeader (
if (Fragment.Bulk != NULL) {
FreePool (Fragment.Bulk);
Fragment.Bulk = NULL;
}
- Status = HttpsReceive (HttpInstance, &Fragment, NULL);
+ Status = HttpsReceive (HttpInstance, &Fragment, Timeout);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "Tcp6 receive failed: %r\n", Status));
return Status;
}
}
--
1.9.5.msysgit.1
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel