~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/smart.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-12-18 17:35:33 UTC
  • mfrom: (2190.1.7 bzr_http_fixes)
  • Revision ID: pqm@pqm.ubuntu.com-20061218173533-46a6cb3b1d08b8ab
(John Arbash Meinel) Implement bzr+http:// and update docs to indicate how to set it up.

Show diffs side-by-side

added added

removed removed

Lines of Context:
218
218
    pass
219
219
 
220
220
# must do this otherwise urllib can't parse the urls properly :(
221
 
for scheme in ['ssh', 'bzr', 'bzr+loopback', 'bzr+ssh']:
 
221
for scheme in ['ssh', 'bzr', 'bzr+loopback', 'bzr+ssh', 'bzr+http']:
222
222
    transport.register_urlparse_netloc_protocol(scheme)
223
223
del scheme
224
224
 
1757
1757
        super(SmartSSHTransport, self).__init__(url, medium=medium)
1758
1758
 
1759
1759
 
 
1760
class SmartHTTPTransport(SmartTransport):
 
1761
    """Just a way to connect between a bzr+http:// url and http://.
 
1762
    
 
1763
    This connection operates slightly differently than the SmartSSHTransport.
 
1764
    It uses a plain http:// transport underneath, which defines what remote
 
1765
    .bzr/smart URL we are connected to. From there, all paths that are sent are
 
1766
    sent as relative paths, this way, the remote side can properly
 
1767
    de-reference them, since it is likely doing rewrite rules to translate an
 
1768
    HTTP path into a local path.
 
1769
    """
 
1770
 
 
1771
    def __init__(self, url, http_transport=None):
 
1772
        assert url.startswith('bzr+http://')
 
1773
 
 
1774
        if http_transport is None:
 
1775
            http_url = url[len('bzr+'):]
 
1776
            self._http_transport = transport.get_transport(http_url)
 
1777
        else:
 
1778
            self._http_transport = http_transport
 
1779
        http_medium = self._http_transport.get_smart_medium()
 
1780
        super(SmartHTTPTransport, self).__init__(url, medium=http_medium)
 
1781
 
 
1782
    def _remote_path(self, relpath):
 
1783
        """After connecting HTTP Transport only deals in relative URLs."""
 
1784
        if relpath == '.':
 
1785
            return ''
 
1786
        else:
 
1787
            return relpath
 
1788
 
 
1789
    def abspath(self, relpath):
 
1790
        """Return the full url to the given relative path.
 
1791
        
 
1792
        :param relpath: the relative path or path components
 
1793
        :type relpath: str or list
 
1794
        """
 
1795
        return self._unparse_url(self._combine_paths(self._path, relpath))
 
1796
 
 
1797
    def clone(self, relative_url):
 
1798
        """Make a new SmartHTTPTransport related to me.
 
1799
 
 
1800
        This is re-implemented rather than using the default
 
1801
        SmartTransport.clone() because we must be careful about the underlying
 
1802
        http transport.
 
1803
        """
 
1804
        if relative_url:
 
1805
            abs_url = self.abspath(relative_url)
 
1806
        else:
 
1807
            abs_url = self.base
 
1808
        # By cloning the underlying http_transport, we are able to share the
 
1809
        # connection.
 
1810
        new_transport = self._http_transport.clone(relative_url)
 
1811
        return SmartHTTPTransport(abs_url, http_transport=new_transport)
 
1812
 
 
1813
 
1760
1814
def get_test_permutations():
1761
1815
    """Return (transport, server) permutations for testing."""
1762
1816
    ### We may need a little more test framework support to construct an