~mvo/click/acquire-asyncio

« back to all changes in this revision

Viewing changes to click/acquire.py

  • Committer: Michael Vogt
  • Date: 2014-09-19 14:00:46 UTC
  • Revision ID: michael.vogt@ubuntu.com-20140919140046-s3cv307ihch9mk0e
fix py3 compat problems

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
 
20
20
__metaclass__ = type
21
21
__all__ = [
 
22
    'read_message',
22
23
    'ClickAcquire',
23
24
    'ClickAcquireError',
 
25
    'ClickAcquireMethod',
 
26
    'ClickAcquireMethodPycurl',
 
27
    'ClickAcquireMethodUbuntuDownloadManager',
24
28
    'ClickAcquireStatus',
25
29
    'ClickAcquireStatusText',
26
30
    ]
49
53
def read_message(filelike):
50
54
    msg = []
51
55
    while True:
 
56
        #raw_line = filelike.readline()
 
57
        #line = raw_line.encode("utf-8")
52
58
        line = filelike.readline()
 
59
        #sys.stderr.write(line)
53
60
        if line == "":
54
61
            break
55
62
        if len(msg) > 1 and line == "\n" and msg[-1].endswith("\n"):
57
64
        elif line == "\n":
58
65
            continue
59
66
        msg.append(line)
 
67
    #sys.stderr.write(str(msg)+"\n\n")
 
68
    if msg == []:
 
69
        return "", -1
60
70
    number = int(msg[0].split()[0])
61
71
    return "".join(msg), number
62
72
 
113
123
 
114
124
        """).format(uri=uri, destfile=destfile)
115
125
        pipe.write(cmd)
 
126
        pipe.flush()
116
127
 
117
128
    def _redirect(self, pipe, new_uri, destfile):
118
129
        self._uri_acquire(pipe, new_uri, destfile)
128
139
            rl, wl, xl = select.select([p.stdout], [], [], self.TIMEOUT)
129
140
            if rl:
130
141
                raw_message, number = read_message(p.stdout)
131
 
                #print(raw_message)
 
142
                #sys.stderr.write(raw_message)
132
143
                message = Deb822(raw_message)
133
 
                if number == self.M_CAPABILITIES:
 
144
                if number < 0:
 
145
                    break
 
146
                elif number == self.M_CAPABILITIES:
134
147
                    self._uri_acquire(p.stdin, uri, destfile)
135
148
                elif number == self.M_STATUS:
136
149
                    pass
178
191
        while True:
179
192
            raw_message, number = read_message(sys.stdin)
180
193
            message = Deb822(raw_message)
181
 
            #print(number)
182
 
            if number == self.M_CONFIGURATION:
 
194
            #sys.stderr.write(raw_message)
 
195
            if number < 0:
 
196
                break
 
197
            elif number == self.M_CONFIGURATION:
183
198
                pass
184
199
            elif number == self.M_FETCH:
185
 
                self.fetch(message.get("URI"), message.get("FileName"))
 
200
                self.fetch(message.get("URI"),
 
201
                           message.get("FileName").encode("utf-8"))
186
202
 
187
203
    def uri_start(self, uri, filename, size):
188
204
        sys.stdout.write(dedent("""\
194
210
        sys.stdout.flush()
195
211
 
196
212
    def uri_done(self, uri, filename):
197
 
        hashes = apt_pkg.Hashes(str(filename))
 
213
        hashes = apt_pkg.Hashes(filename)
198
214
        sys.stdout.write(dedent("""\
199
215
        201 URI Done
200
216
        URI: {uri}
225
241
        self._destfile_fp.write(data)
226
242
        return len(data)
227
243
 
228
 
    def _headers_callback(self, header):
 
244
    def _headers_callback(self, raw_header):
 
245
        header = raw_header.decode("utf-8")
229
246
        if header.startswith("Content-Length: "):
230
247
            self.uri_start(
231
248
                self.uri, self._destfile_fp.name, header.split(":")[1])
233
250
 
234
251
    def fetch(self, uri, destfile):
235
252
        self.uri = uri
236
 
        self._destfile_fp = open(destfile, "w")
 
253
        self._destfile_fp = open(destfile, "wb")
237
254
        curl = pycurl.Curl()
238
255
        curl.setopt(pycurl.URL, uri)
239
256
        curl.setopt(pycurl.WRITEFUNCTION, self._write_to_file_callback)
246
263
            self._destfile_fp.close()
247
264
            self.uri_done(uri, destfile)
248
265
        except pycurl.error as e:
249
 
            self.fail(self.uri, e[1])
 
266
            self.fail(self.uri, e.args)
250
267
            self._destfile_fp.close()
251
 
            os.remove(destfile)
 
268
            if os.path.exists(destfile):
 
269
                os.remove(destfile)
252
270
 
253
271
 
254
272
class ClickAcquireMethodUbuntuDownloadManager(ClickAcquireMethod):