You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2014/09/22 03:41:37 UTC

git commit: TS-3084: Fix FIN forward on POST.

Repository: trafficserver
Updated Branches:
  refs/heads/master 514c9e1a6 -> 42416b3f4


TS-3084: Fix FIN forward on POST.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/42416b3f
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/42416b3f
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/42416b3f

Branch: refs/heads/master
Commit: 42416b3f48c87bd57093f2ce8ce5ece8dae6ca22
Parents: 514c9e1
Author: Susan Hinrichs <sh...@network-geographics.com>
Authored: Sun Sep 21 20:39:16 2014 -0500
Committer: Alan M. Carroll <am...@apache.org>
Committed: Sun Sep 21 20:41:18 2014 -0500

----------------------------------------------------------------------
 CHANGES                         |  4 ++++
 proxy/http/HttpClientSession.cc |  2 +-
 proxy/http/HttpSM.cc            | 13 +++++++++++++
 proxy/http/HttpTunnel.cc        |  9 +++++++--
 4 files changed, 25 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42416b3f/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index b401177..866ac29 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,7 +1,11 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.2.0
 
+  *) [TS-3084] Fix FIN forwarding issue with POST.
+     Author: Susan Hinrichs <sh...@network-geographics.com>
+
   *) [TS-3073] Fix FIN forwarding issue with transparent pass-through.
+     Author: Susan Hinrichs <sh...@network-geographics.com>
 
   *) [TS-3059] Add the TSTextLogObjectRollingSizeMbSet API function.
    Author: Brian Rectanus <br...@qualys.com>

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42416b3f/proxy/http/HttpClientSession.cc
----------------------------------------------------------------------
diff --git a/proxy/http/HttpClientSession.cc b/proxy/http/HttpClientSession.cc
index c4d1a30..57991de 100644
--- a/proxy/http/HttpClientSession.cc
+++ b/proxy/http/HttpClientSession.cc
@@ -264,7 +264,7 @@ HttpClientSession::do_io_close(int alerrno)
     slave_ka_vio = NULL;
   }
 
-  if (half_close) {
+  if (half_close && this->current_reader) {
     read_state = HCS_HALF_CLOSED;
     SET_HANDLER(&HttpClientSession::state_wait_for_close);
     DebugHttpSsn("[%" PRId64 "] session half close", con_id);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42416b3f/proxy/http/HttpSM.cc
----------------------------------------------------------------------
diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
index 3dde3c3..29d92f7 100644
--- a/proxy/http/HttpSM.cc
+++ b/proxy/http/HttpSM.cc
@@ -847,7 +847,14 @@ HttpSM::state_watch_for_client_abort(int event, void *data)
   ink_assert(ua_entry->vc == ua_session);
 
   switch (event) {
+  /* EOS means that the client has initiated the connection shut down.
+   * Only half close the client connection so ATS can read additional
+   * data that may still be sent from the server and send it to the
+   * client.
+   */
   case VC_EVENT_EOS:
+    static_cast<HttpClientSession*>(ua_entry->vc)->get_netvc()->do_io_shutdown(IO_SHUTDOWN_READ);
+    break;
   case VC_EVENT_ERROR:
   case VC_EVENT_ACTIVE_TIMEOUT:
   case VC_EVENT_INACTIVITY_TIMEOUT:
@@ -5358,6 +5365,12 @@ HttpSM::do_setup_post_tunnel(HttpVC_t to_vc_type)
     tunnel.set_producer_chunking_action(p, 0, TCA_PASSTHRU_CHUNKED_CONTENT);
 
   tunnel.tunnel_run(p);
+
+  // If we're half closed, we got a FIN from the client. Forward it on to the origin server
+  // now that we have the tunnel operational.
+  if (ua_session->get_half_close_flag()) {
+    p->vc->do_io_shutdown(IO_SHUTDOWN_READ);
+  }
 }
 
 // void HttpSM::perform_transform_cache_write_action()

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42416b3f/proxy/http/HttpTunnel.cc
----------------------------------------------------------------------
diff --git a/proxy/http/HttpTunnel.cc b/proxy/http/HttpTunnel.cc
index d7f362c..f6f77c8 100644
--- a/proxy/http/HttpTunnel.cc
+++ b/proxy/http/HttpTunnel.cc
@@ -896,9 +896,14 @@ HttpTunnel::producer_run(HttpTunnelProducer * p)
       // set the amount to read since we know it.  We will send the FIN
       // to the server on VC_EVENT_WRITE_COMPLETE.
       if (p->vc_type == HT_HTTP_CLIENT) {
-        if (static_cast<HttpClientSession *>(p->vc)->get_half_close_flag()) {
+        HttpClientSession* ua_vc = static_cast<HttpClientSession*>(p->vc);
+        if (ua_vc->get_half_close_flag() || producer_n == 0) {
+          // Force the half close to make sure we send the FIN immediately after we finish writing.
+          ua_vc->set_half_close_flag();
           c_write = c->buffer_reader->read_avail();
-          p->alive = false;
+          if (producer_n != 0) {
+            p->alive = false;
+          }
         }
       }