Пример #1
0
 def test_download_with_Content_Length(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(
         Response(url=httpbin('/'), headers={'Content-Length': 10}))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     self.assertFalse(download.interrupted)
Пример #2
0
 def test_download_with_Content_Length(self, httpbin):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(
         Response(url=httpbin.url + '/', headers={'Content-Length': 10}))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     assert not download.interrupted
Пример #3
0
 def test_download_interrupted(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(
         Response(url=httpbin('/'), headers={'Content-Length': 5}))
     download.chunk_downloaded(b'1234')
     download.finish()
     self.assertTrue(download.interrupted)
Пример #4
0
 def test_download_interrupted(self, httpbin):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(
         Response(url=httpbin.url + '/', headers={'Content-Length': 5}))
     download.chunk_downloaded(b'1234')
     download.finish()
     assert download.interrupted
Пример #5
0
 def test_download_no_Content_Length(self):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(Response(url=httpbin('/')))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     assert not download.interrupted
Пример #6
0
 def test_download_with_Content_Length(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(Response(
         url=httpbin('/'),
          headers={'Content-Length': 10}
     ))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     self.assertFalse(download.interrupted)
Пример #7
0
 def test_download_with_Content_Length(self, httpbin):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(Response(
         url=httpbin.url + '/',
         headers={'Content-Length': 10}
     ))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     assert not download.interrupted
Пример #8
0
 def test_download_with_Content_Length(self):
     download = Download(
         output_file=open(os.devnull, 'w'),
         progress_file=BytesIO(),
     )
     download.start(
         Response(url=httpbin('/'), headers={'Content-Length': 5}))
     download._on_progress(b'12345')
     time.sleep(1.5)
     download.finish()
     self.assertFalse(download.interrupted)
Пример #9
0
 def test_download_no_Content_Length(self):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(Response(url=httpbin('/')))
     time.sleep(1.1)
     download.chunk_downloaded(b'12345')
     download.finish()
     assert not download.interrupted
Пример #10
0
 def test_download_interrupted(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(Response(
         url=httpbin('/'),
         headers={'Content-Length': 5}
     ))
     download.chunk_downloaded(b'1234')
     download.finish()
     self.assertTrue(download.interrupted)
Пример #11
0
 def test_download_interrupted(self, httpbin):
     devnull = open(os.devnull, 'w')
     download = Download(output_file=devnull, progress_file=devnull)
     download.start(Response(
         url=httpbin.url + '/',
         headers={'Content-Length': 5}
     ))
     download.chunk_downloaded(b'1234')
     download.finish()
     assert download.interrupted
Пример #12
0
 def test_download_with_Content_Length(self):
     download = Download(
         output_file=open(os.devnull, 'w'),
         progress_file=BytesIO(),
     )
     download.start(Response(
         url=httpbin('/'),
         headers={'Content-Length': 5}
     ))
     download._on_progress(b'12345')
     time.sleep(1.5)
     download.finish()
     self.assertFalse(download.interrupted)
Пример #13
0
 def test_download_no_Content_Length(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(Response(url=httpbin('/')))
     download._on_progress(b'12345')
     download.finish()
     self.assertFalse(download.interrupted)
Пример #14
0
def main(args=sys.argv[1:], env=Environment()):
    """Run the main program and write the output to ``env.stdout``.

    Return exit status code.

    """
    args = decode_args(args, env.stdin_encoding)
    plugin_manager.load_installed_plugins()

    from httpie.cli import parser

    if env.config.default_options:
        args = env.config.default_options + args

    def error(msg, *args, **kwargs):
        msg = msg % args
        level = kwargs.get('level', 'error')
        env.stderr.write('\nhttp: %s: %s\n' % (level, msg))

    debug = '--debug' in args
    traceback = debug or '--traceback' in args
    exit_status = ExitStatus.OK

    if debug:
        print_debug_info(env)
        if args == ['--debug']:
            return exit_status

    download = None

    try:
        args = parser.parse_args(args=args, env=env)

        if args.download:
            args.follow = True  # --download implies --follow.
            download = Download(
                output_file=args.output_file,
                progress_file=env.stderr,
                resume=args.download_resume
            )
            download.pre_request(args.headers)

        response = get_response(args, config_dir=env.config.directory)

        if args.check_status or download:

            exit_status = get_exit_status(
                http_status=response.status_code,
                follow=args.follow
            )

            if not env.stdout_isatty and exit_status != ExitStatus.OK:
                error('HTTP %s %s',
                      response.raw.status,
                      response.raw.reason,
                      level='warning')

        write_kwargs = {
            'stream': build_output_stream(
                args, env, response.request, response),

            # This will in fact be `stderr` with `--download`
            'outfile': env.stdout,

            'flush': env.stdout_isatty or args.stream
        }

        try:

            if env.is_windows and is_py3 and 'colors' in args.prettify:
                write_with_colors_win_py3(**write_kwargs)
            else:
                write(**write_kwargs)

            if download and exit_status == ExitStatus.OK:
                # Response body download.
                download_stream, download_to = download.start(response)
                write(
                    stream=download_stream,
                    outfile=download_to,
                    flush=False,
                )
                download.finish()
                if download.interrupted:
                    exit_status = ExitStatus.ERROR
                    error('Incomplete download: size=%d; downloaded=%d' % (
                        download.status.total_size,
                        download.status.downloaded
                    ))

        except IOError as e:
            if not traceback and e.errno == errno.EPIPE:
                # Ignore broken pipes unless --traceback.
                env.stderr.write('\n')
            else:
                raise
    except (KeyboardInterrupt, SystemExit):
        if traceback:
            raise
        env.stderr.write('\n')
        exit_status = ExitStatus.ERROR

    except requests.Timeout:
        exit_status = ExitStatus.ERROR_TIMEOUT
        error('Request timed out (%ss).', args.timeout)

    except Exception as e:
        # TODO: Better distinction between expected and unexpected errors.
        #       Network errors vs. bugs, etc.
        if traceback:
            raise
        error('%s: %s', type(e).__name__, str(e))
        exit_status = ExitStatus.ERROR

    finally:
        if download and not download.finished:
            download.failed()

    return exit_status
Пример #15
0
def main(args=sys.argv[1:], env=Environment()):
    """Run the main program and write the output to ``env.stdout``.

    Return exit status code.

    """
    args = decode_args(args, env.stdin_encoding)
    plugin_manager.load_installed_plugins()

    from httpie.cli import parser

    if env.config.default_options:
        args = env.config.default_options + args

    def error(msg, *args, **kwargs):
        msg = msg % args
        level = kwargs.get('level', 'error')
        env.stderr.write('\nhttp: %s: %s\n' % (level, msg))

    debug = '--debug' in args
    traceback = debug or '--traceback' in args
    exit_status = ExitStatus.OK

    if debug:
        print_debug_info(env)
        if args == ['--debug']:
            return exit_status

    download = None

    try:
        args = parser.parse_args(args=args, env=env)

        if args.download:
            args.follow = True  # --download implies --follow.
            download = Download(output_file=args.output_file,
                                progress_file=env.stderr,
                                resume=args.download_resume)
            download.pre_request(args.headers)

        response = get_response(args, config_dir=env.config.directory)

        if args.check_status or download:

            exit_status = get_exit_status(http_status=response.status_code,
                                          follow=args.follow)

            if not env.stdout_isatty and exit_status != ExitStatus.OK:
                error('HTTP %s %s',
                      response.raw.status,
                      response.raw.reason,
                      level='warning')

        write_kwargs = {
            'stream': build_output_stream(args, env, response.request,
                                          response),

            # This will in fact be `stderr` with `--download`
            'outfile': env.stdout,
            'flush': env.stdout_isatty or args.stream
        }

        try:

            if env.is_windows and is_py3 and 'colors' in args.prettify:
                write_with_colors_win_py3(**write_kwargs)
            else:
                write(**write_kwargs)

            if download and exit_status == ExitStatus.OK:
                # Response body download.
                download_stream, download_to = download.start(response)
                write(
                    stream=download_stream,
                    outfile=download_to,
                    flush=False,
                )
                download.finish()
                if download.interrupted:
                    exit_status = ExitStatus.ERROR
                    error('Incomplete download: size=%d; downloaded=%d' %
                          (download.status.total_size,
                           download.status.downloaded))

        except IOError as e:
            if not traceback and e.errno == errno.EPIPE:
                # Ignore broken pipes unless --traceback.
                env.stderr.write('\n')
            else:
                raise
    except KeyboardInterrupt:
        if traceback:
            raise
        env.stderr.write('\n')
        exit_status = ExitStatus.ERROR
    except SystemExit as e:
        if e.code != ExitStatus.OK:
            if traceback:
                raise
            env.stderr.write('\n')
            exit_status = ExitStatus.ERROR
    except requests.Timeout:
        exit_status = ExitStatus.ERROR_TIMEOUT
        error('Request timed out (%ss).', args.timeout)

    except Exception as e:
        # TODO: Better distinction between expected and unexpected errors.
        #       Network errors vs. bugs, etc.
        if traceback:
            raise
        error('%s: %s', type(e).__name__, str(e))
        exit_status = ExitStatus.ERROR

    finally:
        if download and not download.finished:
            download.failed()

    return exit_status
Пример #16
0
 def test_download_no_Content_Length(self):
     download = Download(output_file=open(os.devnull, 'w'))
     download.start(Response(url=httpbin('/')))
     download._on_progress(b'12345')
     download.finish()
     self.assertFalse(download.interrupted)