public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Http Fixes
       [not found] <20220304130403.47832-1-osteffen@redhat.com>
@ 2022-03-08 13:21 ` Oliver Steffen
  2022-03-08 13:21   ` [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
                     ` (3 more replies)
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
  2 siblings, 4 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-08 13:21 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

This set of patches fixes booting from HTTP/1.0 servers.
It also improves the interaction with HTTP/1.1 servers by recognizing
the 'Connection: close' header field, which fixes a problem with
servers that close the connection after a 404-error is encountered.

It also prevents triggering the TCP issue described in
https://bugzilla.tianocore.org/show_bug.cgi?id=3735
when booting from HTTP/1.0 servers.

PR: https://github.com/tianocore/edk2/pull/2564

Oliver Steffen (4):
  NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  NetworkPkg/HttpDxe: Detect 'Connection: close' header
  NetworkPkg/HttpDxe: Detect HTTP/1.0 servers

 NetworkPkg/HttpDxe/HttpProto.h |  2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 25 ++++++++++++++++++++++++-
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)

-- 
2.35.1


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
@ 2022-03-08 13:21   ` Oliver Steffen
  2022-03-09  9:29     ` [edk2-devel] " Gerd Hoffmann
  2022-03-08 13:21   ` [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 28+ messages in thread
From: Oliver Steffen @ 2022-03-08 13:21 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
HTTP_STATE_TCP_CLOSED and de-configure the Tcp4 instance before
configuring it again.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 9457dd2623d3..cd54c574044b 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1086,6 +1086,18 @@ HttpConfigureTcp4 (
   Tcp4Option->EnableNagle       = TRUE;
   Tcp4CfgData->ControlOption    = Tcp4Option;
 
+  if ((HttpInstance->State == HTTP_STATE_TCP_CONNECTED) ||
+      (HttpInstance->State == HTTP_STATE_TCP_CLOSED))
+  {
+    Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, NULL);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4(NULL) - %r\n", Status));
+      return Status;
+    }
+
+    HttpInstance->State = HTTP_STATE_TCP_UNCONFIGED;
+  }
+
   Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, Tcp4CfgData);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4 - %r\n", Status));
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
  2022-03-08 13:21   ` [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
@ 2022-03-08 13:21   ` Oliver Steffen
  2022-03-09  9:31     ` [edk2-devel] " Gerd Hoffmann
  2022-03-08 13:21   ` [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
  2022-03-08 13:21   ` [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
  3 siblings, 1 reply; 28+ messages in thread
From: Oliver Steffen @ 2022-03-08 13:21 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Add ConnectionClose flag to HTTP_PROTOCOL.
This boolean is FALSE by default. If set to TRUE, a reconfigure
of the Http instance is forced on the next request. The flag
is then reset.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.h | 2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h
index 8ed99c7a02d3..620eb3915843 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -194,6 +194,8 @@ typedef struct _HTTP_PROTOCOL {
   EFI_TCP6_IO_TOKEN                 Tcp6TlsRxToken;
   EFI_TCP6_RECEIVE_DATA             Tcp6TlsRxData;
   BOOLEAN                           TlsIsRxDone;
+
+  BOOLEAN                           ConnectionClose;
 } HTTP_PROTOCOL;
 
 typedef struct {
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d64cd9e965c0..d8b014c94f3a 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -161,6 +161,7 @@ EfiHttpConfigure (
     HttpInstance->HttpVersion        = HttpConfigData->HttpVersion;
     HttpInstance->TimeOutMillisec    = HttpConfigData->TimeOutMillisec;
     HttpInstance->LocalAddressIsIPv6 = HttpConfigData->LocalAddressIsIPv6;
+    HttpInstance->ConnectionClose    = FALSE;
 
     if (HttpConfigData->LocalAddressIsIPv6) {
       CopyMem (
@@ -440,7 +441,8 @@ EfiHttpRequest (
       //
       ReConfigure = FALSE;
     } else {
-      if ((HttpInstance->RemotePort == RemotePort) &&
+      if ((HttpInstance->ConnectionClose == FALSE) &&
+          (HttpInstance->RemotePort == RemotePort) &&
           (AsciiStrCmp (HttpInstance->RemoteHost, HostName) == 0) &&
           (!HttpInstance->UseHttps || (HttpInstance->UseHttps &&
                                        !TlsConfigure &&
@@ -649,6 +651,8 @@ EfiHttpRequest (
     }
   }
 
+  HttpInstance->ConnectionClose = FALSE;
+
   //
   // Transmit the request message.
   //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
  2022-03-08 13:21   ` [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
  2022-03-08 13:21   ` [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
@ 2022-03-08 13:21   ` Oliver Steffen
  2022-03-09  9:30     ` [edk2-devel] " Gerd Hoffmann
  2022-03-08 13:21   ` [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
  3 siblings, 1 reply; 28+ messages in thread
From: Oliver Steffen @ 2022-03-08 13:21 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server sends the 'Connection: close' header.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d8b014c94f3a..d40d55ac92ad 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -994,6 +994,7 @@ HttpResponseWorker (
   UINTN             HdrLen;
   NET_FRAGMENT      Fragment;
   UINT32            TimeoutValue;
+  UINTN             index;
 
   if ((Wrap == NULL) || (Wrap->HttpInstance == NULL)) {
     return EFI_INVALID_PARAMETER;
@@ -1200,6 +1201,16 @@ HttpResponseWorker (
       FreePool (HttpHeaders);
       HttpHeaders = NULL;
 
+      for (index = 0; index < HttpMsg->HeaderCount; ++index) {
+        if ((AsciiStriCmp ("Connection", HttpMsg->Headers[index].FieldName) == 0) &&
+            (AsciiStriCmp ("close", HttpMsg->Headers[index].FieldValue) == 0))
+        {
+          DEBUG ((DEBUG_VERBOSE, "Http: 'Connection: close' header received.\n"));
+          HttpInstance->ConnectionClose = TRUE;
+          break;
+        }
+      }
+
       //
       // Init message-body parser by header information.
       //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
                     ` (2 preceding siblings ...)
  2022-03-08 13:21   ` [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
@ 2022-03-08 13:21   ` Oliver Steffen
  2022-03-09  9:30     ` [edk2-devel] " Gerd Hoffmann
  3 siblings, 1 reply; 28+ messages in thread
From: Oliver Steffen @ 2022-03-08 13:21 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server identifies as version 1.0.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d40d55ac92ad..623e029c606e 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1105,6 +1105,14 @@ HttpResponseWorker (
       HttpInstance->CacheLen = BodyLen;
     }
 
+    //
+    // Check server's HTTP version.
+    //
+    if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen ("HTTP/1.0")) == 0) {
+      DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting Connection close.\n"));
+      HttpInstance->ConnectionClose = TRUE;
+    }
+
     //
     // Search for Status Code.
     //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [edk2-devel] [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  2022-03-08 13:21   ` [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
@ 2022-03-09  9:29     ` Gerd Hoffmann
  0 siblings, 0 replies; 28+ messages in thread
From: Gerd Hoffmann @ 2022-03-09  9:29 UTC (permalink / raw)
  To: devel, osteffen

On Tue, Mar 08, 2022 at 02:21:01PM +0100, Oliver Steffen wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
> HTTP_STATE_TCP_CLOSED and de-configure the Tcp4 instance before
> configuring it again.
> 
> Signed-off-by: Oliver Steffen <osteffen@redhat.com>

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [edk2-devel] [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header
  2022-03-08 13:21   ` [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
@ 2022-03-09  9:30     ` Gerd Hoffmann
  0 siblings, 0 replies; 28+ messages in thread
From: Gerd Hoffmann @ 2022-03-09  9:30 UTC (permalink / raw)
  To: devel, osteffen

On Tue, Mar 08, 2022 at 02:21:03PM +0100, Oliver Steffen wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> Force connection close before the next request if
> the server sends the 'Connection: close' header.
> 
> Signed-off-by: Oliver Steffen <osteffen@redhat.com>

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [edk2-devel] [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers
  2022-03-08 13:21   ` [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
@ 2022-03-09  9:30     ` Gerd Hoffmann
  0 siblings, 0 replies; 28+ messages in thread
From: Gerd Hoffmann @ 2022-03-09  9:30 UTC (permalink / raw)
  To: devel, osteffen

On Tue, Mar 08, 2022 at 02:21:04PM +0100, Oliver Steffen wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> Force connection close before the next request if
> the server identifies as version 1.0.
> 
> Signed-off-by: Oliver Steffen <osteffen@redhat.com>

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [edk2-devel] [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  2022-03-08 13:21   ` [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
@ 2022-03-09  9:31     ` Gerd Hoffmann
  0 siblings, 0 replies; 28+ messages in thread
From: Gerd Hoffmann @ 2022-03-09  9:31 UTC (permalink / raw)
  To: devel, osteffen

On Tue, Mar 08, 2022 at 02:21:02PM +0100, Oliver Steffen wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> Add ConnectionClose flag to HTTP_PROTOCOL.
> This boolean is FALSE by default. If set to TRUE, a reconfigure
> of the Http instance is forced on the next request. The flag
> is then reset.

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v3 0/5] Http Fixes
       [not found] <20220304130403.47832-1-osteffen@redhat.com>
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
@ 2022-03-15 13:42 ` Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
                     ` (5 more replies)
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
  2 siblings, 6 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

This set of patches fixes booting from HTTP/1.0 servers.
It also improves the interaction with HTTP/1.1 servers by recognizing
the 'Connection: close' header field, which fixes a problem with
servers that close the connection after a 404-error is encountered.

It also prevents triggering the TCP issue described in
https://bugzilla.tianocore.org/show_bug.cgi?id=3735
when booting from HTTP/1.0 servers.

PR: https://github.com/tianocore/edk2/pull/2564

Oliver Steffen (5):
  NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  NetworkPkg/HttpDxe: Decofigure Tcp6 before reconfiguring
  NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  NetworkPkg/HttpDxe: Detect 'Connection: close' header
  NetworkPkg/HttpDxe: Detect HTTP/1.0 servers

 NetworkPkg/HttpDxe/HttpProto.h |  2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 25 ++++++++++++++++++++++++-
 NetworkPkg/HttpDxe/HttpProto.c | 24 ++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)

-- 
2.35.1


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
@ 2022-03-15 13:42   ` Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
HTTP_STATE_TCP_CLOSED and de-configure the Tcp4 instance before
configuring it again.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 9457dd2623d3..cd54c574044b 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1086,6 +1086,18 @@ HttpConfigureTcp4 (
   Tcp4Option->EnableNagle       = TRUE;
   Tcp4CfgData->ControlOption    = Tcp4Option;
 
+  if ((HttpInstance->State == HTTP_STATE_TCP_CONNECTED) ||
+      (HttpInstance->State == HTTP_STATE_TCP_CLOSED))
+  {
+    Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, NULL);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4(NULL) - %r\n", Status));
+      return Status;
+    }
+
+    HttpInstance->State = HTTP_STATE_TCP_UNCONFIGED;
+  }
+
   Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, Tcp4CfgData);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4 - %r\n", Status));
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 before reconfiguring
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
@ 2022-03-15 13:42   ` Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
HTTP_STATE_TCP_CLOSED and de-configure the Tcp6 instance before
configuring it again.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index cd54c574044b..33ae622c3f0b 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1168,6 +1168,18 @@ HttpConfigureTcp6 (
   Tcp6Option->KeepAliveInterval = HTTP_KEEP_ALIVE_INTERVAL;
   Tcp6Option->EnableNagle       = TRUE;
 
+  if ((HttpInstance->State == HTTP_STATE_TCP_CONNECTED) ||
+      (HttpInstance->State == HTTP_STATE_TCP_CLOSED))
+  {
+    Status = HttpInstance->Tcp6->Configure (HttpInstance->Tcp6, NULL);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "HttpConfigureTcp6(NULL) - %r\n", Status));
+      return Status;
+    }
+
+    HttpInstance->State = HTTP_STATE_TCP_UNCONFIGED;
+  }
+
   Status = HttpInstance->Tcp6->Configure (HttpInstance->Tcp6, Tcp6CfgData);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "HttpConfigureTcp6 - %r\n", Status));
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
@ 2022-03-15 13:42   ` Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
                     ` (2 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Add ConnectionClose flag to HTTP_PROTOCOL.
This boolean is FALSE by default. If set to TRUE, a reconfigure
of the Http instance is forced on the next request. The flag
is then reset.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.h | 2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h
index 8ed99c7a02d3..620eb3915843 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -194,6 +194,8 @@ typedef struct _HTTP_PROTOCOL {
   EFI_TCP6_IO_TOKEN                 Tcp6TlsRxToken;
   EFI_TCP6_RECEIVE_DATA             Tcp6TlsRxData;
   BOOLEAN                           TlsIsRxDone;
+
+  BOOLEAN                           ConnectionClose;
 } HTTP_PROTOCOL;
 
 typedef struct {
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d64cd9e965c0..d8b014c94f3a 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -161,6 +161,7 @@ EfiHttpConfigure (
     HttpInstance->HttpVersion        = HttpConfigData->HttpVersion;
     HttpInstance->TimeOutMillisec    = HttpConfigData->TimeOutMillisec;
     HttpInstance->LocalAddressIsIPv6 = HttpConfigData->LocalAddressIsIPv6;
+    HttpInstance->ConnectionClose    = FALSE;
 
     if (HttpConfigData->LocalAddressIsIPv6) {
       CopyMem (
@@ -440,7 +441,8 @@ EfiHttpRequest (
       //
       ReConfigure = FALSE;
     } else {
-      if ((HttpInstance->RemotePort == RemotePort) &&
+      if ((HttpInstance->ConnectionClose == FALSE) &&
+          (HttpInstance->RemotePort == RemotePort) &&
           (AsciiStrCmp (HttpInstance->RemoteHost, HostName) == 0) &&
           (!HttpInstance->UseHttps || (HttpInstance->UseHttps &&
                                        !TlsConfigure &&
@@ -649,6 +651,8 @@ EfiHttpRequest (
     }
   }
 
+  HttpInstance->ConnectionClose = FALSE;
+
   //
   // Transmit the request message.
   //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
                     ` (2 preceding siblings ...)
  2022-03-15 13:42   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
@ 2022-03-15 13:42   ` Oliver Steffen
  2022-03-15 13:42   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
  2022-03-16 10:36   ` [edk2-devel] [PATCH v3 0/5] Http Fixes Gerd Hoffmann
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server sends the 'Connection: close' header.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d8b014c94f3a..d40d55ac92ad 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -994,6 +994,7 @@ HttpResponseWorker (
   UINTN             HdrLen;
   NET_FRAGMENT      Fragment;
   UINT32            TimeoutValue;
+  UINTN             index;
 
   if ((Wrap == NULL) || (Wrap->HttpInstance == NULL)) {
     return EFI_INVALID_PARAMETER;
@@ -1200,6 +1201,16 @@ HttpResponseWorker (
       FreePool (HttpHeaders);
       HttpHeaders = NULL;
 
+      for (index = 0; index < HttpMsg->HeaderCount; ++index) {
+        if ((AsciiStriCmp ("Connection", HttpMsg->Headers[index].FieldName) == 0) &&
+            (AsciiStriCmp ("close", HttpMsg->Headers[index].FieldValue) == 0))
+        {
+          DEBUG ((DEBUG_VERBOSE, "Http: 'Connection: close' header received.\n"));
+          HttpInstance->ConnectionClose = TRUE;
+          break;
+        }
+      }
+
       //
       // Init message-body parser by header information.
       //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
                     ` (3 preceding siblings ...)
  2022-03-15 13:42   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
@ 2022-03-15 13:42   ` Oliver Steffen
  2022-03-16 10:36   ` [edk2-devel] [PATCH v3 0/5] Http Fixes Gerd Hoffmann
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-15 13:42 UTC (permalink / raw)
  To: devel; +Cc: Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server identifies as version 1.0.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d40d55ac92ad..623e029c606e 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1105,6 +1105,14 @@ HttpResponseWorker (
       HttpInstance->CacheLen = BodyLen;
     }
 
+    //
+    // Check server's HTTP version.
+    //
+    if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen ("HTTP/1.0")) == 0) {
+      DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting Connection close.\n"));
+      HttpInstance->ConnectionClose = TRUE;
+    }
+
     //
     // Search for Status Code.
     //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [edk2-devel] [PATCH v3 0/5] Http Fixes
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
                     ` (4 preceding siblings ...)
  2022-03-15 13:42   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
@ 2022-03-16 10:36   ` Gerd Hoffmann
  5 siblings, 0 replies; 28+ messages in thread
From: Gerd Hoffmann @ 2022-03-16 10:36 UTC (permalink / raw)
  To: devel, osteffen

On Tue, Mar 15, 2022 at 02:42:24PM +0100, Oliver Steffen wrote:
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> This set of patches fixes booting from HTTP/1.0 servers.
> It also improves the interaction with HTTP/1.1 servers by recognizing
> the 'Connection: close' header field, which fixes a problem with
> servers that close the connection after a 404-error is encountered.
> 
> It also prevents triggering the TCP issue described in
> https://bugzilla.tianocore.org/show_bug.cgi?id=3735
> when booting from HTTP/1.0 servers.
> 
> PR: https://github.com/tianocore/edk2/pull/2564

Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>

take care,
  Gerd


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v3 0/5] Http Fixes (Take Two)
       [not found] <20220304130403.47832-1-osteffen@redhat.com>
  2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
  2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
@ 2022-03-22 13:30 ` Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
                     ` (5 more replies)
  2 siblings, 6 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

This set of patches fixes booting from HTTP/1.0 servers.
It also improves the interaction with HTTP/1.1 servers by recognizing
the 'Connection: close' header field, which fixes a problem with
servers that close the connection after a 404-error is encountered.

It also prevents triggering the TCP issue described in
https://bugzilla.tianocore.org/show_bug.cgi?id=3735
when booting from HTTP/1.0 servers.

PR: https://github.com/tianocore/edk2/pull/2564

Oliver Steffen (5):
  NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  NetworkPkg/HttpDxe: Decofigure Tcp6 before reconfiguring
  NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  NetworkPkg/HttpDxe: Detect 'Connection: close' header
  NetworkPkg/HttpDxe: Detect HTTP/1.0 servers

 NetworkPkg/HttpDxe/HttpProto.h |  2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 25 ++++++++++++++++++++++++-
 NetworkPkg/HttpDxe/HttpProto.c | 24 ++++++++++++++++++++++++
 3 files changed, 50 insertions(+), 1 deletion(-)

-- 
2.35.1


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
@ 2022-03-22 13:30   ` Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
                     ` (4 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
HTTP_STATE_TCP_CLOSED and de-configure the Tcp4 instance before
configuring it again.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index 9457dd2623d3..cd54c574044b 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1086,6 +1086,18 @@ HttpConfigureTcp4 (
   Tcp4Option->EnableNagle       = TRUE;
   Tcp4CfgData->ControlOption    = Tcp4Option;
 
+  if ((HttpInstance->State == HTTP_STATE_TCP_CONNECTED) ||
+      (HttpInstance->State == HTTP_STATE_TCP_CLOSED))
+  {
+    Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, NULL);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4(NULL) - %r\n", Status));
+      return Status;
+    }
+
+    HttpInstance->State = HTTP_STATE_TCP_UNCONFIGED;
+  }
+
   Status = HttpInstance->Tcp4->Configure (HttpInstance->Tcp4, Tcp4CfgData);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "HttpConfigureTcp4 - %r\n", Status));
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 before reconfiguring
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
@ 2022-03-22 13:30   ` Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
                     ` (3 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Check if the state of the HTTP instance is HTTP_STATE_TCP_CONNECTED, or
HTTP_STATE_TCP_CLOSED and de-configure the Tcp6 instance before
configuring it again.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c
index cd54c574044b..33ae622c3f0b 100644
--- a/NetworkPkg/HttpDxe/HttpProto.c
+++ b/NetworkPkg/HttpDxe/HttpProto.c
@@ -1168,6 +1168,18 @@ HttpConfigureTcp6 (
   Tcp6Option->KeepAliveInterval = HTTP_KEEP_ALIVE_INTERVAL;
   Tcp6Option->EnableNagle       = TRUE;
 
+  if ((HttpInstance->State == HTTP_STATE_TCP_CONNECTED) ||
+      (HttpInstance->State == HTTP_STATE_TCP_CLOSED))
+  {
+    Status = HttpInstance->Tcp6->Configure (HttpInstance->Tcp6, NULL);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "HttpConfigureTcp6(NULL) - %r\n", Status));
+      return Status;
+    }
+
+    HttpInstance->State = HTTP_STATE_TCP_UNCONFIGED;
+  }
+
   Status = HttpInstance->Tcp6->Configure (HttpInstance->Tcp6, Tcp6CfgData);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "HttpConfigureTcp6 - %r\n", Status));
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
@ 2022-03-22 13:30   ` Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
                     ` (2 subsequent siblings)
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Add ConnectionClose flag to HTTP_PROTOCOL.
This boolean is FALSE by default. If set to TRUE, a reconfigure
of the Http instance is forced on the next request. The flag
is then reset.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpProto.h | 2 ++
 NetworkPkg/HttpDxe/HttpImpl.c  | 6 +++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h
index 8ed99c7a02d3..620eb3915843 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -194,6 +194,8 @@ typedef struct _HTTP_PROTOCOL {
   EFI_TCP6_IO_TOKEN                 Tcp6TlsRxToken;
   EFI_TCP6_RECEIVE_DATA             Tcp6TlsRxData;
   BOOLEAN                           TlsIsRxDone;
+
+  BOOLEAN                           ConnectionClose;
 } HTTP_PROTOCOL;
 
 typedef struct {
diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d64cd9e965c0..d8b014c94f3a 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -161,6 +161,7 @@ EfiHttpConfigure (
     HttpInstance->HttpVersion        = HttpConfigData->HttpVersion;
     HttpInstance->TimeOutMillisec    = HttpConfigData->TimeOutMillisec;
     HttpInstance->LocalAddressIsIPv6 = HttpConfigData->LocalAddressIsIPv6;
+    HttpInstance->ConnectionClose    = FALSE;
 
     if (HttpConfigData->LocalAddressIsIPv6) {
       CopyMem (
@@ -440,7 +441,8 @@ EfiHttpRequest (
       //
       ReConfigure = FALSE;
     } else {
-      if ((HttpInstance->RemotePort == RemotePort) &&
+      if ((HttpInstance->ConnectionClose == FALSE) &&
+          (HttpInstance->RemotePort == RemotePort) &&
           (AsciiStrCmp (HttpInstance->RemoteHost, HostName) == 0) &&
           (!HttpInstance->UseHttps || (HttpInstance->UseHttps &&
                                        !TlsConfigure &&
@@ -649,6 +651,8 @@ EfiHttpRequest (
     }
   }
 
+  HttpInstance->ConnectionClose = FALSE;
+
   //
   // Transmit the request message.
   //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
                     ` (2 preceding siblings ...)
  2022-03-22 13:30   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
@ 2022-03-22 13:30   ` Oliver Steffen
  2022-03-22 13:30   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
  2022-03-23  1:19   ` 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two) gaoliming
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server sends the 'Connection: close' header.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d8b014c94f3a..d40d55ac92ad 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -994,6 +994,7 @@ HttpResponseWorker (
   UINTN             HdrLen;
   NET_FRAGMENT      Fragment;
   UINT32            TimeoutValue;
+  UINTN             index;
 
   if ((Wrap == NULL) || (Wrap->HttpInstance == NULL)) {
     return EFI_INVALID_PARAMETER;
@@ -1200,6 +1201,16 @@ HttpResponseWorker (
       FreePool (HttpHeaders);
       HttpHeaders = NULL;
 
+      for (index = 0; index < HttpMsg->HeaderCount; ++index) {
+        if ((AsciiStriCmp ("Connection", HttpMsg->Headers[index].FieldName) == 0) &&
+            (AsciiStriCmp ("close", HttpMsg->Headers[index].FieldValue) == 0))
+        {
+          DEBUG ((DEBUG_VERBOSE, "Http: 'Connection: close' header received.\n"));
+          HttpInstance->ConnectionClose = TRUE;
+          break;
+        }
+      }
+
       //
       // Init message-body parser by header information.
       //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
                     ` (3 preceding siblings ...)
  2022-03-22 13:30   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
@ 2022-03-22 13:30   ` Oliver Steffen
  2022-03-23  1:19   ` 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two) gaoliming
  5 siblings, 0 replies; 28+ messages in thread
From: Oliver Steffen @ 2022-03-22 13:30 UTC (permalink / raw)
  To: devel; +Cc: maciej.rabeda, jiaxin.wu, siyuan.fu, kraxel, Oliver Steffen

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720

Force connection close before the next request if
the server identifies as version 1.0.

Signed-off-by: Oliver Steffen <osteffen@redhat.com>
---
 NetworkPkg/HttpDxe/HttpImpl.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c
index d40d55ac92ad..623e029c606e 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1105,6 +1105,14 @@ HttpResponseWorker (
       HttpInstance->CacheLen = BodyLen;
     }
 
+    //
+    // Check server's HTTP version.
+    //
+    if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen ("HTTP/1.0")) == 0) {
+      DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting Connection close.\n"));
+      HttpInstance->ConnectionClose = TRUE;
+    }
+
     //
     // Search for Status Code.
     //
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
                     ` (4 preceding siblings ...)
  2022-03-22 13:30   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
@ 2022-03-23  1:19   ` gaoliming
  2022-04-07  9:57     ` Gerd Hoffmann
  5 siblings, 1 reply; 28+ messages in thread
From: gaoliming @ 2022-03-23  1:19 UTC (permalink / raw)
  To: devel, osteffen, maciej.rabeda, jiaxin.wu, siyuan.fu; +Cc: kraxel

Maciej, Jiaxin and Siyuan:
  Can you help review this fix?

Thanks
Liming
> -----邮件原件-----
> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Oliver Steffen
> 发送时间: 2022年3月22日 21:30
> 收件人: devel@edk2.groups.io
> 抄送: maciej.rabeda@linux.intel.com; jiaxin.wu@intel.com;
> siyuan.fu@intel.com; kraxel@redhat.com; Oliver Steffen
> <osteffen@redhat.com>
> 主题: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2720
> 
> This set of patches fixes booting from HTTP/1.0 servers.
> It also improves the interaction with HTTP/1.1 servers by recognizing
> the 'Connection: close' header field, which fixes a problem with
> servers that close the connection after a 404-error is encountered.
> 
> It also prevents triggering the TCP issue described in
> https://bugzilla.tianocore.org/show_bug.cgi?id=3735
> when booting from HTTP/1.0 servers.
> 
> PR: https://github.com/tianocore/edk2/pull/2564
> 
> Oliver Steffen (5):
>   NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring
>   NetworkPkg/HttpDxe: Decofigure Tcp6 before reconfiguring
>   NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL
>   NetworkPkg/HttpDxe: Detect 'Connection: close' header
>   NetworkPkg/HttpDxe: Detect HTTP/1.0 servers
> 
>  NetworkPkg/HttpDxe/HttpProto.h |  2 ++
>  NetworkPkg/HttpDxe/HttpImpl.c  | 25 ++++++++++++++++++++++++-
>  NetworkPkg/HttpDxe/HttpProto.c | 24 ++++++++++++++++++++++++
>  3 files changed, 50 insertions(+), 1 deletion(-)
> 
> --
> 2.35.1
> 
> 
> 
> 
> 




^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-03-23  1:19   ` 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two) gaoliming
@ 2022-04-07  9:57     ` Gerd Hoffmann
  2022-04-07 12:46       ` Maciej Rabeda
  0 siblings, 1 reply; 28+ messages in thread
From: Gerd Hoffmann @ 2022-04-07  9:57 UTC (permalink / raw)
  To: devel, gaoliming; +Cc: osteffen, maciej.rabeda, jiaxin.wu, siyuan.fu

On Wed, Mar 23, 2022 at 09:19:09AM +0800, gaoliming wrote:
> Maciej, Jiaxin and Siyuan:
>   Can you help review this fix?

Ping.  Anything blocking the merge of these bugfixes?

thanks,
  Gerd


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-04-07  9:57     ` Gerd Hoffmann
@ 2022-04-07 12:46       ` Maciej Rabeda
  2022-04-07 12:55         ` Oliver Steffen
  0 siblings, 1 reply; 28+ messages in thread
From: Maciej Rabeda @ 2022-04-07 12:46 UTC (permalink / raw)
  To: Gerd Hoffmann, devel, gaoliming; +Cc: osteffen, jiaxin.wu, siyuan.fu

Hi Gerd,

Sorry, I can spare very little time for reviews these days...

I am alright with the patch with two cosmetic changes.

1. In HttpResponseWorker():

     if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen 
("HTTP/1.0")) == 0) {
       DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting 
Connection close.\n"));
       HttpInstance->ConnectionClose = TRUE;
     }

I'd change AsciiStrLen ("HTTP/1.0") to sizeof("HTTP/1.0") - 1. No need 
to call a AsciiStrLen every time this flow is executed, it is easily a 
compile-time thing.

2. In HttpResponseWorker(), index -> Index, coding standard.

I can merge this patch with changes above one I get an ACK from you.

Thanks,
Maciej

On 7 kwi 2022 11:57, Gerd Hoffmann wrote:
> On Wed, Mar 23, 2022 at 09:19:09AM +0800, gaoliming wrote:
>> Maciej, Jiaxin and Siyuan:
>>    Can you help review this fix?
> Ping.  Anything blocking the merge of these bugfixes?
>
> thanks,
>    Gerd
>

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-04-07 12:46       ` Maciej Rabeda
@ 2022-04-07 12:55         ` Oliver Steffen
  2022-04-08  9:07           ` Maciej Rabeda
  0 siblings, 1 reply; 28+ messages in thread
From: Oliver Steffen @ 2022-04-07 12:55 UTC (permalink / raw)
  To: Rabeda, Maciej, devel; +Cc: Gerd Hoffmann, gaoliming, jiaxin.wu, siyuan.fu

On Thu, Apr 7, 2022 at 2:46 PM Rabeda, Maciej
<maciej.rabeda@linux.intel.com> wrote:

> 1. In HttpResponseWorker():
>
>      if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen
> ("HTTP/1.0")) == 0) {
>        DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting
> Connection close.\n"));
>        HttpInstance->ConnectionClose = TRUE;
>      }
>
> I'd change AsciiStrLen ("HTTP/1.0") to sizeof("HTTP/1.0") - 1. No need
> to call a AsciiStrLen every time this flow is executed, it is easily a
> compile-time thing.

Yes, of course.

> 2. In HttpResponseWorker(), index -> Index, coding standard.

Sorry, I missed that one.

> I can merge this patch with changes above one I get an ACK from you.

Sounds good to me. Thank you!

-- Oliver


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-04-07 12:55         ` Oliver Steffen
@ 2022-04-08  9:07           ` Maciej Rabeda
  2022-04-11 15:24             ` Maciej Rabeda
  0 siblings, 1 reply; 28+ messages in thread
From: Maciej Rabeda @ 2022-04-08  9:07 UTC (permalink / raw)
  To: devel, osteffen; +Cc: Gerd Hoffmann, gaoliming, jiaxin.wu, siyuan.fu

Alright.

Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>

Merge soon.

On 7 kwi 2022 14:55, Oliver Steffen wrote:
> On Thu, Apr 7, 2022 at 2:46 PM Rabeda, Maciej
> <maciej.rabeda@linux.intel.com> wrote:
>
>> 1. In HttpResponseWorker():
>>
>>       if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen
>> ("HTTP/1.0")) == 0) {
>>         DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting
>> Connection close.\n"));
>>         HttpInstance->ConnectionClose = TRUE;
>>       }
>>
>> I'd change AsciiStrLen ("HTTP/1.0") to sizeof("HTTP/1.0") - 1. No need
>> to call a AsciiStrLen every time this flow is executed, it is easily a
>> compile-time thing.
> Yes, of course.
>
>> 2. In HttpResponseWorker(), index -> Index, coding standard.
> Sorry, I missed that one.
>
>> I can merge this patch with changes above one I get an ACK from you.
> Sounds good to me. Thank you!
>
> -- Oliver
>
>
>
> 
>
>

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two)
  2022-04-08  9:07           ` Maciej Rabeda
@ 2022-04-11 15:24             ` Maciej Rabeda
  0 siblings, 0 replies; 28+ messages in thread
From: Maciej Rabeda @ 2022-04-11 15:24 UTC (permalink / raw)
  To: devel, osteffen; +Cc: Gerd Hoffmann, gaoliming, jiaxin.wu, siyuan.fu

Patchset merged: https://github.com/tianocore/edk2/pull/2756

On 8 kwi 2022 11:07, Rabeda, Maciej wrote:
> Alright.
>
> Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>
>
> Merge soon.
>
> On 7 kwi 2022 14:55, Oliver Steffen wrote:
>> On Thu, Apr 7, 2022 at 2:46 PM Rabeda, Maciej
>> <maciej.rabeda@linux.intel.com> wrote:
>>
>>> 1. In HttpResponseWorker():
>>>
>>>       if (AsciiStrnCmp (HttpHeaders, "HTTP/1.0", AsciiStrLen
>>> ("HTTP/1.0")) == 0) {
>>>         DEBUG ((DEBUG_VERBOSE, "HTTP: Server version is 1.0. Setting
>>> Connection close.\n"));
>>>         HttpInstance->ConnectionClose = TRUE;
>>>       }
>>>
>>> I'd change AsciiStrLen ("HTTP/1.0") to sizeof("HTTP/1.0") - 1. No need
>>> to call a AsciiStrLen every time this flow is executed, it is easily a
>>> compile-time thing.
>> Yes, of course.
>>
>>> 2. In HttpResponseWorker(), index -> Index, coding standard.
>> Sorry, I missed that one.
>>
>>> I can merge this patch with changes above one I get an ACK from you.
>> Sounds good to me. Thank you!
>>
>> -- Oliver
>>
>>
>>
>> 
>>
>>

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2022-04-11 15:24 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20220304130403.47832-1-osteffen@redhat.com>
2022-03-08 13:21 ` [PATCH v2 0/4] Http Fixes Oliver Steffen
2022-03-08 13:21   ` [PATCH v2 1/4] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
2022-03-09  9:29     ` [edk2-devel] " Gerd Hoffmann
2022-03-08 13:21   ` [PATCH v2 2/4] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
2022-03-09  9:31     ` [edk2-devel] " Gerd Hoffmann
2022-03-08 13:21   ` [PATCH v2 3/4] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
2022-03-09  9:30     ` [edk2-devel] " Gerd Hoffmann
2022-03-08 13:21   ` [PATCH v2 4/4] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
2022-03-09  9:30     ` [edk2-devel] " Gerd Hoffmann
2022-03-15 13:42 ` [PATCH v3 0/5] Http Fixes Oliver Steffen
2022-03-15 13:42   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
2022-03-15 13:42   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
2022-03-15 13:42   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
2022-03-15 13:42   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
2022-03-15 13:42   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
2022-03-16 10:36   ` [edk2-devel] [PATCH v3 0/5] Http Fixes Gerd Hoffmann
2022-03-22 13:30 ` [PATCH v3 0/5] Http Fixes (Take Two) Oliver Steffen
2022-03-22 13:30   ` [PATCH v3 1/5] NetworkPkg/HttpDxe: Decofigure Tcp4 before reconfiguring Oliver Steffen
2022-03-22 13:30   ` [PATCH v3 2/5] NetworkPkg/HttpDxe: Decofigure Tcp6 " Oliver Steffen
2022-03-22 13:30   ` [PATCH v3 3/5] NetworkPkg/HttpDxe: Add ConnectionClose flag fo HTTP_PROTOCOL Oliver Steffen
2022-03-22 13:30   ` [PATCH v3 4/5] NetworkPkg/HttpDxe: Detect 'Connection: close' header Oliver Steffen
2022-03-22 13:30   ` [PATCH v3 5/5] NetworkPkg/HttpDxe: Detect HTTP/1.0 servers Oliver Steffen
2022-03-23  1:19   ` 回复: [edk2-devel] [PATCH v3 0/5] Http Fixes (Take Two) gaoliming
2022-04-07  9:57     ` Gerd Hoffmann
2022-04-07 12:46       ` Maciej Rabeda
2022-04-07 12:55         ` Oliver Steffen
2022-04-08  9:07           ` Maciej Rabeda
2022-04-11 15:24             ` Maciej Rabeda

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox