File 2596-inets-Teach-httpc-to-honour-Connection-close-from-se.patch of Package erlang

From 9a19dc099198585bd4f019116663d5b8be506ce0 Mon Sep 17 00:00:00 2001
From: Luca Favatella <luca.favatella@erlang-solutions.com>
Date: Fri, 16 Mar 2018 18:00:00 +0000
Subject: [PATCH 6/9] inets: Teach httpc to honour `Connection: close` from
 server

From https://tools.ietf.org/html/rfc7230#section-6.6

> A client that receives a "close" connection option MUST cease
  sending requests on that connection and close the connection after
  reading the response message containing the "close"; if additional
  pipelined requests had been sent on the connection, the client
  SHOULD NOT assume that they will be processed by the server.

Notes on tests:

* The new tests are added only in group sim_http and not sim_https
  because the same test approach appears to be not valid because when
  processing the first response the server already sent data (> 0) for
  the TLS/SSL handshake;

* The order of tests is relevant as it appears some test cases leave
  reusable sessions behind.
---
 lib/inets/src/http_client/httpc_handler.erl | 32 +++++++---
 lib/inets/test/httpc_SUITE.erl              | 95 ++++++++++++++++++++++++++++-
 2 files changed, 117 insertions(+), 10 deletions(-)

diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 0ca8155054..ca29523f84 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -1043,15 +1043,29 @@ handle_response(#state{status = new} = State) ->
     ?hcrd("handle response - status = new", []),
     handle_response(try_to_enable_pipeline_or_keep_alive(State));
 
-handle_response(#state{request      = Request,
-		       status       = Status,
-		       session      = Session, 
-		       status_line  = StatusLine,
-		       headers      = Headers, 
-		       body         = Body,
-		       options      = Options,
-		       profile_name = ProfileName} = State) 
-  when Status =/= new ->
+handle_response(#state{status = Status0} = State0) when Status0 =/= new ->
+    Status =
+        case Status0 of
+            close -> close;
+            _ ->
+                case State0#state.headers of
+                    undefined -> Status0;
+                    _ ->
+                        case httpc_response:is_server_closing(
+                               State0#state.headers) of
+                            true -> close;
+                            false -> Status0
+                        end
+                end
+        end,
+    State = State0#state{status = Status},
+    #state{request      = Request,
+           session      = Session,
+           status_line  = StatusLine,
+           headers      = Headers,
+           body         = Body,
+           options      = Options,
+           profile_name = ProfileName} = State,
     handle_cookies(Headers, Request, Options, ProfileName), 
     case httpc_response:result({StatusLine, Headers, Body}, Request) of
 	%% 100-continue
-- 
2.16.3

openSUSE Build Service is sponsored by