libv8 6.7.288.46.1 → 7.3.492.27.0beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +4 -0
- data/README.md +2 -0
- data/ext/libv8/builder.rb +6 -2
- data/lib/libv8/version.rb +1 -1
- data/vendor/depot_tools/.gitattributes +1 -0
- data/vendor/depot_tools/.gitignore +7 -0
- data/vendor/depot_tools/CROS_OWNERS +5 -0
- data/vendor/depot_tools/OWNERS +12 -1
- data/vendor/depot_tools/PRESUBMIT.py +16 -9
- data/vendor/depot_tools/README.md +9 -2
- data/vendor/depot_tools/autoninja +14 -6
- data/vendor/depot_tools/autoninja.bat +11 -1
- data/vendor/depot_tools/autoninja.py +40 -18
- data/vendor/depot_tools/bb +12 -0
- data/vendor/depot_tools/bb.bat +7 -0
- data/vendor/depot_tools/bootstrap/win/manifest.txt +1 -1
- data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +1 -1
- data/vendor/depot_tools/bootstrap/win/win_tools.py +2 -1
- data/vendor/depot_tools/buildbucket.py +57 -4
- data/vendor/depot_tools/cipd +157 -44
- data/vendor/depot_tools/cipd.bat +51 -14
- data/vendor/depot_tools/cipd.ps1 +104 -42
- data/vendor/depot_tools/cipd_client_version +1 -1
- data/vendor/depot_tools/cipd_client_version.digests +21 -0
- data/vendor/depot_tools/cipd_manifest.txt +19 -6
- data/vendor/depot_tools/cipd_manifest.versions +318 -0
- data/vendor/depot_tools/clang_format.py +4 -4
- data/vendor/depot_tools/cpplint.py +44 -199
- data/vendor/depot_tools/dart_format.py +2 -2
- data/vendor/depot_tools/detect_host_arch.py +8 -3
- data/vendor/depot_tools/download_from_google_storage.py +47 -39
- data/vendor/depot_tools/fetch.py +30 -18
- data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
- data/vendor/depot_tools/fetch_configs/chromium.py +18 -1
- data/vendor/depot_tools/fetch_configs/config_util.py +4 -2
- data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
- data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
- data/vendor/depot_tools/fix_encoding.py +3 -3
- data/vendor/depot_tools/gclient +1 -1
- data/vendor/depot_tools/gclient.py +415 -198
- data/vendor/depot_tools/gclient_eval.py +220 -171
- data/vendor/depot_tools/gclient_paths.py +142 -0
- data/vendor/depot_tools/gclient_scm.py +200 -51
- data/vendor/depot_tools/gclient_utils.py +88 -191
- data/vendor/depot_tools/gerrit_client.py +13 -0
- data/vendor/depot_tools/gerrit_util.py +158 -23
- data/vendor/depot_tools/git-nav-upstream +1 -1
- data/vendor/depot_tools/git_cache.py +77 -24
- data/vendor/depot_tools/git_cl.py +705 -1099
- data/vendor/depot_tools/git_common.py +9 -6
- data/vendor/depot_tools/git_map_branches.py +19 -2
- data/vendor/depot_tools/git_nav_downstream.py +3 -4
- data/vendor/depot_tools/git_rebase_update.py +14 -0
- data/vendor/depot_tools/git_reparent_branch.py +8 -2
- data/vendor/depot_tools/gn.py +38 -3
- data/vendor/depot_tools/gsutil.py +8 -3
- data/vendor/depot_tools/gsutil.py.bat +15 -0
- data/vendor/depot_tools/gsutil.vpython +16 -0
- data/vendor/depot_tools/infra/config/OWNERS +0 -1
- data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
- data/vendor/depot_tools/lucicfg +12 -0
- data/vendor/depot_tools/lucicfg.bat +7 -0
- data/vendor/depot_tools/man/html/git-map-branches.html +34 -2
- data/vendor/depot_tools/man/html/git-new-branch.html +40 -32
- data/vendor/depot_tools/man/man1/git-map-branches.1 +24 -5
- data/vendor/depot_tools/man/man1/git-new-branch.1 +35 -27
- data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +1 -0
- data/vendor/depot_tools/man/src/git-map-branches.txt +10 -0
- data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +9 -4
- data/vendor/depot_tools/man/src/git-new-branch.txt +1 -1
- data/vendor/depot_tools/metrics.README.md +98 -0
- data/vendor/depot_tools/metrics.py +296 -0
- data/vendor/depot_tools/metrics_utils.py +303 -0
- data/vendor/depot_tools/my_activity.py +91 -29
- data/vendor/depot_tools/ninja +1 -1
- data/vendor/depot_tools/ninjalog.README.md +64 -0
- data/vendor/depot_tools/ninjalog_uploader.py +232 -0
- data/vendor/depot_tools/ninjalog_uploader_wrapper.py +116 -0
- data/vendor/depot_tools/owners.py +30 -13
- data/vendor/depot_tools/owners_finder.py +5 -2
- data/vendor/depot_tools/presubmit_canned_checks.py +188 -29
- data/vendor/depot_tools/presubmit_support.py +18 -41
- data/vendor/depot_tools/pylintrc +23 -19
- data/vendor/depot_tools/recipes/OWNERS +2 -0
- data/vendor/depot_tools/recipes/README.recipes.md +344 -151
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +2 -16
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +141 -99
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +5 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +5 -8
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +6 -98
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +45 -5
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob.json → input_commit_with_id_without_repo.json} +6 -11
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob_empty_revision.json → multiple_patch_refs.json} +8 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +19 -29
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{trychange.json → refs.json} +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +51 -6
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +50 -6
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +51 -6
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +17 -25
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +17 -25
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +18 -26
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +18 -26
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +26 -28
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +45 -5
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +17 -25
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +13 -0
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name.json +13 -152
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +4 -9
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +185 -202
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +52 -157
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +5 -14
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +34 -0
- data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +14 -2
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +7 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +9 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +9 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +9 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +13 -8
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +18 -12
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +18 -12
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +18 -12
- data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +3 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +58 -46
- data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +65 -22
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +20 -21
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +20 -21
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +20 -21
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +20 -21
- data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +5 -2
- data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +62 -14
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +24 -38
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +56 -50
- data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +15 -9
- data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +4 -1
- data/vendor/depot_tools/recipes/recipe_modules/git/api.py +34 -22
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +222 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +224 -0
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +10 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +5 -7
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +5 -7
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +10 -5
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +8 -9
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +12 -8
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +5 -6
- data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +27 -11
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +1 -1
- data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +12 -13
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +5 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +120 -5
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +45 -3
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +25 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +56 -4
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +6 -0
- data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +24 -13
- data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +13 -14
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +2 -3
- data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +1 -2
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +35 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +116 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +82 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +23 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +2 -7
- data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +7 -6
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +1 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +117 -8
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +4 -5
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +7 -4
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +98 -7
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +147 -0
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +8 -5
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +8 -5
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +9 -6
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +9 -6
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +27 -2
- data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +22 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +107 -0
- data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +26 -0
- data/vendor/depot_tools/recipes/recipes.py +37 -27
- data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +7 -10
- data/vendor/depot_tools/repo +34 -8
- data/vendor/depot_tools/roll_dep.py +52 -49
- data/vendor/depot_tools/scm.py +38 -23
- data/vendor/depot_tools/setup_color.py +4 -2
- data/vendor/depot_tools/split_cl.py +32 -4
- data/vendor/depot_tools/subprocess2.py +22 -4
- data/vendor/depot_tools/third_party/httplib2/README.chromium +2 -2
- data/vendor/depot_tools/third_party/httplib2/__init__.py +242 -158
- data/vendor/depot_tools/third_party/httplib2/cacerts.txt +57 -44
- data/vendor/depot_tools/third_party/httplib2/socks.py +15 -5
- data/vendor/depot_tools/third_party/logilab/README.chromium +2 -4
- data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +2 -1
- data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +10 -5
- data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +5 -5
- data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +233 -0
- data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +82 -33
- data/vendor/depot_tools/third_party/logilab/astroid/bases.py +137 -153
- data/vendor/depot_tools/third_party/logilab/astroid/brain/{builtin_inference.py → brain_builtin_inference.py} +117 -26
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +15 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2gi.py → brain_gi.py} +48 -8
- data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2mechanize.py → brain_mechanize.py} +0 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/{pynose.py → brain_nose.py} +4 -1
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +62 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +76 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +44 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/{pysix_moves.py → brain_six.py} +28 -1
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +65 -0
- data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +473 -0
- data/vendor/depot_tools/third_party/logilab/astroid/builder.py +104 -81
- data/vendor/depot_tools/third_party/logilab/astroid/context.py +81 -0
- data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +75 -0
- data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +20 -0
- data/vendor/depot_tools/third_party/logilab/astroid/inference.py +137 -183
- data/vendor/depot_tools/third_party/logilab/astroid/manager.py +45 -169
- data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +37 -14
- data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +112 -41
- data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +243 -156
- data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +35 -22
- data/vendor/depot_tools/third_party/logilab/astroid/objects.py +186 -0
- data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +157 -102
- data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +32 -8
- data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +372 -309
- data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +652 -420
- data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +4 -21
- data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +96 -0
- data/vendor/depot_tools/third_party/logilab/astroid/util.py +89 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +19 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +11 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +20 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +1421 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +9 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +246 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +414 -0
- data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +13 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +24 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +11 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +19 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +2729 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +96 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +512 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +228 -0
- data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +901 -0
- data/vendor/depot_tools/third_party/pylint/README.chromium +2 -25
- data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +13 -3
- data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +1 -2
- data/vendor/depot_tools/third_party/pylint/checkers/async.py +82 -0
- data/vendor/depot_tools/third_party/pylint/checkers/base.py +893 -119
- data/vendor/depot_tools/third_party/pylint/checkers/classes.py +342 -204
- data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +51 -34
- data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +84 -47
- data/vendor/depot_tools/third_party/pylint/checkers/format.py +55 -30
- data/vendor/depot_tools/third_party/pylint/checkers/imports.py +314 -73
- data/vendor/depot_tools/third_party/pylint/checkers/logging.py +10 -8
- data/vendor/depot_tools/third_party/pylint/checkers/misc.py +2 -1
- data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +45 -48
- data/vendor/depot_tools/third_party/pylint/checkers/python3.py +31 -21
- data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +3 -3
- data/vendor/depot_tools/third_party/pylint/checkers/similar.py +4 -5
- data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +24 -10
- data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +120 -56
- data/vendor/depot_tools/third_party/pylint/checkers/strings.py +38 -35
- data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +485 -138
- data/vendor/depot_tools/third_party/pylint/checkers/utils.py +319 -142
- data/vendor/depot_tools/third_party/pylint/checkers/variables.py +329 -207
- data/vendor/depot_tools/third_party/pylint/config.py +739 -76
- data/vendor/depot_tools/third_party/pylint/epylint.py +9 -5
- data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
- data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +311 -0
- data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +62 -0
- data/vendor/depot_tools/third_party/{logilab/common → pylint}/graph.py +30 -133
- data/vendor/depot_tools/third_party/pylint/gui.py +2 -2
- data/vendor/depot_tools/third_party/pylint/interfaces.py +21 -3
- data/vendor/depot_tools/third_party/pylint/lint.py +123 -140
- data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +10 -13
- data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +15 -4
- data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +372 -0
- data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +30 -7
- data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +80 -2
- data/vendor/depot_tools/third_party/{logilab/common → pylint/pyreverse}/vcgutils.py +19 -37
- data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +3 -4
- data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +34 -18
- data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +1 -1
- data/vendor/depot_tools/third_party/pylint/reporters/html.py +10 -3
- data/vendor/depot_tools/third_party/pylint/reporters/json.py +10 -4
- data/vendor/depot_tools/third_party/pylint/reporters/text.py +94 -3
- data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +106 -0
- data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/html_writer.py +17 -57
- data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/nodes.py +52 -74
- data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/text_writer.py +14 -60
- data/vendor/depot_tools/third_party/pylint/testutils.py +22 -20
- data/vendor/depot_tools/third_party/pylint/utils.py +268 -44
- data/vendor/depot_tools/third_party/repo/progress.py +42 -0
- data/vendor/depot_tools/update_depot_tools +1 -1
- data/vendor/depot_tools/upload_metrics.py +25 -0
- data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +45 -15
- data/vendor/depot_tools/win_toolchain/package_from_installed.py +71 -24
- data/vendor/depot_tools/yapf +1 -1
- data/vendor/depot_tools/yapf.bat +1 -1
- metadata +92 -77
- data/vendor/depot_tools/git-crsync +0 -3
- data/vendor/depot_tools/infra/config/cq.cfg +0 -32
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref.json +0 -29
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref_custom.json +0 -29
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/buildbot.json +0 -105
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/shallow.json +0 -195
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle_deprecated.json +0 -248
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8.json +0 -248
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name_no_patch.json +0 -105
- data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/apply_gerrit.py +0 -33
- data/vendor/depot_tools/third_party/logilab/astroid/brain/py2pytest.py +0 -31
- data/vendor/depot_tools/third_party/logilab/astroid/brain/py2qt4.py +0 -22
- data/vendor/depot_tools/third_party/logilab/astroid/brain/py2stdlib.py +0 -334
- data/vendor/depot_tools/third_party/logilab/astroid/inspector.py +0 -273
- data/vendor/depot_tools/third_party/logilab/astroid/utils.py +0 -239
- data/vendor/depot_tools/third_party/logilab/common/LICENSE.txt +0 -339
- data/vendor/depot_tools/third_party/logilab/common/README.chromium +0 -11
- data/vendor/depot_tools/third_party/logilab/common/__init__.py +0 -175
- data/vendor/depot_tools/third_party/logilab/common/__pkginfo__.py +0 -57
- data/vendor/depot_tools/third_party/logilab/common/cache.py +0 -114
- data/vendor/depot_tools/third_party/logilab/common/changelog.py +0 -238
- data/vendor/depot_tools/third_party/logilab/common/clcommands.py +0 -334
- data/vendor/depot_tools/third_party/logilab/common/cli.py +0 -211
- data/vendor/depot_tools/third_party/logilab/common/compat.py +0 -78
- data/vendor/depot_tools/third_party/logilab/common/configuration.py +0 -1105
- data/vendor/depot_tools/third_party/logilab/common/contexts.py +0 -5
- data/vendor/depot_tools/third_party/logilab/common/corbautils.py +0 -117
- data/vendor/depot_tools/third_party/logilab/common/daemon.py +0 -101
- data/vendor/depot_tools/third_party/logilab/common/date.py +0 -335
- data/vendor/depot_tools/third_party/logilab/common/dbf.py +0 -231
- data/vendor/depot_tools/third_party/logilab/common/debugger.py +0 -214
- data/vendor/depot_tools/third_party/logilab/common/decorators.py +0 -281
- data/vendor/depot_tools/third_party/logilab/common/deprecation.py +0 -189
- data/vendor/depot_tools/third_party/logilab/common/fileutils.py +0 -404
- data/vendor/depot_tools/third_party/logilab/common/interface.py +0 -71
- data/vendor/depot_tools/third_party/logilab/common/logging_ext.py +0 -195
- data/vendor/depot_tools/third_party/logilab/common/modutils.py +0 -702
- data/vendor/depot_tools/third_party/logilab/common/optik_ext.py +0 -392
- data/vendor/depot_tools/third_party/logilab/common/optparser.py +0 -92
- data/vendor/depot_tools/third_party/logilab/common/proc.py +0 -277
- data/vendor/depot_tools/third_party/logilab/common/pyro_ext.py +0 -180
- data/vendor/depot_tools/third_party/logilab/common/pytest.py +0 -1199
- data/vendor/depot_tools/third_party/logilab/common/registry.py +0 -1119
- data/vendor/depot_tools/third_party/logilab/common/shellutils.py +0 -462
- data/vendor/depot_tools/third_party/logilab/common/sphinx_ext.py +0 -87
- data/vendor/depot_tools/third_party/logilab/common/sphinxutils.py +0 -122
- data/vendor/depot_tools/third_party/logilab/common/table.py +0 -929
- data/vendor/depot_tools/third_party/logilab/common/tasksqueue.py +0 -101
- data/vendor/depot_tools/third_party/logilab/common/testlib.py +0 -1392
- data/vendor/depot_tools/third_party/logilab/common/textutils.py +0 -537
- data/vendor/depot_tools/third_party/logilab/common/tree.py +0 -369
- data/vendor/depot_tools/third_party/logilab/common/umessage.py +0 -194
- data/vendor/depot_tools/third_party/logilab/common/ureports/__init__.py +0 -172
- data/vendor/depot_tools/third_party/logilab/common/ureports/docbook_writer.py +0 -140
- data/vendor/depot_tools/third_party/logilab/common/urllib2ext.py +0 -89
- data/vendor/depot_tools/third_party/logilab/common/visitor.py +0 -109
- data/vendor/depot_tools/third_party/logilab/common/xmlrpcutils.py +0 -131
- data/vendor/depot_tools/third_party/logilab/common/xmlutils.py +0 -61
@@ -1,8 +1,8 @@
|
|
1
1
|
Name: httplib2
|
2
2
|
Short Name: httplib2
|
3
3
|
URL: https://github.com/httplib2/httplib2
|
4
|
-
Version: 0.
|
5
|
-
Revision:
|
4
|
+
Version: 0.11.3
|
5
|
+
Revision: 70fb0c820d2e8211992b402d34444e4b32a1cb6e
|
6
6
|
License: MIT License
|
7
7
|
|
8
8
|
Description:
|
@@ -1,4 +1,4 @@
|
|
1
|
-
from __future__ import
|
1
|
+
from __future__ import print_function
|
2
2
|
"""
|
3
3
|
httplib2
|
4
4
|
|
@@ -20,9 +20,10 @@ __contributors__ = ["Thomas Broyer (t.broyer@ltgt.net)",
|
|
20
20
|
"Jonathan Feinberg",
|
21
21
|
"Blair Zajac",
|
22
22
|
"Sam Ruby",
|
23
|
-
"Louis Nyffenegger"
|
23
|
+
"Louis Nyffenegger",
|
24
|
+
"Alex Yu"]
|
24
25
|
__license__ = "MIT"
|
25
|
-
__version__ =
|
26
|
+
__version__ = '0.11.3'
|
26
27
|
|
27
28
|
import re
|
28
29
|
import sys
|
@@ -64,31 +65,54 @@ except ImportError:
|
|
64
65
|
socks = None
|
65
66
|
|
66
67
|
# Build the appropriate socket wrapper for ssl
|
68
|
+
ssl = None
|
69
|
+
ssl_SSLError = None
|
70
|
+
ssl_CertificateError = None
|
67
71
|
try:
|
68
|
-
import ssl
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
72
|
+
import ssl # python 2.6
|
73
|
+
except ImportError:
|
74
|
+
pass
|
75
|
+
if ssl is not None:
|
76
|
+
ssl_SSLError = getattr(ssl, 'SSLError', None)
|
77
|
+
ssl_CertificateError = getattr(ssl, 'CertificateError', None)
|
78
|
+
|
79
|
+
|
80
|
+
def _ssl_wrap_socket(sock, key_file, cert_file, disable_validation,
|
81
|
+
ca_certs, ssl_version, hostname):
|
82
|
+
if disable_validation:
|
83
|
+
cert_reqs = ssl.CERT_NONE
|
84
|
+
else:
|
85
|
+
cert_reqs = ssl.CERT_REQUIRED
|
86
|
+
if ssl_version is None:
|
87
|
+
ssl_version = ssl.PROTOCOL_SSLv23
|
88
|
+
|
89
|
+
if hasattr(ssl, 'SSLContext'): # Python 2.7.9
|
90
|
+
context = ssl.SSLContext(ssl_version)
|
91
|
+
context.verify_mode = cert_reqs
|
92
|
+
context.check_hostname = (cert_reqs != ssl.CERT_NONE)
|
93
|
+
if cert_file:
|
94
|
+
context.load_cert_chain(cert_file, key_file)
|
95
|
+
if ca_certs:
|
96
|
+
context.load_verify_locations(ca_certs)
|
97
|
+
return context.wrap_socket(sock, server_hostname=hostname)
|
98
|
+
else:
|
79
99
|
return ssl.wrap_socket(sock, keyfile=key_file, certfile=cert_file,
|
80
|
-
cert_reqs=cert_reqs, ca_certs=ca_certs
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
100
|
+
cert_reqs=cert_reqs, ca_certs=ca_certs,
|
101
|
+
ssl_version=ssl_version)
|
102
|
+
|
103
|
+
|
104
|
+
def _ssl_wrap_socket_unsupported(sock, key_file, cert_file, disable_validation,
|
105
|
+
ca_certs, ssl_version, hostname):
|
106
|
+
if not disable_validation:
|
107
|
+
raise CertificateValidationUnsupported(
|
108
|
+
"SSL certificate validation is not supported without "
|
109
|
+
"the ssl module installed. To avoid this error, install "
|
110
|
+
"the ssl module, or explicity disable validation.")
|
111
|
+
ssl_sock = socket.ssl(sock, key_file, cert_file)
|
112
|
+
return httplib.FakeSocket(sock, ssl_sock)
|
113
|
+
|
114
|
+
if ssl is None:
|
115
|
+
_ssl_wrap_socket = _ssl_wrap_socket_unsupported
|
92
116
|
|
93
117
|
|
94
118
|
if sys.version_info >= (2,3):
|
@@ -122,6 +146,7 @@ if sys.version_info < (2,4):
|
|
122
146
|
seq.sort()
|
123
147
|
return seq
|
124
148
|
|
149
|
+
|
125
150
|
# Python 2.3 support
|
126
151
|
def HTTPResponse__getheaders(self):
|
127
152
|
"""Return list of (header, value) tuples."""
|
@@ -162,6 +187,8 @@ class CertificateHostnameMismatch(SSLHandshakeError):
|
|
162
187
|
self.host = host
|
163
188
|
self.cert = cert
|
164
189
|
|
190
|
+
class NotRunningAppEngineEnvironment(HttpLib2Error): pass
|
191
|
+
|
165
192
|
# Open Items:
|
166
193
|
# -----------
|
167
194
|
# Proxy support
|
@@ -197,6 +224,7 @@ except ImportError:
|
|
197
224
|
# Which headers are hop-by-hop headers by default
|
198
225
|
HOP_BY_HOP = ['connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade']
|
199
226
|
|
227
|
+
|
200
228
|
def _get_end2end_headers(response):
|
201
229
|
hopbyhop = list(HOP_BY_HOP)
|
202
230
|
hopbyhop.extend([x.strip() for x in response.get('connection', '').split(',')])
|
@@ -204,6 +232,7 @@ def _get_end2end_headers(response):
|
|
204
232
|
|
205
233
|
URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?")
|
206
234
|
|
235
|
+
|
207
236
|
def parse_uri(uri):
|
208
237
|
"""Parses a URI using the regex given in Appendix B of RFC 3986.
|
209
238
|
|
@@ -212,6 +241,7 @@ def parse_uri(uri):
|
|
212
241
|
groups = URI.match(uri).groups()
|
213
242
|
return (groups[1], groups[3], groups[4], groups[6], groups[8])
|
214
243
|
|
244
|
+
|
215
245
|
def urlnorm(uri):
|
216
246
|
(scheme, authority, path, query, fragment) = parse_uri(uri)
|
217
247
|
if not scheme or not authority:
|
@@ -232,6 +262,7 @@ def urlnorm(uri):
|
|
232
262
|
re_url_scheme = re.compile(r'^\w+://')
|
233
263
|
re_slash = re.compile(r'[?/:|]+')
|
234
264
|
|
265
|
+
|
235
266
|
def safename(filename):
|
236
267
|
"""Return a filename suitable for the cache.
|
237
268
|
|
@@ -260,12 +291,15 @@ def safename(filename):
|
|
260
291
|
return ",".join((filename, filemd5))
|
261
292
|
|
262
293
|
NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
|
294
|
+
|
295
|
+
|
263
296
|
def _normalize_headers(headers):
|
264
297
|
return dict([ (key.lower(), NORMALIZE_SPACE.sub(value, ' ').strip()) for (key, value) in headers.iteritems()])
|
265
298
|
|
299
|
+
|
266
300
|
def _parse_cache_control(headers):
|
267
301
|
retval = {}
|
268
|
-
if
|
302
|
+
if 'cache-control' in headers:
|
269
303
|
parts = headers['cache-control'].split(',')
|
270
304
|
parts_with_args = [tuple([x.strip().lower() for x in part.split("=", 1)]) for part in parts if -1 != part.find("=")]
|
271
305
|
parts_wo_args = [(name.strip().lower(), 1) for name in parts if -1 == name.find("=")]
|
@@ -290,7 +324,7 @@ def _parse_www_authenticate(headers, headername='www-authenticate'):
|
|
290
324
|
"""Returns a dictionary of dictionaries, one dict
|
291
325
|
per auth_scheme."""
|
292
326
|
retval = {}
|
293
|
-
if headers
|
327
|
+
if headername in headers:
|
294
328
|
try:
|
295
329
|
|
296
330
|
authenticate = headers[headername].strip()
|
@@ -318,6 +352,7 @@ def _parse_www_authenticate(headers, headername='www-authenticate'):
|
|
318
352
|
return retval
|
319
353
|
|
320
354
|
|
355
|
+
# TODO: add current time as _entry_disposition argument to avoid sleep in tests
|
321
356
|
def _entry_disposition(response_headers, request_headers):
|
322
357
|
"""Determine freshness from the Date, Expires and Cache-Control headers.
|
323
358
|
|
@@ -350,26 +385,26 @@ def _entry_disposition(response_headers, request_headers):
|
|
350
385
|
cc = _parse_cache_control(request_headers)
|
351
386
|
cc_response = _parse_cache_control(response_headers)
|
352
387
|
|
353
|
-
if
|
388
|
+
if 'pragma' in request_headers and request_headers['pragma'].lower().find('no-cache') != -1:
|
354
389
|
retval = "TRANSPARENT"
|
355
390
|
if 'cache-control' not in request_headers:
|
356
391
|
request_headers['cache-control'] = 'no-cache'
|
357
|
-
elif
|
392
|
+
elif 'no-cache' in cc:
|
358
393
|
retval = "TRANSPARENT"
|
359
|
-
elif
|
394
|
+
elif 'no-cache' in cc_response:
|
360
395
|
retval = "STALE"
|
361
|
-
elif
|
396
|
+
elif 'only-if-cached' in cc:
|
362
397
|
retval = "FRESH"
|
363
|
-
elif
|
398
|
+
elif 'date' in response_headers:
|
364
399
|
date = calendar.timegm(email.Utils.parsedate_tz(response_headers['date']))
|
365
400
|
now = time.time()
|
366
401
|
current_age = max(0, now - date)
|
367
|
-
if
|
402
|
+
if 'max-age' in cc_response:
|
368
403
|
try:
|
369
404
|
freshness_lifetime = int(cc_response['max-age'])
|
370
405
|
except ValueError:
|
371
406
|
freshness_lifetime = 0
|
372
|
-
elif
|
407
|
+
elif 'expires' in response_headers:
|
373
408
|
expires = email.Utils.parsedate_tz(response_headers['expires'])
|
374
409
|
if None == expires:
|
375
410
|
freshness_lifetime = 0
|
@@ -377,12 +412,12 @@ def _entry_disposition(response_headers, request_headers):
|
|
377
412
|
freshness_lifetime = max(0, calendar.timegm(expires) - date)
|
378
413
|
else:
|
379
414
|
freshness_lifetime = 0
|
380
|
-
if
|
415
|
+
if 'max-age' in cc:
|
381
416
|
try:
|
382
417
|
freshness_lifetime = int(cc['max-age'])
|
383
418
|
except ValueError:
|
384
419
|
freshness_lifetime = 0
|
385
|
-
if
|
420
|
+
if 'min-fresh' in cc:
|
386
421
|
try:
|
387
422
|
min_fresh = int(cc['min-fresh'])
|
388
423
|
except ValueError:
|
@@ -392,6 +427,7 @@ def _entry_disposition(response_headers, request_headers):
|
|
392
427
|
retval = "FRESH"
|
393
428
|
return retval
|
394
429
|
|
430
|
+
|
395
431
|
def _decompressContent(response, new_content):
|
396
432
|
content = new_content
|
397
433
|
try:
|
@@ -400,21 +436,22 @@ def _decompressContent(response, new_content):
|
|
400
436
|
if encoding == 'gzip':
|
401
437
|
content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
|
402
438
|
if encoding == 'deflate':
|
403
|
-
content = zlib.decompress(content)
|
439
|
+
content = zlib.decompress(content, -zlib.MAX_WBITS)
|
404
440
|
response['content-length'] = str(len(content))
|
405
441
|
# Record the historical presence of the encoding in a way the won't interfere.
|
406
442
|
response['-content-encoding'] = response['content-encoding']
|
407
443
|
del response['content-encoding']
|
408
|
-
except IOError:
|
444
|
+
except (IOError, zlib.error):
|
409
445
|
content = ""
|
410
446
|
raise FailedToDecompressContent(_("Content purported to be compressed with %s but failed to decompress.") % response.get('content-encoding'), response, content)
|
411
447
|
return content
|
412
448
|
|
449
|
+
|
413
450
|
def _updateCache(request_headers, response_headers, content, cache, cachekey):
|
414
451
|
if cachekey:
|
415
452
|
cc = _parse_cache_control(request_headers)
|
416
453
|
cc_response = _parse_cache_control(response_headers)
|
417
|
-
if
|
454
|
+
if 'no-store' in cc or 'no-store' in cc_response:
|
418
455
|
cache.delete(cachekey)
|
419
456
|
else:
|
420
457
|
info = email.Message.Message()
|
@@ -496,7 +533,6 @@ class Authentication(object):
|
|
496
533
|
return False
|
497
534
|
|
498
535
|
|
499
|
-
|
500
536
|
class BasicAuthentication(Authentication):
|
501
537
|
def __init__(self, credentials, host, request_uri, headers, response, content, http):
|
502
538
|
Authentication.__init__(self, credentials, host, request_uri, headers, response, content, http)
|
@@ -550,7 +586,7 @@ class DigestAuthentication(Authentication):
|
|
550
586
|
self.challenge['nc'] += 1
|
551
587
|
|
552
588
|
def response(self, response, content):
|
553
|
-
if
|
589
|
+
if 'authentication-info' not in response:
|
554
590
|
challenge = _parse_www_authenticate(response, 'www-authenticate').get('digest', {})
|
555
591
|
if 'true' == challenge.get('stale'):
|
556
592
|
self.challenge['nonce'] = challenge['nonce']
|
@@ -559,7 +595,7 @@ class DigestAuthentication(Authentication):
|
|
559
595
|
else:
|
560
596
|
updated_challenge = _parse_www_authenticate(response, 'authentication-info').get('digest', {})
|
561
597
|
|
562
|
-
if
|
598
|
+
if 'nextnonce' in updated_challenge:
|
563
599
|
self.challenge['nonce'] = updated_challenge['nextnonce']
|
564
600
|
self.challenge['nc'] = 1
|
565
601
|
return False
|
@@ -649,6 +685,7 @@ class WsseAuthentication(Authentication):
|
|
649
685
|
cnonce,
|
650
686
|
iso_now)
|
651
687
|
|
688
|
+
|
652
689
|
class GoogleLoginAuthentication(Authentication):
|
653
690
|
def __init__(self, credentials, host, request_uri, headers, response, content, http):
|
654
691
|
from urllib import urlencode
|
@@ -688,12 +725,13 @@ AUTH_SCHEME_CLASSES = {
|
|
688
725
|
|
689
726
|
AUTH_SCHEME_ORDER = ["hmacdigest", "googlelogin", "digest", "wsse", "basic"]
|
690
727
|
|
728
|
+
|
691
729
|
class FileCache(object):
|
692
730
|
"""Uses a local directory as a store for cached files.
|
693
731
|
Not really safe to use if multiple threads or processes are going to
|
694
732
|
be running on the same cache.
|
695
733
|
"""
|
696
|
-
def __init__(self, cache, safe=safename):
|
734
|
+
def __init__(self, cache, safe=safename): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
|
697
735
|
self.cache = cache
|
698
736
|
self.safe = safe
|
699
737
|
if not os.path.exists(cache):
|
@@ -721,6 +759,7 @@ class FileCache(object):
|
|
721
759
|
if os.path.exists(cacheFullPath):
|
722
760
|
os.remove(cacheFullPath)
|
723
761
|
|
762
|
+
|
724
763
|
class Credentials(object):
|
725
764
|
def __init__(self):
|
726
765
|
self.credentials = []
|
@@ -736,20 +775,23 @@ class Credentials(object):
|
|
736
775
|
if cdomain == "" or domain == cdomain:
|
737
776
|
yield (name, password)
|
738
777
|
|
778
|
+
|
739
779
|
class KeyCerts(Credentials):
|
740
780
|
"""Identical to Credentials except that
|
741
781
|
name/password are mapped to key/cert."""
|
742
782
|
pass
|
743
783
|
|
784
|
+
|
744
785
|
class AllHosts(object):
|
745
786
|
pass
|
746
787
|
|
788
|
+
|
747
789
|
class ProxyInfo(object):
|
748
790
|
"""Collect information required to use a proxy."""
|
749
791
|
bypass_hosts = ()
|
750
792
|
|
751
793
|
def __init__(self, proxy_type, proxy_host, proxy_port,
|
752
|
-
proxy_rdns=True, proxy_user=None, proxy_pass=None):
|
794
|
+
proxy_rdns=True, proxy_user=None, proxy_pass=None, proxy_headers=None):
|
753
795
|
"""
|
754
796
|
Args:
|
755
797
|
proxy_type: The type of proxy server. This must be set to one of
|
@@ -770,6 +812,8 @@ class ProxyInfo(object):
|
|
770
812
|
proxy_user: The username used to authenticate with the proxy server.
|
771
813
|
|
772
814
|
proxy_pass: The password used to authenticate with the proxy server.
|
815
|
+
|
816
|
+
proxy_headers: Additional or modified headers for the proxy connect request.
|
773
817
|
"""
|
774
818
|
self.proxy_type = proxy_type
|
775
819
|
self.proxy_host = proxy_host
|
@@ -777,10 +821,11 @@ class ProxyInfo(object):
|
|
777
821
|
self.proxy_rdns = proxy_rdns
|
778
822
|
self.proxy_user = proxy_user
|
779
823
|
self.proxy_pass = proxy_pass
|
824
|
+
self.proxy_headers = proxy_headers
|
780
825
|
|
781
826
|
def astuple(self):
|
782
827
|
return (self.proxy_type, self.proxy_host, self.proxy_port,
|
783
|
-
self.proxy_rdns, self.proxy_user, self.proxy_pass)
|
828
|
+
self.proxy_rdns, self.proxy_user, self.proxy_pass, self.proxy_headers)
|
784
829
|
|
785
830
|
def isgood(self):
|
786
831
|
return (self.proxy_host != None) and (self.proxy_port != None)
|
@@ -793,12 +838,20 @@ class ProxyInfo(object):
|
|
793
838
|
if self.bypass_hosts is AllHosts:
|
794
839
|
return True
|
795
840
|
|
796
|
-
|
797
|
-
for
|
798
|
-
|
799
|
-
|
841
|
+
hostname = '.' + hostname.lstrip('.')
|
842
|
+
for skip_name in self.bypass_hosts:
|
843
|
+
# *.suffix
|
844
|
+
if skip_name.startswith('.') and hostname.endswith(skip_name):
|
845
|
+
return True
|
846
|
+
# exact match
|
847
|
+
if hostname == '.' + skip_name:
|
848
|
+
return True
|
849
|
+
return False
|
800
850
|
|
801
|
-
|
851
|
+
def __repr__(self):
|
852
|
+
return (
|
853
|
+
'<ProxyInfo type={p.proxy_type} host:port={p.proxy_host}:{p.proxy_port} rdns={p.proxy_rdns}' +
|
854
|
+
' user={p.proxy_user} headers={p.proxy_headers}>').format(p=self)
|
802
855
|
|
803
856
|
|
804
857
|
def proxy_info_from_environment(method='http'):
|
@@ -812,20 +865,10 @@ def proxy_info_from_environment(method='http'):
|
|
812
865
|
url = os.environ.get(env_var, os.environ.get(env_var.upper()))
|
813
866
|
if not url:
|
814
867
|
return
|
815
|
-
|
868
|
+
return proxy_info_from_url(url, method, None)
|
816
869
|
|
817
|
-
no_proxy = os.environ.get('no_proxy', os.environ.get('NO_PROXY', ''))
|
818
|
-
bypass_hosts = []
|
819
|
-
if no_proxy:
|
820
|
-
bypass_hosts = no_proxy.split(',')
|
821
|
-
# special case, no_proxy=* means all hosts bypassed
|
822
|
-
if no_proxy == '*':
|
823
|
-
bypass_hosts = AllHosts
|
824
870
|
|
825
|
-
|
826
|
-
return pi
|
827
|
-
|
828
|
-
def proxy_info_from_url(url, method='http'):
|
871
|
+
def proxy_info_from_url(url, method='http', noproxy=None):
|
829
872
|
"""
|
830
873
|
Construct a ProxyInfo from a URL (such as http_proxy env var)
|
831
874
|
"""
|
@@ -851,15 +894,30 @@ def proxy_info_from_url(url, method='http'):
|
|
851
894
|
else:
|
852
895
|
port = dict(https=443, http=80)[method]
|
853
896
|
|
854
|
-
proxy_type = 3
|
855
|
-
|
897
|
+
proxy_type = 3 # socks.PROXY_TYPE_HTTP
|
898
|
+
pi = ProxyInfo(
|
856
899
|
proxy_type = proxy_type,
|
857
900
|
proxy_host = host,
|
858
901
|
proxy_port = port,
|
859
902
|
proxy_user = username or None,
|
860
903
|
proxy_pass = password or None,
|
904
|
+
proxy_headers = None,
|
861
905
|
)
|
862
906
|
|
907
|
+
bypass_hosts = []
|
908
|
+
# If not given an explicit noproxy value, respect values in env vars.
|
909
|
+
if noproxy is None:
|
910
|
+
noproxy = os.environ.get('no_proxy', os.environ.get('NO_PROXY', ''))
|
911
|
+
# Special case: A single '*' character means all hosts should be bypassed.
|
912
|
+
if noproxy == '*':
|
913
|
+
bypass_hosts = AllHosts
|
914
|
+
elif noproxy.strip():
|
915
|
+
bypass_hosts = noproxy.split(',')
|
916
|
+
bypass_hosts = filter(bool, bypass_hosts) # To exclude empty string.
|
917
|
+
|
918
|
+
pi.bypass_hosts = bypass_hosts
|
919
|
+
return pi
|
920
|
+
|
863
921
|
|
864
922
|
class HTTPConnectionWithTimeout(httplib.HTTPConnection):
|
865
923
|
"""
|
@@ -885,7 +943,7 @@ class HTTPConnectionWithTimeout(httplib.HTTPConnection):
|
|
885
943
|
msg = "getaddrinfo returns an empty list"
|
886
944
|
if self.proxy_info and self.proxy_info.isgood():
|
887
945
|
use_proxy = True
|
888
|
-
proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple()
|
946
|
+
proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = self.proxy_info.astuple()
|
889
947
|
|
890
948
|
host = proxy_host
|
891
949
|
port = proxy_port
|
@@ -900,7 +958,7 @@ class HTTPConnectionWithTimeout(httplib.HTTPConnection):
|
|
900
958
|
try:
|
901
959
|
if use_proxy:
|
902
960
|
self.sock = socks.socksocket(af, socktype, proto)
|
903
|
-
self.sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)
|
961
|
+
self.sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)
|
904
962
|
else:
|
905
963
|
self.sock = socket.socket(af, socktype, proto)
|
906
964
|
self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
@@ -909,16 +967,18 @@ class HTTPConnectionWithTimeout(httplib.HTTPConnection):
|
|
909
967
|
self.sock.settimeout(self.timeout)
|
910
968
|
# End of difference from httplib.
|
911
969
|
if self.debuglevel > 0:
|
912
|
-
print
|
970
|
+
print("connect: (%s, %s) ************" % (self.host, self.port))
|
913
971
|
if use_proxy:
|
914
|
-
print
|
915
|
-
|
916
|
-
|
917
|
-
|
972
|
+
print("proxy: %s ************" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)))
|
973
|
+
if use_proxy:
|
974
|
+
self.sock.connect((self.host, self.port) + sa[2:])
|
975
|
+
else:
|
976
|
+
self.sock.connect(sa)
|
977
|
+
except socket.error as msg:
|
918
978
|
if self.debuglevel > 0:
|
919
|
-
print
|
979
|
+
print("connect fail: (%s, %s)" % (self.host, self.port))
|
920
980
|
if use_proxy:
|
921
|
-
print
|
981
|
+
print("proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)))
|
922
982
|
if self.sock:
|
923
983
|
self.sock.close()
|
924
984
|
self.sock = None
|
@@ -927,6 +987,7 @@ class HTTPConnectionWithTimeout(httplib.HTTPConnection):
|
|
927
987
|
if not self.sock:
|
928
988
|
raise socket.error, msg
|
929
989
|
|
990
|
+
|
930
991
|
class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
931
992
|
"""
|
932
993
|
This class allows communication via SSL.
|
@@ -938,7 +999,8 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
938
999
|
"""
|
939
1000
|
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
940
1001
|
strict=None, timeout=None, proxy_info=None,
|
941
|
-
ca_certs=None, disable_ssl_certificate_validation=False
|
1002
|
+
ca_certs=None, disable_ssl_certificate_validation=False,
|
1003
|
+
ssl_version=None):
|
942
1004
|
httplib.HTTPSConnection.__init__(self, host, port=port,
|
943
1005
|
key_file=key_file,
|
944
1006
|
cert_file=cert_file, strict=strict)
|
@@ -949,6 +1011,7 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
949
1011
|
self.ca_certs = ca_certs
|
950
1012
|
self.disable_ssl_certificate_validation = \
|
951
1013
|
disable_ssl_certificate_validation
|
1014
|
+
self.ssl_version = ssl_version
|
952
1015
|
|
953
1016
|
# The following two methods were adapted from https_wrapper.py, released
|
954
1017
|
# with the Google Appengine SDK at
|
@@ -1007,7 +1070,7 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
1007
1070
|
msg = "getaddrinfo returns an empty list"
|
1008
1071
|
if self.proxy_info and self.proxy_info.isgood():
|
1009
1072
|
use_proxy = True
|
1010
|
-
proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass = self.proxy_info.astuple()
|
1073
|
+
proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers = self.proxy_info.astuple()
|
1011
1074
|
|
1012
1075
|
host = proxy_host
|
1013
1076
|
port = proxy_port
|
@@ -1023,21 +1086,26 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
1023
1086
|
if use_proxy:
|
1024
1087
|
sock = socks.socksocket(family, socktype, proto)
|
1025
1088
|
|
1026
|
-
sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass)
|
1089
|
+
sock.setproxy(proxy_type, proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)
|
1027
1090
|
else:
|
1028
1091
|
sock = socket.socket(family, socktype, proto)
|
1029
1092
|
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
1030
1093
|
|
1031
1094
|
if has_timeout(self.timeout):
|
1032
1095
|
sock.settimeout(self.timeout)
|
1033
|
-
|
1096
|
+
|
1097
|
+
if use_proxy:
|
1098
|
+
sock.connect((self.host, self.port) + sockaddr[:2])
|
1099
|
+
else:
|
1100
|
+
sock.connect(sockaddr)
|
1034
1101
|
self.sock =_ssl_wrap_socket(
|
1035
1102
|
sock, self.key_file, self.cert_file,
|
1036
|
-
self.disable_ssl_certificate_validation, self.ca_certs
|
1103
|
+
self.disable_ssl_certificate_validation, self.ca_certs,
|
1104
|
+
self.ssl_version, self.host)
|
1037
1105
|
if self.debuglevel > 0:
|
1038
|
-
print
|
1106
|
+
print("connect: (%s, %s)" % (self.host, self.port))
|
1039
1107
|
if use_proxy:
|
1040
|
-
print
|
1108
|
+
print("proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)))
|
1041
1109
|
if not self.disable_ssl_certificate_validation:
|
1042
1110
|
cert = self.sock.getpeercert()
|
1043
1111
|
hostname = self.host.split(':', 0)[0]
|
@@ -1045,7 +1113,7 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
1045
1113
|
raise CertificateHostnameMismatch(
|
1046
1114
|
'Server presented certificate that does not match '
|
1047
1115
|
'host %s: %s' % (hostname, cert), hostname, cert)
|
1048
|
-
except ssl_SSLError, e:
|
1116
|
+
except (ssl_SSLError, ssl_CertificateError, CertificateHostnameMismatch) as e:
|
1049
1117
|
if sock:
|
1050
1118
|
sock.close()
|
1051
1119
|
if self.sock:
|
@@ -1055,17 +1123,17 @@ class HTTPSConnectionWithTimeout(httplib.HTTPSConnection):
|
|
1055
1123
|
# to get at more detailed error information, in particular
|
1056
1124
|
# whether the error is due to certificate validation or
|
1057
1125
|
# something else (such as SSL protocol mismatch).
|
1058
|
-
if e
|
1126
|
+
if getattr(e, 'errno', None) == ssl.SSL_ERROR_SSL:
|
1059
1127
|
raise SSLHandshakeError(e)
|
1060
1128
|
else:
|
1061
1129
|
raise
|
1062
1130
|
except (socket.timeout, socket.gaierror):
|
1063
1131
|
raise
|
1064
|
-
except socket.error
|
1132
|
+
except socket.error as msg:
|
1065
1133
|
if self.debuglevel > 0:
|
1066
|
-
print
|
1134
|
+
print("connect fail: (%s, %s)" % (self.host, self.port))
|
1067
1135
|
if use_proxy:
|
1068
|
-
print
|
1136
|
+
print("proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass, proxy_headers)))
|
1069
1137
|
if self.sock:
|
1070
1138
|
self.sock.close()
|
1071
1139
|
self.sock = None
|
@@ -1079,63 +1147,73 @@ SCHEME_TO_CONNECTION = {
|
|
1079
1147
|
'https': HTTPSConnectionWithTimeout
|
1080
1148
|
}
|
1081
1149
|
|
1150
|
+
|
1151
|
+
def _new_fixed_fetch(validate_certificate):
|
1152
|
+
def fixed_fetch(url, payload=None, method="GET", headers={},
|
1153
|
+
allow_truncated=False, follow_redirects=True,
|
1154
|
+
deadline=None):
|
1155
|
+
if deadline is None:
|
1156
|
+
deadline = socket.getdefaulttimeout()
|
1157
|
+
return fetch(url, payload=payload, method=method, headers=headers,
|
1158
|
+
allow_truncated=allow_truncated,
|
1159
|
+
follow_redirects=follow_redirects, deadline=deadline,
|
1160
|
+
validate_certificate=validate_certificate)
|
1161
|
+
return fixed_fetch
|
1162
|
+
|
1163
|
+
|
1164
|
+
class AppEngineHttpConnection(httplib.HTTPConnection):
|
1165
|
+
"""Use httplib on App Engine, but compensate for its weirdness.
|
1166
|
+
|
1167
|
+
The parameters key_file, cert_file, proxy_info, ca_certs,
|
1168
|
+
disable_ssl_certificate_validation, and ssl_version are all dropped on
|
1169
|
+
the ground.
|
1170
|
+
"""
|
1171
|
+
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
1172
|
+
strict=None, timeout=None, proxy_info=None, ca_certs=None,
|
1173
|
+
disable_ssl_certificate_validation=False,
|
1174
|
+
ssl_version=None):
|
1175
|
+
httplib.HTTPConnection.__init__(self, host, port=port,
|
1176
|
+
strict=strict, timeout=timeout)
|
1177
|
+
|
1178
|
+
|
1179
|
+
class AppEngineHttpsConnection(httplib.HTTPSConnection):
|
1180
|
+
"""Same as AppEngineHttpConnection, but for HTTPS URIs.
|
1181
|
+
|
1182
|
+
The parameters proxy_info, ca_certs, disable_ssl_certificate_validation,
|
1183
|
+
and ssl_version are all dropped on the ground.
|
1184
|
+
"""
|
1185
|
+
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
1186
|
+
strict=None, timeout=None, proxy_info=None, ca_certs=None,
|
1187
|
+
disable_ssl_certificate_validation=False,
|
1188
|
+
ssl_version=None):
|
1189
|
+
httplib.HTTPSConnection.__init__(self, host, port=port,
|
1190
|
+
key_file=key_file,
|
1191
|
+
cert_file=cert_file, strict=strict,
|
1192
|
+
timeout=timeout)
|
1193
|
+
self._fetch = _new_fixed_fetch(
|
1194
|
+
not disable_ssl_certificate_validation)
|
1195
|
+
|
1082
1196
|
# Use a different connection object for Google App Engine
|
1083
1197
|
try:
|
1084
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1090
|
-
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1094
|
-
|
1095
|
-
|
1096
|
-
|
1097
|
-
def _new_fixed_fetch(validate_certificate):
|
1098
|
-
def fixed_fetch(url, payload=None, method="GET", headers={},
|
1099
|
-
allow_truncated=False, follow_redirects=True,
|
1100
|
-
deadline=None):
|
1101
|
-
if deadline is None:
|
1102
|
-
deadline = socket.getdefaulttimeout() or 5
|
1103
|
-
return fetch(url, payload=payload, method=method, headers=headers,
|
1104
|
-
allow_truncated=allow_truncated,
|
1105
|
-
follow_redirects=follow_redirects, deadline=deadline,
|
1106
|
-
validate_certificate=validate_certificate)
|
1107
|
-
return fixed_fetch
|
1108
|
-
|
1109
|
-
class AppEngineHttpConnection(httplib.HTTPConnection):
|
1110
|
-
"""Use httplib on App Engine, but compensate for its weirdness.
|
1111
|
-
|
1112
|
-
The parameters key_file, cert_file, proxy_info, ca_certs, and
|
1113
|
-
disable_ssl_certificate_validation are all dropped on the ground.
|
1114
|
-
"""
|
1115
|
-
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
1116
|
-
strict=None, timeout=None, proxy_info=None, ca_certs=None,
|
1117
|
-
disable_ssl_certificate_validation=False):
|
1118
|
-
httplib.HTTPConnection.__init__(self, host, port=port,
|
1119
|
-
strict=strict, timeout=timeout)
|
1120
|
-
|
1121
|
-
class AppEngineHttpsConnection(httplib.HTTPSConnection):
|
1122
|
-
"""Same as AppEngineHttpConnection, but for HTTPS URIs."""
|
1123
|
-
def __init__(self, host, port=None, key_file=None, cert_file=None,
|
1124
|
-
strict=None, timeout=None, proxy_info=None, ca_certs=None,
|
1125
|
-
disable_ssl_certificate_validation=False):
|
1126
|
-
httplib.HTTPSConnection.__init__(self, host, port=port,
|
1127
|
-
key_file=key_file,
|
1128
|
-
cert_file=cert_file, strict=strict,
|
1129
|
-
timeout=timeout)
|
1130
|
-
self._fetch = _new_fixed_fetch(
|
1131
|
-
not disable_ssl_certificate_validation)
|
1198
|
+
server_software = os.environ.get('SERVER_SOFTWARE')
|
1199
|
+
if not server_software:
|
1200
|
+
raise NotRunningAppEngineEnvironment()
|
1201
|
+
elif not (server_software.startswith('Google App Engine/') or
|
1202
|
+
server_software.startswith('Development/')):
|
1203
|
+
raise NotRunningAppEngineEnvironment()
|
1204
|
+
|
1205
|
+
from google.appengine.api import apiproxy_stub_map
|
1206
|
+
if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None:
|
1207
|
+
raise ImportError # Bail out; we're not actually running on App Engine.
|
1208
|
+
from google.appengine.api.urlfetch import fetch
|
1209
|
+
from google.appengine.api.urlfetch import InvalidURLError
|
1132
1210
|
|
1133
1211
|
# Update the connection classes to use the Googel App Engine specific ones.
|
1134
1212
|
SCHEME_TO_CONNECTION = {
|
1135
1213
|
'http': AppEngineHttpConnection,
|
1136
1214
|
'https': AppEngineHttpsConnection
|
1137
1215
|
}
|
1138
|
-
except (ImportError, AttributeError):
|
1216
|
+
except (ImportError, AttributeError, NotRunningAppEngineEnvironment):
|
1139
1217
|
pass
|
1140
1218
|
|
1141
1219
|
|
@@ -1155,7 +1233,8 @@ class Http(object):
|
|
1155
1233
|
"""
|
1156
1234
|
def __init__(self, cache=None, timeout=None,
|
1157
1235
|
proxy_info=proxy_info_from_environment,
|
1158
|
-
ca_certs=None, disable_ssl_certificate_validation=False
|
1236
|
+
ca_certs=None, disable_ssl_certificate_validation=False,
|
1237
|
+
ssl_version=None):
|
1159
1238
|
"""If 'cache' is a string then it is used as a directory name for
|
1160
1239
|
a disk cache. Otherwise it must be an object that supports the
|
1161
1240
|
same interface as FileCache.
|
@@ -1178,11 +1257,14 @@ class Http(object):
|
|
1178
1257
|
|
1179
1258
|
If disable_ssl_certificate_validation is true, SSL cert validation will
|
1180
1259
|
not be performed.
|
1260
|
+
|
1261
|
+
By default, ssl.PROTOCOL_SSLv23 will be used for the ssl version.
|
1181
1262
|
"""
|
1182
1263
|
self.proxy_info = proxy_info
|
1183
1264
|
self.ca_certs = ca_certs
|
1184
1265
|
self.disable_ssl_certificate_validation = \
|
1185
1266
|
disable_ssl_certificate_validation
|
1267
|
+
self.ssl_version = ssl_version
|
1186
1268
|
|
1187
1269
|
# Map domain name to an httplib connection
|
1188
1270
|
self.connections = {}
|
@@ -1243,7 +1325,7 @@ class Http(object):
|
|
1243
1325
|
challenges = _parse_www_authenticate(response, 'www-authenticate')
|
1244
1326
|
for cred in self.credentials.iter(host):
|
1245
1327
|
for scheme in AUTH_SCHEME_ORDER:
|
1246
|
-
if challenges
|
1328
|
+
if scheme in challenges:
|
1247
1329
|
yield AUTH_SCHEME_CLASSES[scheme](cred, host, request_uri, headers, response, content, self)
|
1248
1330
|
|
1249
1331
|
def add_credentials(self, name, password, domain=""):
|
@@ -1279,15 +1361,16 @@ class Http(object):
|
|
1279
1361
|
except ssl_SSLError:
|
1280
1362
|
conn.close()
|
1281
1363
|
raise
|
1282
|
-
except socket.error
|
1364
|
+
except socket.error as e:
|
1283
1365
|
err = 0
|
1284
1366
|
if hasattr(e, 'args'):
|
1285
1367
|
err = getattr(e, 'args')[0]
|
1286
1368
|
else:
|
1287
1369
|
err = e.errno
|
1370
|
+
if err == errno.ECONNREFUSED: # Connection refused
|
1371
|
+
raise
|
1288
1372
|
if err in (errno.ENETUNREACH, errno.EADDRNOTAVAIL) and i < RETRIES:
|
1289
1373
|
continue # retry on potentially transient socket errors
|
1290
|
-
raise
|
1291
1374
|
except httplib.HTTPException:
|
1292
1375
|
# Just because the server closed the connection doesn't apparently mean
|
1293
1376
|
# that the server didn't send a response.
|
@@ -1370,29 +1453,29 @@ class Http(object):
|
|
1370
1453
|
# Pick out the location header and basically start from the beginning
|
1371
1454
|
# remembering first to strip the ETag header and decrement our 'depth'
|
1372
1455
|
if redirections:
|
1373
|
-
if
|
1456
|
+
if 'location' not in response and response.status != 300:
|
1374
1457
|
raise RedirectMissingLocation( _("Redirected but the response is missing a Location: header."), response, content)
|
1375
1458
|
# Fix-up relative redirects (which violate an RFC 2616 MUST)
|
1376
|
-
if
|
1459
|
+
if 'location' in response:
|
1377
1460
|
location = response['location']
|
1378
1461
|
(scheme, authority, path, query, fragment) = parse_uri(location)
|
1379
1462
|
if authority == None:
|
1380
1463
|
response['location'] = urlparse.urljoin(absolute_uri, location)
|
1381
1464
|
if response.status == 301 and method in ["GET", "HEAD"]:
|
1382
1465
|
response['-x-permanent-redirect-url'] = response['location']
|
1383
|
-
if
|
1466
|
+
if 'content-location' not in response:
|
1384
1467
|
response['content-location'] = absolute_uri
|
1385
1468
|
_updateCache(headers, response, content, self.cache, cachekey)
|
1386
|
-
if
|
1469
|
+
if 'if-none-match' in headers:
|
1387
1470
|
del headers['if-none-match']
|
1388
|
-
if
|
1471
|
+
if 'if-modified-since' in headers:
|
1389
1472
|
del headers['if-modified-since']
|
1390
1473
|
if 'authorization' in headers and not self.forward_authorization_headers:
|
1391
1474
|
del headers['authorization']
|
1392
|
-
if
|
1475
|
+
if 'location' in response:
|
1393
1476
|
location = response['location']
|
1394
1477
|
old_response = copy.deepcopy(response)
|
1395
|
-
if
|
1478
|
+
if 'content-location' not in old_response:
|
1396
1479
|
old_response['content-location'] = absolute_uri
|
1397
1480
|
redirect_method = method
|
1398
1481
|
if response.status in [302, 303]:
|
@@ -1407,7 +1490,7 @@ class Http(object):
|
|
1407
1490
|
raise RedirectLimit("Redirected more times than rediection_limit allows.", response, content)
|
1408
1491
|
elif response.status in [200, 203] and method in ["GET", "HEAD"]:
|
1409
1492
|
# Don't cache 206's since we aren't going to handle byte range requests
|
1410
|
-
if
|
1493
|
+
if 'content-location' not in response:
|
1411
1494
|
response['content-location'] = absolute_uri
|
1412
1495
|
_updateCache(headers, response, content, self.cache, cachekey)
|
1413
1496
|
|
@@ -1449,7 +1532,7 @@ class Http(object):
|
|
1449
1532
|
else:
|
1450
1533
|
headers = self._normalize_headers(headers)
|
1451
1534
|
|
1452
|
-
if
|
1535
|
+
if 'user-agent' not in headers:
|
1453
1536
|
headers['user-agent'] = "Python-httplib2/%s (gzip)" % __version__
|
1454
1537
|
|
1455
1538
|
uri = iri2uri(uri)
|
@@ -1477,14 +1560,16 @@ class Http(object):
|
|
1477
1560
|
proxy_info=proxy_info,
|
1478
1561
|
ca_certs=self.ca_certs,
|
1479
1562
|
disable_ssl_certificate_validation=
|
1480
|
-
self.disable_ssl_certificate_validation
|
1563
|
+
self.disable_ssl_certificate_validation,
|
1564
|
+
ssl_version=self.ssl_version)
|
1481
1565
|
else:
|
1482
1566
|
conn = self.connections[conn_key] = connection_type(
|
1483
1567
|
authority, timeout=self.timeout,
|
1484
1568
|
proxy_info=proxy_info,
|
1485
1569
|
ca_certs=self.ca_certs,
|
1486
1570
|
disable_ssl_certificate_validation=
|
1487
|
-
self.disable_ssl_certificate_validation
|
1571
|
+
self.disable_ssl_certificate_validation,
|
1572
|
+
ssl_version=self.ssl_version)
|
1488
1573
|
else:
|
1489
1574
|
conn = self.connections[conn_key] = connection_type(
|
1490
1575
|
authority, timeout=self.timeout,
|
@@ -1518,7 +1603,7 @@ class Http(object):
|
|
1518
1603
|
else:
|
1519
1604
|
cachekey = None
|
1520
1605
|
|
1521
|
-
if method in self.optimistic_concurrency_methods and self.cache and
|
1606
|
+
if method in self.optimistic_concurrency_methods and self.cache and 'etag' in info and not self.ignore_etag and 'if-match' not in headers:
|
1522
1607
|
# http://www.w3.org/1999/04/Editing/
|
1523
1608
|
headers['if-match'] = info['etag']
|
1524
1609
|
|
@@ -1539,7 +1624,7 @@ class Http(object):
|
|
1539
1624
|
break
|
1540
1625
|
|
1541
1626
|
if cached_value and method in ["GET", "HEAD"] and self.cache and 'range' not in headers:
|
1542
|
-
if
|
1627
|
+
if '-x-permanent-redirect-url' in info:
|
1543
1628
|
# Should cached permanent redirects be counted in our redirection count? For now, yes.
|
1544
1629
|
if redirections <= 0:
|
1545
1630
|
raise RedirectLimit("Redirected more times than rediection_limit allows.", {}, "")
|
@@ -1569,9 +1654,9 @@ class Http(object):
|
|
1569
1654
|
return (response, content)
|
1570
1655
|
|
1571
1656
|
if entry_disposition == "STALE":
|
1572
|
-
if
|
1657
|
+
if 'etag' in info and not self.ignore_etag and not 'if-none-match' in headers:
|
1573
1658
|
headers['if-none-match'] = info['etag']
|
1574
|
-
if
|
1659
|
+
if 'last-modified' in info and not 'last-modified' in headers:
|
1575
1660
|
headers['if-modified-since'] = info['last-modified']
|
1576
1661
|
elif entry_disposition == "TRANSPARENT":
|
1577
1662
|
pass
|
@@ -1601,13 +1686,13 @@ class Http(object):
|
|
1601
1686
|
content = new_content
|
1602
1687
|
else:
|
1603
1688
|
cc = _parse_cache_control(headers)
|
1604
|
-
if
|
1689
|
+
if 'only-if-cached' in cc:
|
1605
1690
|
info['status'] = '504'
|
1606
1691
|
response = Response(info)
|
1607
1692
|
content = ""
|
1608
1693
|
else:
|
1609
1694
|
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
|
1610
|
-
except Exception
|
1695
|
+
except Exception as e:
|
1611
1696
|
if self.force_exception_to_status_code:
|
1612
1697
|
if isinstance(e, HttpLib2ErrorWithResponse):
|
1613
1698
|
response = e.response
|
@@ -1688,9 +1773,8 @@ class Response(dict):
|
|
1688
1773
|
self.status = int(self.get('status', self.status))
|
1689
1774
|
self.reason = self.get('reason', self.reason)
|
1690
1775
|
|
1691
|
-
|
1692
1776
|
def __getattr__(self, name):
|
1693
1777
|
if name == 'dict':
|
1694
1778
|
return self
|
1695
1779
|
else:
|
1696
|
-
raise AttributeError
|
1780
|
+
raise AttributeError(name)
|