~ubuntu-branches/ubuntu/vivid/simplestreams/vivid-updates

« back to all changes in this revision

Viewing changes to simplestreams/contentsource.py

  • Committer: Package Import Robot
  • Author(s): Scott Moser
  • Date: 2013-04-11 13:05:52 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20130411130552-ow8n8lvb3yp75az8
Tags: 0.1.0~bzr223-0ubuntu1
* New upstream snapshot.
  * some fixes to resolvework
  * include upstream work on glance mirror with support for
    writing simplestreams output to swift

Show diffs side-by-side

added added

removed removed

Lines of Context:
110
110
        self.fd.close()
111
111
 
112
112
 
 
113
class IteratorContentSource(ContentSource):
 
114
    def __init__(self, itgen, url=None):
 
115
        self.itgen = itgen
 
116
        self.url = url
 
117
        self.r_iter = None
 
118
        self.leftover = bytes()
 
119
        self.consumed = False
 
120
 
 
121
    def open(self):
 
122
        if self.r_iter:
 
123
            return
 
124
 
 
125
        try:
 
126
            self.r_iter = self.itgen()
 
127
        except Exception as exc:
 
128
            if self.is_enoent(exc):
 
129
                enoent = IOError(exc)
 
130
                enoent.errno = errno.ENOENT
 
131
                raise enoent
 
132
            raise exc
 
133
 
 
134
    def is_enoent(self, exc):
 
135
        return (isinstance(exc, IOError) and exc.errno == errno.ENOENT)
 
136
 
 
137
    def read(self, size=None):
 
138
        self.open()
 
139
 
 
140
        if self.consumed:
 
141
            return bytes()
 
142
 
 
143
        if (size is None or size < 0):
 
144
            # read everything
 
145
            ret = self.leftover
 
146
            self.leftover = bytes()
 
147
            for buf in self.r_iter:
 
148
                ret += buf
 
149
            self.consumed = True
 
150
            return ret
 
151
 
 
152
        ret = bytes()
 
153
 
 
154
        if self.leftover:
 
155
            if len(self.leftover) > size:
 
156
                ret = self.leftover[0:size]
 
157
                self.leftover = self.leftover[size:]
 
158
                return ret
 
159
            ret = self.leftover
 
160
            self.leftover = bytes()
 
161
 
 
162
        while True:
 
163
            try:
 
164
                ret += self.r_iter.next()
 
165
                if len(ret) >= size:
 
166
                    self.leftover = ret[size:]
 
167
                    ret = ret[0:size]
 
168
                    break
 
169
            except StopIteration:
 
170
                self.consumed = True
 
171
                break
 
172
        return ret
 
173
 
 
174
    def close():
 
175
        pass
 
176
 
 
177
 
113
178
class MemoryContentSource(FdContentSource):
114
179
    def __init__(self, url=None, content=""):
115
180
        fd = StringIO.StringIO(content)
131
196
 
132
197
class Urllib2UrlReader(UrlReader):
133
198
    def __init__(self, url):
134
 
        self.url = url
 
199
        (url, username, password) = parse_url_auth(url)
 
200
        self.url = url
 
201
        if username is None:
 
202
            opener = urllib2.urlopen
 
203
        else:
 
204
            mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
 
205
            mgr.add_password(None, url, username, password)
 
206
            handler = urllib2.HTTPBasicAuthHandler(mgr)
 
207
            opener = urllib2.build_opener(handler).open
 
208
 
135
209
        try:
136
 
            self.req = urllib2.urlopen(url)
 
210
            self.req = opener(url)
137
211
        except urllib2.HTTPError as e:
138
212
            if e.code == 404:
139
213
                myerr = IOError("Unable to open %s" % url)
140
214
                myerr.errno = errno.ENOENT
141
215
                raise myerr
142
216
            raise e
143
 
 
 
217
 
144
218
    def read(self, size=-1):
145
219
        return self.req.read(size)
146
220
 
156
230
    # r.close()
157
231
    def __init__(self, url, buflen=None):
158
232
        self.url = url
159
 
        self.req = requests.get(url, stream=True)
 
233
        (url, user, password) = parse_url_auth(url)
 
234
        self.req = requests.get(url, stream=True, auth=(user, password))
160
235
        self.r_iter = None
161
236
        if buflen is None:
162
237
            buflen = 1024 * 50
226
301
        self.req.close()
227
302
 
228
303
 
 
304
def parse_url_auth(url):
 
305
    parsed = urlparse.urlparse(url)
 
306
    authtok = "%s:%s@" % (parsed.username, parsed.password)
 
307
    if parsed.netloc.startswith(authtok):
 
308
        url = url.replace(authtok, "", 1)
 
309
    return (url, parsed.username, parsed.password)
 
310
 
 
311
 
229
312
if URL_READER_CLASSNAME == "RequestsUrlReader":
230
313
    URL_READER = RequestsUrlReader
231
314
elif URL_READER_CLASSNAME == "Urllib2UrlReader":