Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagesmc
Path: blob/master/src/sage/dev/digest_transport.py
8815 views
1
r"""
2
HTTP transport to the trac server
3
4
AUTHORS:
5
6
- David Roe, Julian Rueth, Robert Bradshaw: initial version
7
8
"""
9
#*****************************************************************************
10
# Copyright (C) 2013 David Roe <[email protected]>
11
# Julian Rueth <[email protected]>
12
# Robert Bradshaw <[email protected]>
13
#
14
# Distributed under the terms of the GNU General Public License (GPL)
15
# as published by the Free Software Foundation; either version 2 of
16
# the License, or (at your option) any later version.
17
# http://www.gnu.org/licenses/
18
#*****************************************************************************
19
20
from xmlrpclib import SafeTransport, Fault
21
import urllib2
22
23
class DigestTransport(object, SafeTransport):
24
"""
25
Handles an HTTP transaction to an XML-RPC server.
26
27
EXAMPLES::
28
29
sage: from sage.dev.digest_transport import DigestTransport
30
sage: DigestTransport()
31
<sage.dev.digest_transport.DigestTransport object at ...>
32
"""
33
def __init__(self):
34
"""
35
Initialization.
36
37
EXAMPLES::
38
39
sage: from sage.dev.digest_transport import DigestTransport
40
sage: type(DigestTransport())
41
<class 'sage.dev.digest_transport.DigestTransport'>
42
"""
43
SafeTransport.__init__(self)
44
self._opener = None
45
46
@property
47
def opener(self):
48
"""
49
Create an opener object.
50
51
By calling :meth:`add_authentication` before calling this property for
52
the first time, authentication credentials can be set.
53
54
EXAMPLES::
55
56
sage: from sage.dev.digest_transport import DigestTransport
57
sage: DigestTransport().opener
58
<urllib2.OpenerDirector instance at 0x...>
59
"""
60
if self._opener is None:
61
self._opener = urllib2.build_opener(urllib2.HTTPDigestAuthHandler())
62
return self._opener
63
64
def add_authentication(self, realm, url, username, password):
65
"""
66
Set authentication credentials for the opener returned by
67
:meth:`opener`.
68
69
EXAMPLES::
70
71
sage: from sage.dev.digest_transport import DigestTransport
72
sage: dt = DigestTransport()
73
sage: dt.add_authentication("realm", "url", "username", "password")
74
sage: dt.opener
75
<urllib2.OpenerDirector instance at 0x...>
76
"""
77
assert self._opener is None
78
authhandler = urllib2.HTTPDigestAuthHandler()
79
authhandler.add_password(realm,url,username,password)
80
self._opener = urllib2.build_opener(authhandler)
81
82
def single_request(self, host, handler, request_body, verbose):
83
"""
84
Issue an XML-RPC request.
85
86
EXAMPLES::
87
88
sage: from sage.dev.digest_transport import DigestTransport
89
sage: from sage.env import TRAC_SERVER_URI
90
sage: import urlparse
91
sage: url = urlparse.urlparse(TRAC_SERVER_URI).netloc
92
sage: d = DigestTransport()
93
sage: d.single_request(url, 'xmlrpc', "<?xml version='1.0'?><methodCall><methodName>ticket.get</methodName><params><param><value><int>1000</int></value></param></params></methodCall>", 0) # optional: internet
94
([1000,
95
<DateTime '20071025T16:48:05' at ...>,
96
<DateTime '...' at ...>,
97
{'status': 'closed',
98
'changetime': <DateTime '...' at ...>,
99
'description': '...',
100
'reporter': 'was',
101
'cc': '',
102
'type': 'defect',
103
'milestone': 'sage-2.10',
104
'_ts': '...',
105
'component': 'distribution',
106
'summary': 'Sage does not have 10000 users yet.',
107
'priority': 'major',
108
'owner': 'was',
109
'time': <DateTime '20071025T16:48:05' at ...>,
110
'keywords': '',
111
'resolution': 'fixed'}],)
112
"""
113
try:
114
import urlparse
115
req = urllib2.Request(
116
urlparse.urlunparse(('http', host, handler, '', '', '')),
117
request_body, {'Content-Type': 'text/xml',
118
'User-Agent': self.user_agent})
119
response = self.opener.open(req)
120
self.verbose = verbose
121
return self.parse_response(response)
122
except Fault as e:
123
from trac_error import TracInternalError
124
raise TracInternalError(e)
125
except urllib2.HTTPError as e:
126
if e.code == 401:
127
from trac_error import TracAuthenticationError as TracError
128
else:
129
from trac_error import TracConnectionError as TracError
130
raise TracError()
131
132