~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_http.py

  • Committer: Vincent Ladeuil
  • Date: 2007-06-20 13:56:21 UTC
  • mto: (2574.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 2575.
  • Revision ID: v.ladeuil+lp@free.fr-20070620135621-x43c0hnmzu0iuo6m
Fix #115209 by issuing a single range request on 400: Bad Request

* bzrlib/transport/http/response.py:
(handle_response): Consider 400 as an indication that too much
ranges were specified.

* bzrlib/transport/http/_urllib2_wrappers.py:
(Request): Add an 'accpeted_errors' parameters describing what
error codes the caller will handle.
(HTTPErrorProcessor): Mention that Request specific accepted error
codes takes precedence.
(HTTPDefaultErrorHandler.http_error_default): Remove dead code.

* bzrlib/transport/http/_urllib.py:
(HttpTransport_urllib._get): Add 400 as an accepted error iff
ranges are specified.
(HttpTransport_urllib._head): Restrict accepted errors.

* bzrlib/transport/http/__init__.py:
(HttpTransportBase._degrade_range_hint,
HttpTransportBase._get_ranges_hinted): Replace _retry_get.
(HttpTransportBase.readv): Simplified and avoid the spurious _get()
issued when _get was successful.

* bzrlib/tests/test_http.py:
(TestLimitedRangeRequestServer,
TestLimitedRangeRequestServer_urllib,
TestLimitedRangeRequestServer_pycurl): Bug #115209 specific tests.

* bzrlib/tests/HTTPTestUtil.py:
(LimitedRangeRequestHandler, LimitedRangeHTTPServer): New test
classes to emulate apache throwing 400: Bad Request when too much
ranges are specified.
(AuthRequestHandler.do_GET): Remove dead code. Yeah, I know,
not related to the bug :-/

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
    HTTPDigestAuthServer,
54
54
    HTTPServerRedirecting,
55
55
    InvalidStatusRequestHandler,
 
56
    LimitedRangeHTTPServer,
56
57
    NoRangeRequestHandler,
57
58
    ProxyBasicAuthServer,
58
59
    ProxyDigestAuthServer,
714
715
    """Tests range requests refusing server for pycurl implementation"""
715
716
 
716
717
 
 
718
class TestLimitedRangeRequestServer(object):
 
719
    """Tests readv requests against server that errors out on too much ranges.
 
720
 
 
721
    This MUST be used by daughter classes that also inherit from
 
722
    TestCaseWithWebserver.
 
723
 
 
724
    We can't inherit directly from TestCaseWithWebserver or the
 
725
    test framework will try to create an instance which cannot
 
726
    run, its implementation being incomplete.
 
727
    """
 
728
 
 
729
    range_limit = 3
 
730
 
 
731
    def create_transport_readonly_server(self):
 
732
        # Requests with more range specifiers will error out
 
733
        return LimitedRangeHTTPServer(range_limit=self.range_limit)
 
734
 
 
735
    def get_transport(self):
 
736
        return self._transport(self.get_readonly_server().get_url())
 
737
 
 
738
    def setUp(self):
 
739
        TestCaseWithWebserver.setUp(self)
 
740
        # We need to manipulate ranges that correspond to real chunks in the
 
741
        # response, so we build a content appropriately.
 
742
        filler = ''.join(['abcdefghij' for _ in range(102)])
 
743
        content = ''.join(['%04d' % v + filler for v in range(16)])
 
744
        self.build_tree_contents([('a', content)],)
 
745
 
 
746
    def test_few_ranges(self):
 
747
        t = self.get_transport()
 
748
        l = list(t.readv('a', ((0, 4), (1024, 4), )))
 
749
        self.assertEqual(l[0], (0, '0000'))
 
750
        self.assertEqual(l[1], (1024, '0001'))
 
751
        self.assertEqual(1, self.get_readonly_server().GET_request_nb)
 
752
 
 
753
    def test_a_lot_of_ranges(self):
 
754
        t = self.get_transport()
 
755
        l = list(t.readv('a', ((0, 4), (1024, 4), (4096, 4), (8192, 4))))
 
756
        self.assertEqual(l[0], (0, '0000'))
 
757
        self.assertEqual(l[1], (1024, '0001'))
 
758
        self.assertEqual(l[2], (4096, '0004'))
 
759
        self.assertEqual(l[3], (8192, '0008'))
 
760
        # The server will refuse to serve the first request (too much ranges),
 
761
        # a second request will succeeds.
 
762
        self.assertEqual(2, self.get_readonly_server().GET_request_nb)
 
763
 
 
764
 
 
765
class TestLimitedRangeRequestServer_urllib(TestLimitedRangeRequestServer,
 
766
                                          TestCaseWithWebserver):
 
767
    """Tests limited range requests server for urllib implementation"""
 
768
 
 
769
    _transport = HttpTransport_urllib
 
770
 
 
771
 
 
772
class TestLimitedRangeRequestServer_pycurl(TestWithTransport_pycurl,
 
773
                                          TestLimitedRangeRequestServer,
 
774
                                          TestCaseWithWebserver):
 
775
    """Tests limited range requests server for pycurl implementation"""
 
776
 
 
777
 
 
778
 
717
779
class TestHttpProxyWhiteBox(TestCase):
718
780
    """Whitebox test proxy http authorization.
719
781