Show More
@@ -305,6 +305,66 def sendrequest(ui, opener, req): | |||
|
305 | 305 | |
|
306 | 306 | return res |
|
307 | 307 | |
|
308 | def parsev1commandresponse(ui, baseurl, requrl, qs, resp, compressible): | |
|
309 | # record the url we got redirected to | |
|
310 | respurl = pycompat.bytesurl(resp.geturl()) | |
|
311 | if respurl.endswith(qs): | |
|
312 | respurl = respurl[:-len(qs)] | |
|
313 | if baseurl.rstrip('/') != respurl.rstrip('/'): | |
|
314 | if not ui.quiet: | |
|
315 | ui.warn(_('real URL is %s\n') % respurl) | |
|
316 | ||
|
317 | try: | |
|
318 | proto = pycompat.bytesurl(resp.getheader(r'content-type', r'')) | |
|
319 | except AttributeError: | |
|
320 | proto = pycompat.bytesurl(resp.headers.get(r'content-type', r'')) | |
|
321 | ||
|
322 | safeurl = util.hidepassword(baseurl) | |
|
323 | if proto.startswith('application/hg-error'): | |
|
324 | raise error.OutOfBandError(resp.read()) | |
|
325 | # accept old "text/plain" and "application/hg-changegroup" for now | |
|
326 | if not (proto.startswith('application/mercurial-') or | |
|
327 | (proto.startswith('text/plain') | |
|
328 | and not resp.headers.get('content-length')) or | |
|
329 | proto.startswith('application/hg-changegroup')): | |
|
330 | ui.debug("requested URL: '%s'\n" % util.hidepassword(requrl)) | |
|
331 | raise error.RepoError( | |
|
332 | _("'%s' does not appear to be an hg repository:\n" | |
|
333 | "---%%<--- (%s)\n%s\n---%%<---\n") | |
|
334 | % (safeurl, proto or 'no content-type', resp.read(1024))) | |
|
335 | ||
|
336 | if proto.startswith('application/mercurial-'): | |
|
337 | try: | |
|
338 | version = proto.split('-', 1)[1] | |
|
339 | version_info = tuple([int(n) for n in version.split('.')]) | |
|
340 | except ValueError: | |
|
341 | raise error.RepoError(_("'%s' sent a broken Content-Type " | |
|
342 | "header (%s)") % (safeurl, proto)) | |
|
343 | ||
|
344 | # TODO consider switching to a decompression reader that uses | |
|
345 | # generators. | |
|
346 | if version_info == (0, 1): | |
|
347 | if compressible: | |
|
348 | resp = util.compengines['zlib'].decompressorreader(resp) | |
|
349 | ||
|
350 | return respurl, resp | |
|
351 | ||
|
352 | elif version_info == (0, 2): | |
|
353 | # application/mercurial-0.2 always identifies the compression | |
|
354 | # engine in the payload header. | |
|
355 | elen = struct.unpack('B', resp.read(1))[0] | |
|
356 | ename = resp.read(elen) | |
|
357 | engine = util.compengines.forwiretype(ename) | |
|
358 | return respurl, engine.decompressorreader(resp) | |
|
359 | else: | |
|
360 | raise error.RepoError(_("'%s' uses newer protocol %s") % | |
|
361 | (safeurl, version)) | |
|
362 | ||
|
363 | if compressible: | |
|
364 | resp = util.compengines['zlib'].decompressorreader(resp) | |
|
365 | ||
|
366 | return respurl, resp | |
|
367 | ||
|
308 | 368 | class httppeer(wireproto.wirepeer): |
|
309 | 369 | def __init__(self, ui, path, url, opener, requestbuilder): |
|
310 | 370 | self.ui = ui |
@@ -362,60 +422,8 class httppeer(wireproto.wirepeer): | |||
|
362 | 422 | |
|
363 | 423 | resp = sendrequest(self.ui, self._urlopener, req) |
|
364 | 424 | |
|
365 | # record the url we got redirected to | |
|
366 | resp_url = pycompat.bytesurl(resp.geturl()) | |
|
367 | if resp_url.endswith(qs): | |
|
368 | resp_url = resp_url[:-len(qs)] | |
|
369 | if self._url.rstrip('/') != resp_url.rstrip('/'): | |
|
370 | if not self.ui.quiet: | |
|
371 | self.ui.warn(_('real URL is %s\n') % resp_url) | |
|
372 | self._url = resp_url | |
|
373 | try: | |
|
374 | proto = pycompat.bytesurl(resp.getheader(r'content-type', r'')) | |
|
375 | except AttributeError: | |
|
376 | proto = pycompat.bytesurl(resp.headers.get(r'content-type', r'')) | |
|
377 | ||
|
378 | safeurl = util.hidepassword(self._url) | |
|
379 | if proto.startswith('application/hg-error'): | |
|
380 | raise error.OutOfBandError(resp.read()) | |
|
381 | # accept old "text/plain" and "application/hg-changegroup" for now | |
|
382 | if not (proto.startswith('application/mercurial-') or | |
|
383 | (proto.startswith('text/plain') | |
|
384 | and not resp.headers.get('content-length')) or | |
|
385 | proto.startswith('application/hg-changegroup')): | |
|
386 | self.ui.debug("requested URL: '%s'\n" % util.hidepassword(cu)) | |
|
387 | raise error.RepoError( | |
|
388 | _("'%s' does not appear to be an hg repository:\n" | |
|
389 | "---%%<--- (%s)\n%s\n---%%<---\n") | |
|
390 | % (safeurl, proto or 'no content-type', resp.read(1024))) | |
|
391 | ||
|
392 | if proto.startswith('application/mercurial-'): | |
|
393 | try: | |
|
394 | version = proto.split('-', 1)[1] | |
|
395 | version_info = tuple([int(n) for n in version.split('.')]) | |
|
396 | except ValueError: | |
|
397 | raise error.RepoError(_("'%s' sent a broken Content-Type " | |
|
398 | "header (%s)") % (safeurl, proto)) | |
|
399 | ||
|
400 | # TODO consider switching to a decompression reader that uses | |
|
401 | # generators. | |
|
402 | if version_info == (0, 1): | |
|
403 | if _compressible: | |
|
404 | return util.compengines['zlib'].decompressorreader(resp) | |
|
405 | return resp | |
|
406 | elif version_info == (0, 2): | |
|
407 | # application/mercurial-0.2 always identifies the compression | |
|
408 | # engine in the payload header. | |
|
409 | elen = struct.unpack('B', resp.read(1))[0] | |
|
410 | ename = resp.read(elen) | |
|
411 | engine = util.compengines.forwiretype(ename) | |
|
412 | return engine.decompressorreader(resp) | |
|
413 | else: | |
|
414 | raise error.RepoError(_("'%s' uses newer protocol %s") % | |
|
415 | (safeurl, version)) | |
|
416 | ||
|
417 | if _compressible: | |
|
418 | return util.compengines['zlib'].decompressorreader(resp) | |
|
425 | self._url, resp = parsev1commandresponse(self.ui, self._url, cu, qs, | |
|
426 | resp, _compressible) | |
|
419 | 427 | |
|
420 | 428 | return resp |
|
421 | 429 |
General Comments 0
You need to be logged in to leave comments.
Login now