~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-03-14 16:39:24 UTC
  • mto: (2323.7.1 redirection)
  • mto: This revision was merged to the branch mainline in revision 2390.
  • Revision ID: v.ladeuil+lp@free.fr-20070314163924-5xoey9mkxe6qaptd
Test the http redirection at the request level even if it's not
used anymore, so far.

* bzrlib/transport/http/_urllib2_wrappers.py
(HTTPRedirectHandler.http_error_302): Renamed from http_error_30x.
(HTTPRedirectHandler.http_error_301): Deleted. Finally, that's the
easiest way to fix bug #88780 :) In retrospect, that code was a
first attempt to handle this whole redirection handling by
providing the final target to the first request. This is not
needed anymore.

* bzrlib/tests/test_http.py:
(RedirectedRequest, TestHTTPSilentRedirections_urllib): Test the
_urllib2_wrappers redirection at the request level.

* bzrlib/tests/HTTPTestUtil.py:
(RedirectRequestHandler.parse_request): Delegate the redirection
handling to the test_case_server.
(HTTPServerRedirecting.is_redirected): Handle redirections by
searching a matching directive.
(HTTPServerRedirecting.redirect_to): Redefined to use the nre
redirections definitions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
from bzrlib.transport.http import (
63
63
    extract_auth,
64
64
    HttpTransportBase,
 
65
    _urllib2_wrappers,
65
66
    )
66
67
from bzrlib.transport.http._urllib import HttpTransport_urllib
67
68
 
953
954
                        TestCaseWithWebserver):
954
955
    """Test the Range header in GET methods for pycurl implementation"""
955
956
 
956
 
# FIXME: http implementations do not redirect silently anymore
957
 
# (they do not redirect at all in fact). The mechanism is still
958
 
# in place at the _urllib2_wrappers.Request level and tests
959
 
# should be written to exercise it. For the pycurl implementation
960
 
# the redirection have been deleted as we may deprecate pycurl
961
 
# and I have no place to keep a working implementation.
962
 
#  -- vila 20070212
963
957
 
964
958
class TestHTTPRedirections(object):
965
959
    """Test redirection between http servers.
1016
1010
    """Tests redirections for pycurl implementation"""
1017
1011
 
1018
1012
 
 
1013
class RedirectedRequest(_urllib2_wrappers.Request):
 
1014
    """Request following redirections"""
 
1015
 
 
1016
    init_orig = _urllib2_wrappers.Request.__init__
 
1017
 
 
1018
    def __init__(self, method, url, *args, **kwargs):
 
1019
        RedirectedRequest.init_orig(self, method, url, args, kwargs)
 
1020
        self.follow_redirections = True
 
1021
 
 
1022
 
 
1023
class TestHTTPSilentRedirections_urllib(TestCaseWithRedirectedWebserver):
 
1024
    """Test redirections provided by urllib.
 
1025
 
 
1026
    http implementations do not redirect silently anymore (they
 
1027
    do not redirect at all in fact). The mechanism is still in
 
1028
    place at the _urllib2_wrappers.Request level and these tests
 
1029
    exercise it.
 
1030
 
 
1031
    For the pycurl implementation
 
1032
    the redirection have been deleted as we may deprecate pycurl
 
1033
    and I have no place to keep a working implementation.
 
1034
    -- vila 20070212
 
1035
    """
 
1036
 
 
1037
    _transport = HttpTransport_urllib
 
1038
 
 
1039
    def setUp(self):
 
1040
        super(TestHTTPSilentRedirections_urllib, self).setUp()
 
1041
        self.setup_redirected_request()
 
1042
        self.addCleanup(self.cleanup_redirected_request)
 
1043
        self.build_tree_contents([('a','a'),
 
1044
                                  ('1/',),
 
1045
                                  ('1/a', 'redirected once'),
 
1046
                                  ('2/',),
 
1047
                                  ('2/a', 'redirected twice'),
 
1048
                                  ('3/',),
 
1049
                                  ('3/a', 'redirected thrice'),
 
1050
                                  ('4/',),
 
1051
                                  ('4/a', 'redirected 4 times'),
 
1052
                                  ('5/',),
 
1053
                                  ('5/a', 'redirected 5 times'),
 
1054
                                  ],)
 
1055
 
 
1056
        self.old_transport = self._transport(self.old_server.get_url())
 
1057
 
 
1058
    def setup_redirected_request(self):
 
1059
        self.original_class = _urllib2_wrappers.Request
 
1060
        _urllib2_wrappers.Request = RedirectedRequest
 
1061
 
 
1062
    def cleanup_redirected_request(self):
 
1063
        _urllib2_wrappers.Request = self.original_class
 
1064
 
 
1065
    def create_transport_secondary_server(self):
 
1066
        """Create the secondary server, redirections are defined in the tests"""
 
1067
        return HTTPServerRedirecting()
 
1068
 
 
1069
    def test_one_redirection(self):
 
1070
        t = self.old_transport
 
1071
 
 
1072
        req = RedirectedRequest('GET', t.abspath('a'))
 
1073
        req.follow_redirections = True
 
1074
        new_prefix = 'http://%s:%s' % (self.new_server.host,
 
1075
                                       self.new_server.port)
 
1076
        self.old_server.redirections = \
 
1077
            [('(.*)', r'%s/1\1' % (new_prefix), 301),]
 
1078
        self.assertEquals('redirected once',t._perform(req).read())
 
1079
 
 
1080
    def test_five_redirections(self):
 
1081
        t = self.old_transport
 
1082
 
 
1083
        req = RedirectedRequest('GET', t.abspath('a'))
 
1084
        req.follow_redirections = True
 
1085
        old_prefix = 'http://%s:%s' % (self.old_server.host,
 
1086
                                       self.old_server.port)
 
1087
        new_prefix = 'http://%s:%s' % (self.new_server.host,
 
1088
                                       self.new_server.port)
 
1089
        self.old_server.redirections = \
 
1090
            [('/1(.*)', r'%s/2\1' % (old_prefix), 302),
 
1091
             ('/2(.*)', r'%s/3\1' % (old_prefix), 303),
 
1092
             ('/3(.*)', r'%s/4\1' % (old_prefix), 307),
 
1093
             ('/4(.*)', r'%s/5\1' % (new_prefix), 301),
 
1094
             ('(/[^/]+)', r'%s/1\1' % (old_prefix), 301),
 
1095
             ]
 
1096
        self.assertEquals('redirected 5 times',t._perform(req).read())
 
1097
 
 
1098
 
1019
1099
class TestDoCatchRedirections(TestCaseWithRedirectedWebserver):
1020
1100
    """Test transport.do_catching_redirections.
1021
1101