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)
def test_download_no_Content_Length(self): download = Download(output_file=open(os.devnull, 'w')) download.start(Response(url=httpbin('/'))) time.sleep(1.1) download.chunk_downloaded(b'12345') download.finish() self.assertFalse(download.interrupted)
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
def test_download_no_Content_Length(self, httpbin): devnull = open(os.devnull, 'w') download = Download(output_file=devnull, progress_file=devnull) download.start(Response(url=httpbin.url + '/')) time.sleep(1.1) download.chunk_downloaded(b'12345') download.finish() assert not download.interrupted
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)
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
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)
def test_download_with_Content_Length(self): devnull = open(os.devnull, 'w') download = Download(output_file=devnull, progress_file=devnull) 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() assert not download.interrupted
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)
def test_download_with_Content_Length(self): devnull = open(os.devnull, 'w') download = Download(output_file=devnull, progress_file=devnull) 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() assert not download.interrupted
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)
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
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