components/openstack/swift/patches/CVE-2016-0737.patch
author david.comay@oracle.com
Thu, 11 Feb 2016 16:42:18 -0800
changeset 5445 9b7b887c6955
permissions -rw-r--r--
22575858 problem in SERVICE/SWIFT
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5445
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     1
This upstream patch addresses CVE-2016-0737 which is filed under
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     2
Launchpad bug 1466549. The issue is addressed in Swift 2.3.1 as well as
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     3
2.5.1 or later.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     4
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     5
From 036c2f348d24c01c7a4deba3e44889c45270b46d Mon Sep 17 00:00:00 2001
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     6
From: Samuel Merritt <[email protected]>
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     7
Date: Thu, 18 Jun 2015 12:58:03 -0700
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     8
Subject: Get better at closing WSGI iterables.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
     9
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    10
PEP 333 (WSGI) says: "If the iterable returned by the application has
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    11
a close() method, the server or gateway must call that method upon
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    12
completion of the current request[.]"
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    13
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    14
There's a bunch of places where we weren't doing that; some of them
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    15
matter more than others. Calling .close() can prevent a connection
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    16
leak in some cases. In others, it just provides a certain pedantic
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    17
smugness. Either way, we should do what WSGI requires.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    18
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    19
Noteworthy goofs include:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    20
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    21
  * If a client is downloading a large object and disconnects halfway
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    22
    through, a proxy -> obj connection may be leaked. In this case,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    23
    the WSGI iterable is a SegmentedIterable, which lacked a close()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    24
    method. Thus, when the WSGI server noticed the client disconnect,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    25
    it had no way of telling the SegmentedIterable about it, and so
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    26
    the underlying iterable for the segment's data didn't get
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    27
    closed.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    28
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    29
    Here, it seems likely (though unproven) that the object server
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    30
    would time out and kill the connection, or that a
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    31
    ChunkWriteTimeout would fire down in the proxy server, so the
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    32
    leaked connection would eventually go away. However, a flurry of
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    33
    client disconnects could leave a big pile of useless connections.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    34
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    35
  * If a conditional request receives a 304 or 412, the underlying
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    36
    app_iter is not closed. This mostly affects conditional requests
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    37
    for large objects.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    38
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    39
The leaked connections were noticed by this patch's co-author, who
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    40
made the changes to SegmentedIterable. Those changes helped, but did
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    41
not completely fix, the issue. The rest of the patch is an attempt to
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    42
plug the rest of the holes.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    43
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    44
Co-Authored-By: Romain LE DISEZ <[email protected]>
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    45
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    46
Closes-Bug: #1466549
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    47
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    48
Change-Id: I168e147aae7c1728e7e3fdabb7fba6f2d747d937
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    49
(cherry picked from commit 12d8a53fffea6e4bed8ba3d502ce625f5c6710b9
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    50
with fixed import conflicts)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    51
---
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    52
 swift/common/middleware/dlo.py          |  8 ++++++--
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    53
 swift/common/middleware/slo.py          | 10 ++++++----
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    54
 swift/common/request_helpers.py         | 35 ++++++++++++---------------------
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    55
 swift/common/swob.py                    |  9 ++++++++-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    56
 swift/common/utils.py                   | 22 +++++++++++++++++++++
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    57
 swift/proxy/controllers/obj.py          |  4 ++--
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    58
 test/unit/common/middleware/helpers.py  | 32 +++++++++++++++++++++++++++++-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    59
 test/unit/common/middleware/test_dlo.py | 10 ++++++++--
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    60
 test/unit/common/middleware/test_slo.py | 13 ++++++++----
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    61
 9 files changed, 105 insertions(+), 38 deletions(-)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    62
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    63
diff --git a/swift/common/middleware/dlo.py b/swift/common/middleware/dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    64
index d2761ac..9330ccb 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    65
--- a/swift/common/middleware/dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    66
+++ b/swift/common/middleware/dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    67
@@ -22,7 +22,8 @@ from swift.common.http import is_success
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    68
 from swift.common.swob import Request, Response, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    69
     HTTPRequestedRangeNotSatisfiable, HTTPBadRequest, HTTPConflict
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    70
 from swift.common.utils import get_logger, json, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    71
-    RateLimitedIterator, read_conf_dir, quote
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    72
+    RateLimitedIterator, read_conf_dir, quote, close_if_possible, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    73
+    closing_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    74
 from swift.common.request_helpers import SegmentedIterable
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    75
 from swift.common.wsgi import WSGIContext, make_subrequest
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    76
 from urllib import unquote
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    77
@@ -48,7 +49,8 @@ class GetContext(WSGIContext):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    78
         con_resp = con_req.get_response(self.dlo.app)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    79
         if not is_success(con_resp.status_int):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    80
             return con_resp, None
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    81
-        return None, json.loads(''.join(con_resp.app_iter))
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    82
+        with closing_if_possible(con_resp.app_iter):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    83
+            return None, json.loads(''.join(con_resp.app_iter))
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    84
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    85
     def _segment_listing_iterator(self, req, version, account, container,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    86
                                   prefix, segments, first_byte=None,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    87
@@ -107,6 +109,7 @@ class GetContext(WSGIContext):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    88
                 # we've already started sending the response body to the
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    89
                 # client, so all we can do is raise an exception to make the
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    90
                 # WSGI server close the connection early
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    91
+                close_if_possible(error_response.app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    92
                 raise ListingIterError(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    93
                     "Got status %d listing container /%s/%s" %
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    94
                     (error_response.status_int, account, container))
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    95
@@ -233,6 +236,7 @@ class GetContext(WSGIContext):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    96
         # make sure this response is for a dynamic large object manifest
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    97
         for header, value in self._response_headers:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    98
             if (header.lower() == 'x-object-manifest'):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
    99
+                close_if_possible(resp_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   100
                 response = self.get_or_head_response(req, value)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   101
                 return response(req.environ, start_response)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   102
         else:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   103
diff --git a/swift/common/middleware/slo.py b/swift/common/middleware/slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   104
index e8f1707..c7a97a6 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   105
--- a/swift/common/middleware/slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   106
+++ b/swift/common/middleware/slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   107
@@ -147,9 +147,9 @@ from swift.common.swob import Request, HTTPBadRequest, HTTPServerError, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   108
     Response
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   109
 from swift.common.utils import json, get_logger, config_true_value, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   110
     get_valid_utf8_str, override_bytes_from_content_type, split_path, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   111
-    register_swift_info, RateLimitedIterator, quote
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   112
-from swift.common.request_helpers import SegmentedIterable, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   113
-    closing_if_possible, close_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   114
+    register_swift_info, RateLimitedIterator, quote, close_if_possible, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   115
+    closing_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   116
+from swift.common.request_helpers import SegmentedIterable
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   117
 from swift.common.constraints import check_utf8, MAX_BUFFERED_SLO_SEGMENTS
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   118
 from swift.common.http import HTTP_NOT_FOUND, HTTP_UNAUTHORIZED, is_success
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   119
 from swift.common.wsgi import WSGIContext, make_subrequest
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   120
@@ -227,6 +227,7 @@ class SloGetContext(WSGIContext):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   121
         sub_resp = sub_req.get_response(self.slo.app)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   122
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   123
         if not is_success(sub_resp.status_int):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   124
+            close_if_possible(sub_resp.app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   125
             raise ListingIterError(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   126
                 'ERROR: while fetching %s, GET of submanifest %s '
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   127
                 'failed with status %d' % (req.path, sub_req.path,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   128
@@ -400,7 +401,8 @@ class SloGetContext(WSGIContext):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   129
         return response(req.environ, start_response)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   130
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   131
     def get_or_head_response(self, req, resp_headers, resp_iter):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   132
-        resp_body = ''.join(resp_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   133
+        with closing_if_possible(resp_iter):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   134
+            resp_body = ''.join(resp_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   135
         try:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   136
             segments = json.loads(resp_body)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   137
         except ValueError:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   138
diff --git a/swift/common/request_helpers.py b/swift/common/request_helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   139
index 14b9fd8..8aa8457 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   140
--- a/swift/common/request_helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   141
+++ b/swift/common/request_helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   142
@@ -23,7 +23,6 @@ from swob in here without creating circular imports.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   143
 import hashlib
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   144
 import itertools
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   145
 import time
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   146
-from contextlib import contextmanager
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   147
 from urllib import unquote
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   148
 from swift import gettext_ as _
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   149
 from swift.common.storage_policy import POLICIES
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   150
@@ -32,7 +31,8 @@ from swift.common.exceptions import ListingIterError, SegmentError
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   151
 from swift.common.http import is_success
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   152
 from swift.common.swob import (HTTPBadRequest, HTTPNotAcceptable,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   153
                                HTTPServiceUnavailable)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   154
-from swift.common.utils import split_path, validate_device_partition
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   155
+from swift.common.utils import split_path, validate_device_partition, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   156
+    close_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   157
 from swift.common.wsgi import make_subrequest
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   158
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   159
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   160
@@ -249,26 +249,6 @@ def copy_header_subset(from_r, to_r, condition):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   161
             to_r.headers[k] = v
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   162
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   163
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   164
-def close_if_possible(maybe_closable):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   165
-    close_method = getattr(maybe_closable, 'close', None)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   166
-    if callable(close_method):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   167
-        return close_method()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   168
-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   169
-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   170
-@contextmanager
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   171
-def closing_if_possible(maybe_closable):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   172
-    """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   173
-    Like contextlib.closing(), but doesn't crash if the object lacks a close()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   174
-    method.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   175
-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   176
-    PEP 333 (WSGI) says: "If the iterable returned by the application has a
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   177
-    close() method, the server or gateway must call that method upon
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   178
-    completion of the current request[.]" This function makes that easier.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   179
-    """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   180
-    yield maybe_closable
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   181
-    close_if_possible(maybe_closable)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   182
-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   183
-
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   184
 class SegmentedIterable(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   185
     """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   186
     Iterable that returns the object contents for a large object.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   187
@@ -304,6 +284,7 @@ class SegmentedIterable(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   188
         self.peeked_chunk = None
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   189
         self.app_iter = self._internal_iter()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   190
         self.validated_first_segment = False
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   191
+        self.current_resp = None
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   192
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   193
     def _internal_iter(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   194
         start_time = time.time()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   195
@@ -360,6 +341,8 @@ class SegmentedIterable(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   196
                          'r_size': seg_resp.content_length,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   197
                          's_etag': seg_etag,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   198
                          's_size': seg_size})
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   199
+                else:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   200
+                    self.current_resp = seg_resp
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   201
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   202
                 seg_hash = hashlib.md5()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   203
                 for chunk in seg_resp.app_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   204
@@ -431,3 +414,11 @@ class SegmentedIterable(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   205
             return itertools.chain([pc], self.app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   206
         else:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   207
             return self.app_iter
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   208
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   209
+    def close(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   210
+        """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   211
+        Called when the client disconnect. Ensure that the connection to the
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   212
+        backend server is closed.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   213
+        """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   214
+        if self.current_resp:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   215
+            close_if_possible(self.current_resp.app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   216
diff --git a/swift/common/swob.py b/swift/common/swob.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   217
index c2e3afb..a1bd9f6 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   218
--- a/swift/common/swob.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   219
+++ b/swift/common/swob.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   220
@@ -49,7 +49,8 @@ import random
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   221
 import functools
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   222
 import inspect
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   223
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   224
-from swift.common.utils import reiterate, split_path, Timestamp, pairs
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   225
+from swift.common.utils import reiterate, split_path, Timestamp, pairs, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   226
+    close_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   227
 from swift.common.exceptions import InvalidTimestamp
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   228
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   229
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   230
@@ -1203,12 +1204,14 @@ class Response(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   231
                     etag in self.request.if_none_match:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   232
                 self.status = 304
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   233
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   234
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   235
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   236
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   237
             if etag and self.request.if_match and \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   238
                etag not in self.request.if_match:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   239
                 self.status = 412
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   240
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   241
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   242
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   243
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   244
             if self.status_int == 404 and self.request.if_match \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   245
@@ -1219,18 +1222,21 @@ class Response(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   246
                 # Failed) response. [RFC 2616 section 14.24]
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   247
                 self.status = 412
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   248
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   249
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   250
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   251
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   252
             if self.last_modified and self.request.if_modified_since \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   253
                and self.last_modified <= self.request.if_modified_since:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   254
                 self.status = 304
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   255
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   256
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   257
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   258
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   259
             if self.last_modified and self.request.if_unmodified_since \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   260
                and self.last_modified > self.request.if_unmodified_since:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   261
                 self.status = 412
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   262
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   263
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   264
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   265
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   266
         if self.request and self.request.method == 'HEAD':
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   267
@@ -1244,6 +1250,7 @@ class Response(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   268
             if ranges == []:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   269
                 self.status = 416
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   270
                 self.content_length = 0
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   271
+                close_if_possible(app_iter)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   272
                 return ['']
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   273
             elif ranges:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   274
                 range_size = len(ranges)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   275
diff --git a/swift/common/utils.py b/swift/common/utils.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   276
index 19dcfd3..85c3824 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   277
--- a/swift/common/utils.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   278
+++ b/swift/common/utils.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   279
@@ -3143,6 +3143,28 @@ def ismount_raw(path):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   280
     return False
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   281
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   282
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   283
+def close_if_possible(maybe_closable):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   284
+    close_method = getattr(maybe_closable, 'close', None)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   285
+    if callable(close_method):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   286
+        return close_method()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   287
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   288
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   289
+@contextmanager
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   290
+def closing_if_possible(maybe_closable):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   291
+    """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   292
+    Like contextlib.closing(), but doesn't crash if the object lacks a close()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   293
+    method.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   294
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   295
+    PEP 333 (WSGI) says: "If the iterable returned by the application has a
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   296
+    close() method, the server or gateway must call that method upon
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   297
+    completion of the current request[.]" This function makes that easier.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   298
+    """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   299
+    try:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   300
+        yield maybe_closable
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   301
+    finally:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   302
+        close_if_possible(maybe_closable)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   303
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   304
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   305
 _rfc_token = r'[^()<>@,;:\"/\[\]?={}\x00-\x20\x7f]+'
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   306
 _rfc_extension_pattern = re.compile(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   307
     r'(?:\s*;\s*(' + _rfc_token + r")\s*(?:=\s*(" + _rfc_token +
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   308
diff --git a/swift/proxy/controllers/obj.py b/swift/proxy/controllers/obj.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   309
index a83242b..784dfef 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   310
--- a/swift/proxy/controllers/obj.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   311
+++ b/swift/proxy/controllers/obj.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   312
@@ -43,7 +43,7 @@ from swift.common.utils import (
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   313
     clean_content_type, config_true_value, ContextPool, csv_append,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   314
     GreenAsyncPile, GreenthreadSafeIterator, json, Timestamp,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   315
     normalize_delete_at_timestamp, public, get_expirer_container,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   316
-    quorum_size)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   317
+    quorum_size, close_if_possible)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   318
 from swift.common.bufferedhttp import http_connect
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   319
 from swift.common.constraints import check_metadata, check_object_creation, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   320
     check_copy_from_header, check_destination_header, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   321
@@ -68,7 +68,7 @@ from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPNotFound, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   322
     HTTPServerError, HTTPServiceUnavailable, Request, HeaderKeyDict, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   323
     HTTPClientDisconnect, HTTPUnprocessableEntity, Response, HTTPException
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   324
 from swift.common.request_helpers import is_sys_or_user_meta, is_sys_meta, \
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   325
-    remove_items, copy_header_subset, close_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   326
+    remove_items, copy_header_subset
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   327
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   328
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   329
 def copy_headers_into(from_r, to_r):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   330
diff --git a/test/unit/common/middleware/helpers.py b/test/unit/common/middleware/helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   331
index 68a4bfe..7c1b455 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   332
--- a/test/unit/common/middleware/helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   333
+++ b/test/unit/common/middleware/helpers.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   334
@@ -15,6 +15,7 @@
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   335
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   336
 # This stuff can't live in test/unit/__init__.py due to its swob dependency.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   337
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   338
+from collections import defaultdict
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   339
 from copy import deepcopy
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   340
 from hashlib import md5
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   341
 from swift.common import swob
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   342
@@ -23,6 +24,20 @@ from swift.common.utils import split_path
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   343
 from test.unit import FakeLogger, FakeRing
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   344
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   345
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   346
+class LeakTrackingIter(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   347
+    def __init__(self, inner_iter, fake_swift, path):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   348
+        self.inner_iter = inner_iter
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   349
+        self.fake_swift = fake_swift
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   350
+        self.path = path
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   351
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   352
+    def __iter__(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   353
+        for x in self.inner_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   354
+            yield x
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   355
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   356
+    def close(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   357
+        self.fake_swift.mark_closed(self.path)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   358
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   359
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   360
 class FakeSwift(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   361
     """
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   362
     A good-enough fake Swift proxy server to use in testing middleware.
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   363
@@ -30,6 +45,7 @@ class FakeSwift(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   364
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   365
     def __init__(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   366
         self._calls = []
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   367
+        self._unclosed_req_paths = defaultdict(int)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   368
         self.req_method_paths = []
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   369
         self.swift_sources = []
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   370
         self.uploaded = {}
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   371
@@ -105,7 +121,21 @@ class FakeSwift(object):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   372
         req = swob.Request(env)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   373
         resp = resp_class(req=req, headers=headers, body=body,
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   374
                           conditional_response=True)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   375
-        return resp(env, start_response)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   376
+        wsgi_iter = resp(env, start_response)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   377
+        self.mark_opened(path)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   378
+        return LeakTrackingIter(wsgi_iter, self, path)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   379
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   380
+    def mark_opened(self, path):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   381
+        self._unclosed_req_paths[path] += 1
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   382
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   383
+    def mark_closed(self, path):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   384
+        self._unclosed_req_paths[path] -= 1
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   385
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   386
+    @property
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   387
+    def unclosed_requests(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   388
+        return {path: count
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   389
+                for path, count in self._unclosed_req_paths.items()
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   390
+                if count > 0}
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   391
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   392
     @property
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   393
     def calls(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   394
diff --git a/test/unit/common/middleware/test_dlo.py b/test/unit/common/middleware/test_dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   395
index 16237eb..119e4ab 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   396
--- a/test/unit/common/middleware/test_dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   397
+++ b/test/unit/common/middleware/test_dlo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   398
@@ -26,6 +26,7 @@ import unittest
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   399
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   400
 from swift.common import exceptions, swob
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   401
 from swift.common.middleware import dlo
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   402
+from swift.common.utils import closing_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   403
 from test.unit.common.middleware.helpers import FakeSwift
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   404
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   405
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   406
@@ -54,8 +55,10 @@ class DloTestCase(unittest.TestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   407
         body = ''
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   408
         caught_exc = None
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   409
         try:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   410
-            for chunk in body_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   411
-                body += chunk
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   412
+            # appease the close-checker
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   413
+            with closing_if_possible(body_iter):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   414
+                for chunk in body_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   415
+                    body += chunk
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   416
         except Exception as exc:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   417
             if expect_exception:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   418
                 caught_exc = exc
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   419
@@ -279,6 +282,9 @@ class TestDloHeadManifest(DloTestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   420
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   421
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   422
 class TestDloGetManifest(DloTestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   423
+    def tearDown(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   424
+        self.assertEqual(self.app.unclosed_requests, {})
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   425
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   426
     def test_get_manifest(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   427
         expected_etag = '"%s"' % md5hex(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   428
             md5hex("aaaaa") + md5hex("bbbbb") + md5hex("ccccc") +
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   429
diff --git a/test/unit/common/middleware/test_slo.py b/test/unit/common/middleware/test_slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   430
index 4160d91..4d483c8 100644
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   431
--- a/test/unit/common/middleware/test_slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   432
+++ b/test/unit/common/middleware/test_slo.py
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   433
@@ -24,7 +24,7 @@ from swift.common import swob, utils
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   434
 from swift.common.exceptions import ListingIterError, SegmentError
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   435
 from swift.common.middleware import slo
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   436
 from swift.common.swob import Request, Response, HTTPException
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   437
-from swift.common.utils import json
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   438
+from swift.common.utils import json, closing_if_possible
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   439
 from test.unit.common.middleware.helpers import FakeSwift
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   440
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   441
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   442
@@ -74,8 +74,10 @@ class SloTestCase(unittest.TestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   443
         body = ''
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   444
         caught_exc = None
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   445
         try:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   446
-            for chunk in body_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   447
-                body += chunk
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   448
+            # appease the close-checker
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   449
+            with closing_if_possible(body_iter):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   450
+                for chunk in body_iter:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   451
+                    body += chunk
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   452
         except Exception as exc:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   453
             if expect_exception:
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   454
                 caught_exc = exc
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   455
@@ -222,7 +224,7 @@ class TestSloPutManifest(SloTestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   456
             '/?multipart-manifest=put',
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   457
             environ={'REQUEST_METHOD': 'PUT'}, body=test_json_data)
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   458
         self.assertEquals(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   459
-            self.slo.handle_multipart_put(req, fake_start_response),
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   460
+            list(self.slo.handle_multipart_put(req, fake_start_response)),
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   461
             ['passed'])
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   462
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   463
     def test_handle_multipart_put_success(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   464
@@ -844,6 +846,9 @@ class TestSloGetManifest(SloTestCase):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   465
                           'X-Object-Meta-Fish': 'Bass'},
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   466
             "[not {json (at ++++all")
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   467
 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   468
+    def tearDown(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   469
+        self.assertEqual(self.app.unclosed_requests, {})
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   470
+
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   471
     def test_get_manifest_passthrough(self):
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   472
         req = Request.blank(
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   473
             '/v1/AUTH_test/gettest/manifest-bc?multipart-manifest=get',
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   474
-- 
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   475
cgit v0.11.2
9b7b887c6955 22575858 problem in SERVICE/SWIFT
david.comay@oracle.com
parents:
diff changeset
   476