~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/http/_urllib2_wrappers.py

  • Committer: Martin Pool
  • Date: 2007-04-01 06:19:16 UTC
  • mfrom: (2323.5.20 0.15-integration)
  • mto: This revision was merged to the branch mainline in revision 2390.
  • Revision ID: mbp@sourcefrog.net-20070401061916-plpgsxdf8g7gll9o
Merge 0.15 final release back to trunk, including: recommend upgrades of old workingtrees, handle multiple http redirections, some dirstate fixes, 

Show diffs side-by-side

added added

removed removed

Lines of Context:
156
156
        # To handle redirections
157
157
        self.parent = parent
158
158
        self.redirected_to = None
 
159
        # Unless told otherwise, redirections are not followed
 
160
        self.follow_redirections = False
159
161
 
160
162
    def extract_auth(self, url):
161
163
        """Extracts authentification information from url.
501
503
        # of creating a new one, but the urllib2.Request object
502
504
        # has a too complicated creation process to provide a
503
505
        # simple enough equivalent update process. Instead, when
504
 
        # redirecting, we only update the original request with a
505
 
        # reference to the following request in the redirect
506
 
        # chain.
 
506
        # redirecting, we only update the following request in
 
507
        # the redirect chain with a reference to the parent
 
508
        # request .
507
509
 
508
 
        # Some codes make no sense on out context and are treated
 
510
        # Some codes make no sense in our context and are treated
509
511
        # as errors:
510
512
 
511
513
        # 300: Multiple choices for different representations of
520
522
 
521
523
        # 306: Unused (if the RFC says so...)
522
524
 
523
 
        # FIXME: If the code is 302 and the request is HEAD, we
524
 
        # MAY avoid following the redirections if the intent is
525
 
        # to check the existence, we have a hint that the file
526
 
        # exist, now if we want to be sure, we must follow the
527
 
        # redirection. Let's do that for now.
 
525
        # If the code is 302 and the request is HEAD, some may
 
526
        # think that it is a sufficent hint that the file exists
 
527
        # and that we MAY avoid following the redirections. But
 
528
        # if we want to be sure, we MUST follow them.
528
529
 
529
530
        if code in (301, 302, 303, 307):
530
531
            return Request(req.get_method(),newurl,
541
542
        else:
542
543
            raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
543
544
 
544
 
    def http_error_30x(self, req, fp, code, msg, headers):
 
545
    def http_error_302(self, req, fp, code, msg, headers):
545
546
        """Requests the redirected to URI.
546
547
 
547
548
        Copied from urllib2 to be able to fake_close the
561
562
        else:
562
563
            return
563
564
        if self._debuglevel > 0:
564
 
            print 'Redirected to: %s' % newurl
 
565
            print 'Redirected to: %s (followed: %r)' % (newurl,
 
566
                                                        req.follow_redirections)
 
567
        if req.follow_redirections is False:
 
568
            req.redirected_to = newurl
 
569
            return fp
 
570
 
565
571
        newurl = urlparse.urljoin(req.get_full_url(), newurl)
566
572
 
567
573
        # This call succeeds or raise an error. urllib2 returns
590
596
 
591
597
        return self.parent.open(redirected_req)
592
598
 
593
 
    http_error_302 = http_error_303 = http_error_307 = http_error_30x
594
 
 
595
 
    def http_error_301(self, req, fp, code, msg, headers):
596
 
        response = self.http_error_30x(req, fp, code, msg, headers)
597
 
        # If one or several 301 response occur during the
598
 
        # redirection chain, we MUST update the original request
599
 
        # to indicate where the URI where finally found.
600
 
 
601
 
        original_req = req
602
 
        while original_req.parent is not None:
603
 
            original_req = original_req.parent
604
 
            if original_req.redirected_to is None:
605
 
                # Only the last occurring 301 should be taken
606
 
                # into account i.e. the first occurring here when
607
 
                # redirected_to has not yet been set.
608
 
                original_req.redirected_to = redirected_url
609
 
        return response
 
599
    http_error_301 = http_error_303 = http_error_307 = http_error_302
610
600
 
611
601
 
612
602
class ProxyHandler(urllib2.ProxyHandler):