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.
Files changed (408) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +4 -0
  4. data/README.md +2 -0
  5. data/ext/libv8/builder.rb +6 -2
  6. data/lib/libv8/version.rb +1 -1
  7. data/vendor/depot_tools/.gitattributes +1 -0
  8. data/vendor/depot_tools/.gitignore +7 -0
  9. data/vendor/depot_tools/CROS_OWNERS +5 -0
  10. data/vendor/depot_tools/OWNERS +12 -1
  11. data/vendor/depot_tools/PRESUBMIT.py +16 -9
  12. data/vendor/depot_tools/README.md +9 -2
  13. data/vendor/depot_tools/autoninja +14 -6
  14. data/vendor/depot_tools/autoninja.bat +11 -1
  15. data/vendor/depot_tools/autoninja.py +40 -18
  16. data/vendor/depot_tools/bb +12 -0
  17. data/vendor/depot_tools/bb.bat +7 -0
  18. data/vendor/depot_tools/bootstrap/win/manifest.txt +1 -1
  19. data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +1 -1
  20. data/vendor/depot_tools/bootstrap/win/win_tools.py +2 -1
  21. data/vendor/depot_tools/buildbucket.py +57 -4
  22. data/vendor/depot_tools/cipd +157 -44
  23. data/vendor/depot_tools/cipd.bat +51 -14
  24. data/vendor/depot_tools/cipd.ps1 +104 -42
  25. data/vendor/depot_tools/cipd_client_version +1 -1
  26. data/vendor/depot_tools/cipd_client_version.digests +21 -0
  27. data/vendor/depot_tools/cipd_manifest.txt +19 -6
  28. data/vendor/depot_tools/cipd_manifest.versions +318 -0
  29. data/vendor/depot_tools/clang_format.py +4 -4
  30. data/vendor/depot_tools/cpplint.py +44 -199
  31. data/vendor/depot_tools/dart_format.py +2 -2
  32. data/vendor/depot_tools/detect_host_arch.py +8 -3
  33. data/vendor/depot_tools/download_from_google_storage.py +47 -39
  34. data/vendor/depot_tools/fetch.py +30 -18
  35. data/vendor/depot_tools/fetch_configs/android_internal.py +34 -0
  36. data/vendor/depot_tools/fetch_configs/chromium.py +18 -1
  37. data/vendor/depot_tools/fetch_configs/config_util.py +4 -2
  38. data/vendor/depot_tools/fetch_configs/inspector_protocol.py +40 -0
  39. data/vendor/depot_tools/fetch_configs/node-ci.py +41 -0
  40. data/vendor/depot_tools/fix_encoding.py +3 -3
  41. data/vendor/depot_tools/gclient +1 -1
  42. data/vendor/depot_tools/gclient.py +415 -198
  43. data/vendor/depot_tools/gclient_eval.py +220 -171
  44. data/vendor/depot_tools/gclient_paths.py +142 -0
  45. data/vendor/depot_tools/gclient_scm.py +200 -51
  46. data/vendor/depot_tools/gclient_utils.py +88 -191
  47. data/vendor/depot_tools/gerrit_client.py +13 -0
  48. data/vendor/depot_tools/gerrit_util.py +158 -23
  49. data/vendor/depot_tools/git-nav-upstream +1 -1
  50. data/vendor/depot_tools/git_cache.py +77 -24
  51. data/vendor/depot_tools/git_cl.py +705 -1099
  52. data/vendor/depot_tools/git_common.py +9 -6
  53. data/vendor/depot_tools/git_map_branches.py +19 -2
  54. data/vendor/depot_tools/git_nav_downstream.py +3 -4
  55. data/vendor/depot_tools/git_rebase_update.py +14 -0
  56. data/vendor/depot_tools/git_reparent_branch.py +8 -2
  57. data/vendor/depot_tools/gn.py +38 -3
  58. data/vendor/depot_tools/gsutil.py +8 -3
  59. data/vendor/depot_tools/gsutil.py.bat +15 -0
  60. data/vendor/depot_tools/gsutil.vpython +16 -0
  61. data/vendor/depot_tools/infra/config/OWNERS +0 -1
  62. data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
  63. data/vendor/depot_tools/lucicfg +12 -0
  64. data/vendor/depot_tools/lucicfg.bat +7 -0
  65. data/vendor/depot_tools/man/html/git-map-branches.html +34 -2
  66. data/vendor/depot_tools/man/html/git-new-branch.html +40 -32
  67. data/vendor/depot_tools/man/man1/git-map-branches.1 +24 -5
  68. data/vendor/depot_tools/man/man1/git-new-branch.1 +35 -27
  69. data/vendor/depot_tools/man/src/git-map-branches.demo.1.sh +1 -0
  70. data/vendor/depot_tools/man/src/git-map-branches.txt +10 -0
  71. data/vendor/depot_tools/man/src/git-new-branch.demo.1.sh +9 -4
  72. data/vendor/depot_tools/man/src/git-new-branch.txt +1 -1
  73. data/vendor/depot_tools/metrics.README.md +98 -0
  74. data/vendor/depot_tools/metrics.py +296 -0
  75. data/vendor/depot_tools/metrics_utils.py +303 -0
  76. data/vendor/depot_tools/my_activity.py +91 -29
  77. data/vendor/depot_tools/ninja +1 -1
  78. data/vendor/depot_tools/ninjalog.README.md +64 -0
  79. data/vendor/depot_tools/ninjalog_uploader.py +232 -0
  80. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +116 -0
  81. data/vendor/depot_tools/owners.py +30 -13
  82. data/vendor/depot_tools/owners_finder.py +5 -2
  83. data/vendor/depot_tools/presubmit_canned_checks.py +188 -29
  84. data/vendor/depot_tools/presubmit_support.py +18 -41
  85. data/vendor/depot_tools/pylintrc +23 -19
  86. data/vendor/depot_tools/recipes/OWNERS +2 -0
  87. data/vendor/depot_tools/recipes/README.recipes.md +344 -151
  88. data/vendor/depot_tools/recipes/recipe_modules/bot_update/OWNERS +2 -0
  89. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +2 -16
  90. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +141 -99
  91. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +5 -8
  92. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +5 -8
  93. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +6 -98
  94. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +4 -9
  95. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +45 -5
  96. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +4 -9
  97. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +4 -9
  98. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob.json → input_commit_with_id_without_repo.json} +6 -11
  99. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{tryjob_empty_revision.json → multiple_patch_refs.json} +8 -9
  100. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +19 -29
  101. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{trychange.json → refs.json} +4 -9
  102. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +4 -9
  103. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +51 -6
  104. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +50 -6
  105. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +51 -6
  106. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +17 -25
  107. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +17 -25
  108. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +18 -26
  109. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +18 -26
  110. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +26 -28
  111. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +45 -5
  112. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +17 -25
  113. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +13 -0
  114. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name.json +13 -152
  115. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +4 -9
  116. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +185 -202
  117. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +52 -157
  118. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +5 -14
  119. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +34 -0
  120. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +14 -2
  121. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +4 -5
  122. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +4 -5
  123. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +7 -5
  124. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +4 -5
  125. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +4 -5
  126. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +9 -3
  127. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +9 -3
  128. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +9 -3
  129. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +4 -5
  130. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +2 -3
  131. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +2 -3
  132. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +2 -3
  133. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +2 -3
  134. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +2 -3
  135. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +2 -3
  136. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +2 -3
  137. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +2 -3
  138. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +2 -3
  139. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +2 -3
  140. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +13 -8
  141. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +18 -12
  142. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +18 -12
  143. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +18 -12
  144. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.py +3 -0
  145. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +1 -0
  146. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +58 -46
  147. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +65 -22
  148. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +20 -21
  149. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +20 -21
  150. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +20 -21
  151. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +20 -21
  152. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +5 -2
  153. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +62 -14
  154. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +24 -38
  155. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +56 -50
  156. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.py +15 -9
  157. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +4 -1
  158. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +34 -22
  159. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +5 -6
  160. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +5 -6
  161. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +5 -6
  162. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +5 -6
  163. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +222 -0
  164. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +5 -6
  165. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +5 -6
  166. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +224 -0
  167. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +10 -6
  168. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +5 -7
  169. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +5 -6
  170. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +5 -6
  171. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +5 -7
  172. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +5 -6
  173. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +10 -5
  174. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +5 -6
  175. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +8 -9
  176. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +5 -6
  177. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +12 -8
  178. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +5 -6
  179. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +5 -6
  180. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +27 -11
  181. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +1 -1
  182. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +12 -13
  183. data/vendor/depot_tools/recipes/recipe_modules/gitiles/__init__.py +5 -0
  184. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +120 -5
  185. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +45 -3
  186. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.py +25 -0
  187. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +56 -4
  188. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +6 -0
  189. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.py +49 -0
  190. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +24 -13
  191. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +13 -14
  192. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +2 -3
  193. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +2 -3
  194. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +2 -3
  195. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +2 -3
  196. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +2 -3
  197. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +2 -3
  198. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +2 -3
  199. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +2 -3
  200. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +2 -3
  201. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +2 -3
  202. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +1 -2
  203. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +35 -0
  204. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +116 -0
  205. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +22 -0
  206. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +82 -0
  207. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +22 -0
  208. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +23 -0
  209. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +1 -0
  210. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +2 -7
  211. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +7 -6
  212. data/vendor/depot_tools/recipes/recipe_modules/tryserver/__init__.py +1 -0
  213. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +117 -8
  214. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +4 -5
  215. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +7 -4
  216. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +98 -7
  217. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +147 -0
  218. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +8 -5
  219. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +8 -5
  220. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +9 -6
  221. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +9 -6
  222. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +27 -2
  223. data/vendor/depot_tools/recipes/recipe_modules/tryserver/test_api.py +14 -0
  224. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/__init__.py +25 -0
  225. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/api.py +137 -0
  226. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +22 -0
  227. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +22 -0
  228. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +107 -0
  229. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +26 -0
  230. data/vendor/depot_tools/recipes/recipes.py +37 -27
  231. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +7 -10
  232. data/vendor/depot_tools/repo +34 -8
  233. data/vendor/depot_tools/roll_dep.py +52 -49
  234. data/vendor/depot_tools/scm.py +38 -23
  235. data/vendor/depot_tools/setup_color.py +4 -2
  236. data/vendor/depot_tools/split_cl.py +32 -4
  237. data/vendor/depot_tools/subprocess2.py +22 -4
  238. data/vendor/depot_tools/third_party/httplib2/README.chromium +2 -2
  239. data/vendor/depot_tools/third_party/httplib2/__init__.py +242 -158
  240. data/vendor/depot_tools/third_party/httplib2/cacerts.txt +57 -44
  241. data/vendor/depot_tools/third_party/httplib2/socks.py +15 -5
  242. data/vendor/depot_tools/third_party/logilab/README.chromium +2 -4
  243. data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +2 -1
  244. data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +10 -5
  245. data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +5 -5
  246. data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +233 -0
  247. data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +82 -33
  248. data/vendor/depot_tools/third_party/logilab/astroid/bases.py +137 -153
  249. data/vendor/depot_tools/third_party/logilab/astroid/brain/{builtin_inference.py → brain_builtin_inference.py} +117 -26
  250. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +15 -0
  251. data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2gi.py → brain_gi.py} +48 -8
  252. data/vendor/depot_tools/third_party/logilab/astroid/brain/{py2mechanize.py → brain_mechanize.py} +0 -0
  253. data/vendor/depot_tools/third_party/logilab/astroid/brain/{pynose.py → brain_nose.py} +4 -1
  254. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +62 -0
  255. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +76 -0
  256. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +44 -0
  257. data/vendor/depot_tools/third_party/logilab/astroid/brain/{pysix_moves.py → brain_six.py} +28 -1
  258. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +65 -0
  259. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +473 -0
  260. data/vendor/depot_tools/third_party/logilab/astroid/builder.py +104 -81
  261. data/vendor/depot_tools/third_party/logilab/astroid/context.py +81 -0
  262. data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +75 -0
  263. data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +20 -0
  264. data/vendor/depot_tools/third_party/logilab/astroid/inference.py +137 -183
  265. data/vendor/depot_tools/third_party/logilab/astroid/manager.py +45 -169
  266. data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +37 -14
  267. data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +112 -41
  268. data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +243 -156
  269. data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +35 -22
  270. data/vendor/depot_tools/third_party/logilab/astroid/objects.py +186 -0
  271. data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +157 -102
  272. data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +32 -8
  273. data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +372 -309
  274. data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +652 -420
  275. data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +4 -21
  276. data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +96 -0
  277. data/vendor/depot_tools/third_party/logilab/astroid/util.py +89 -0
  278. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +19 -0
  279. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +11 -0
  280. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +20 -0
  281. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +1421 -0
  282. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +9 -0
  283. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +246 -0
  284. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +414 -0
  285. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +13 -0
  286. data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +24 -0
  287. data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +11 -0
  288. data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +19 -0
  289. data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +2729 -0
  290. data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +96 -0
  291. data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +512 -0
  292. data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +228 -0
  293. data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +901 -0
  294. data/vendor/depot_tools/third_party/pylint/README.chromium +2 -25
  295. data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +13 -3
  296. data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +1 -2
  297. data/vendor/depot_tools/third_party/pylint/checkers/async.py +82 -0
  298. data/vendor/depot_tools/third_party/pylint/checkers/base.py +893 -119
  299. data/vendor/depot_tools/third_party/pylint/checkers/classes.py +342 -204
  300. data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +51 -34
  301. data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +84 -47
  302. data/vendor/depot_tools/third_party/pylint/checkers/format.py +55 -30
  303. data/vendor/depot_tools/third_party/pylint/checkers/imports.py +314 -73
  304. data/vendor/depot_tools/third_party/pylint/checkers/logging.py +10 -8
  305. data/vendor/depot_tools/third_party/pylint/checkers/misc.py +2 -1
  306. data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +45 -48
  307. data/vendor/depot_tools/third_party/pylint/checkers/python3.py +31 -21
  308. data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +3 -3
  309. data/vendor/depot_tools/third_party/pylint/checkers/similar.py +4 -5
  310. data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +24 -10
  311. data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +120 -56
  312. data/vendor/depot_tools/third_party/pylint/checkers/strings.py +38 -35
  313. data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +485 -138
  314. data/vendor/depot_tools/third_party/pylint/checkers/utils.py +319 -142
  315. data/vendor/depot_tools/third_party/pylint/checkers/variables.py +329 -207
  316. data/vendor/depot_tools/third_party/pylint/config.py +739 -76
  317. data/vendor/depot_tools/third_party/pylint/epylint.py +9 -5
  318. data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
  319. data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +311 -0
  320. data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +62 -0
  321. data/vendor/depot_tools/third_party/{logilab/common → pylint}/graph.py +30 -133
  322. data/vendor/depot_tools/third_party/pylint/gui.py +2 -2
  323. data/vendor/depot_tools/third_party/pylint/interfaces.py +21 -3
  324. data/vendor/depot_tools/third_party/pylint/lint.py +123 -140
  325. data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +10 -13
  326. data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +15 -4
  327. data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +372 -0
  328. data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +30 -7
  329. data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +80 -2
  330. data/vendor/depot_tools/third_party/{logilab/common → pylint/pyreverse}/vcgutils.py +19 -37
  331. data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +3 -4
  332. data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +34 -18
  333. data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +1 -1
  334. data/vendor/depot_tools/third_party/pylint/reporters/html.py +10 -3
  335. data/vendor/depot_tools/third_party/pylint/reporters/json.py +10 -4
  336. data/vendor/depot_tools/third_party/pylint/reporters/text.py +94 -3
  337. data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +106 -0
  338. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/html_writer.py +17 -57
  339. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/nodes.py +52 -74
  340. data/vendor/depot_tools/third_party/{logilab/common → pylint/reporters}/ureports/text_writer.py +14 -60
  341. data/vendor/depot_tools/third_party/pylint/testutils.py +22 -20
  342. data/vendor/depot_tools/third_party/pylint/utils.py +268 -44
  343. data/vendor/depot_tools/third_party/repo/progress.py +42 -0
  344. data/vendor/depot_tools/update_depot_tools +1 -1
  345. data/vendor/depot_tools/upload_metrics.py +25 -0
  346. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +45 -15
  347. data/vendor/depot_tools/win_toolchain/package_from_installed.py +71 -24
  348. data/vendor/depot_tools/yapf +1 -1
  349. data/vendor/depot_tools/yapf.bat +1 -1
  350. metadata +92 -77
  351. data/vendor/depot_tools/git-crsync +0 -3
  352. data/vendor/depot_tools/infra/config/cq.cfg +0 -32
  353. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref.json +0 -29
  354. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/apply_gerrit_ref_custom.json +0 -29
  355. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/buildbot.json +0 -105
  356. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/shallow.json +0 -195
  357. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle_deprecated.json +0 -248
  358. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8.json +0 -248
  359. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_manifest_name_no_patch.json +0 -105
  360. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/apply_gerrit.py +0 -33
  361. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2pytest.py +0 -31
  362. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2qt4.py +0 -22
  363. data/vendor/depot_tools/third_party/logilab/astroid/brain/py2stdlib.py +0 -334
  364. data/vendor/depot_tools/third_party/logilab/astroid/inspector.py +0 -273
  365. data/vendor/depot_tools/third_party/logilab/astroid/utils.py +0 -239
  366. data/vendor/depot_tools/third_party/logilab/common/LICENSE.txt +0 -339
  367. data/vendor/depot_tools/third_party/logilab/common/README.chromium +0 -11
  368. data/vendor/depot_tools/third_party/logilab/common/__init__.py +0 -175
  369. data/vendor/depot_tools/third_party/logilab/common/__pkginfo__.py +0 -57
  370. data/vendor/depot_tools/third_party/logilab/common/cache.py +0 -114
  371. data/vendor/depot_tools/third_party/logilab/common/changelog.py +0 -238
  372. data/vendor/depot_tools/third_party/logilab/common/clcommands.py +0 -334
  373. data/vendor/depot_tools/third_party/logilab/common/cli.py +0 -211
  374. data/vendor/depot_tools/third_party/logilab/common/compat.py +0 -78
  375. data/vendor/depot_tools/third_party/logilab/common/configuration.py +0 -1105
  376. data/vendor/depot_tools/third_party/logilab/common/contexts.py +0 -5
  377. data/vendor/depot_tools/third_party/logilab/common/corbautils.py +0 -117
  378. data/vendor/depot_tools/third_party/logilab/common/daemon.py +0 -101
  379. data/vendor/depot_tools/third_party/logilab/common/date.py +0 -335
  380. data/vendor/depot_tools/third_party/logilab/common/dbf.py +0 -231
  381. data/vendor/depot_tools/third_party/logilab/common/debugger.py +0 -214
  382. data/vendor/depot_tools/third_party/logilab/common/decorators.py +0 -281
  383. data/vendor/depot_tools/third_party/logilab/common/deprecation.py +0 -189
  384. data/vendor/depot_tools/third_party/logilab/common/fileutils.py +0 -404
  385. data/vendor/depot_tools/third_party/logilab/common/interface.py +0 -71
  386. data/vendor/depot_tools/third_party/logilab/common/logging_ext.py +0 -195
  387. data/vendor/depot_tools/third_party/logilab/common/modutils.py +0 -702
  388. data/vendor/depot_tools/third_party/logilab/common/optik_ext.py +0 -392
  389. data/vendor/depot_tools/third_party/logilab/common/optparser.py +0 -92
  390. data/vendor/depot_tools/third_party/logilab/common/proc.py +0 -277
  391. data/vendor/depot_tools/third_party/logilab/common/pyro_ext.py +0 -180
  392. data/vendor/depot_tools/third_party/logilab/common/pytest.py +0 -1199
  393. data/vendor/depot_tools/third_party/logilab/common/registry.py +0 -1119
  394. data/vendor/depot_tools/third_party/logilab/common/shellutils.py +0 -462
  395. data/vendor/depot_tools/third_party/logilab/common/sphinx_ext.py +0 -87
  396. data/vendor/depot_tools/third_party/logilab/common/sphinxutils.py +0 -122
  397. data/vendor/depot_tools/third_party/logilab/common/table.py +0 -929
  398. data/vendor/depot_tools/third_party/logilab/common/tasksqueue.py +0 -101
  399. data/vendor/depot_tools/third_party/logilab/common/testlib.py +0 -1392
  400. data/vendor/depot_tools/third_party/logilab/common/textutils.py +0 -537
  401. data/vendor/depot_tools/third_party/logilab/common/tree.py +0 -369
  402. data/vendor/depot_tools/third_party/logilab/common/umessage.py +0 -194
  403. data/vendor/depot_tools/third_party/logilab/common/ureports/__init__.py +0 -172
  404. data/vendor/depot_tools/third_party/logilab/common/ureports/docbook_writer.py +0 -140
  405. data/vendor/depot_tools/third_party/logilab/common/urllib2ext.py +0 -89
  406. data/vendor/depot_tools/third_party/logilab/common/visitor.py +0 -109
  407. data/vendor/depot_tools/third_party/logilab/common/xmlrpcutils.py +0 -131
  408. 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.9.2
5
- Revision: cf631a73e2f3f43897b65206127ced82382d35f5
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 generators
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__ = "0.9.2"
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 # python 2.6
69
- ssl_SSLError = ssl.SSLError
70
- def _ssl_wrap_socket(sock, key_file, cert_file,
71
- disable_validation, ca_certs):
72
- if disable_validation:
73
- cert_reqs = ssl.CERT_NONE
74
- else:
75
- cert_reqs = ssl.CERT_REQUIRED
76
- # We should be specifying SSL version 3 or TLS v1, but the ssl module
77
- # doesn't expose the necessary knobs. So we need to go with the default
78
- # of SSLv23.
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
- except (AttributeError, ImportError):
82
- ssl_SSLError = None
83
- def _ssl_wrap_socket(sock, key_file, cert_file,
84
- disable_validation, ca_certs):
85
- if not disable_validation:
86
- raise CertificateValidationUnsupported(
87
- "SSL certificate validation is not supported without "
88
- "the ssl module installed. To avoid this error, install "
89
- "the ssl module, or explicity disable validation.")
90
- ssl_sock = socket.ssl(sock, key_file, cert_file)
91
- return httplib.FakeSocket(sock, ssl_sock)
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 headers.has_key('cache-control'):
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.has_key(headername):
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 request_headers.has_key('pragma') and request_headers['pragma'].lower().find('no-cache') != -1:
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 cc.has_key('no-cache'):
392
+ elif 'no-cache' in cc:
358
393
  retval = "TRANSPARENT"
359
- elif cc_response.has_key('no-cache'):
394
+ elif 'no-cache' in cc_response:
360
395
  retval = "STALE"
361
- elif cc.has_key('only-if-cached'):
396
+ elif 'only-if-cached' in cc:
362
397
  retval = "FRESH"
363
- elif response_headers.has_key('date'):
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 cc_response.has_key('max-age'):
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 response_headers.has_key('expires'):
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 cc.has_key('max-age'):
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 cc.has_key('min-fresh'):
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 cc.has_key('no-store') or cc_response.has_key('no-store'):
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 not response.has_key('authentication-info'):
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 updated_challenge.has_key('nextnonce'):
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): # use safe=lambda x: md5.new(x).hexdigest() for the old behavior
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
- bypass = False
797
- for domain in self.bypass_hosts:
798
- if hostname.endswith(domain):
799
- bypass = True
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
- return bypass
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
- pi = proxy_info_from_url(url, method)
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
- pi.bypass_hosts = bypass_hosts
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 # socks.PROXY_TYPE_HTTP
855
- return ProxyInfo(
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 "connect: (%s, %s) ************" % (self.host, self.port)
970
+ print("connect: (%s, %s) ************" % (self.host, self.port))
913
971
  if use_proxy:
914
- print "proxy: %s ************" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
915
-
916
- self.sock.connect((self.host, self.port) + sa[2:])
917
- except socket.error, msg:
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 "connect fail: (%s, %s)" % (self.host, self.port)
979
+ print("connect fail: (%s, %s)" % (self.host, self.port))
920
980
  if use_proxy:
921
- print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
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
- sock.connect((self.host, self.port))
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 "connect: (%s, %s)" % (self.host, self.port)
1106
+ print("connect: (%s, %s)" % (self.host, self.port))
1039
1107
  if use_proxy:
1040
- print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
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.errno == ssl.SSL_ERROR_SSL:
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, msg:
1132
+ except socket.error as msg:
1065
1133
  if self.debuglevel > 0:
1066
- print "connect fail: (%s, %s)" % (self.host, self.port)
1134
+ print("connect fail: (%s, %s)" % (self.host, self.port))
1067
1135
  if use_proxy:
1068
- print "proxy: %s" % str((proxy_host, proxy_port, proxy_rdns, proxy_user, proxy_pass))
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
- try:
1085
- from google.appengine.api import apiproxy_stub_map
1086
- if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None:
1087
- raise ImportError # Bail out; we're not actually running on App Engine.
1088
- from google.appengine.api.urlfetch import fetch
1089
- from google.appengine.api.urlfetch import InvalidURLError
1090
- except (ImportError, AttributeError):
1091
- from google3.apphosting.api import apiproxy_stub_map
1092
- if apiproxy_stub_map.apiproxy.GetStub('urlfetch') is None:
1093
- raise ImportError # Bail out; we're not actually running on App Engine.
1094
- from google3.apphosting.api.urlfetch import fetch
1095
- from google3.apphosting.api.urlfetch import InvalidURLError
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.has_key(scheme):
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, e:
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 not response.has_key('location') and response.status != 300:
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 response.has_key('location'):
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 not response.has_key('content-location'):
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 headers.has_key('if-none-match'):
1469
+ if 'if-none-match' in headers:
1387
1470
  del headers['if-none-match']
1388
- if headers.has_key('if-modified-since'):
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 response.has_key('location'):
1475
+ if 'location' in response:
1393
1476
  location = response['location']
1394
1477
  old_response = copy.deepcopy(response)
1395
- if not old_response.has_key('content-location'):
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 not response.has_key('content-location'):
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 not headers.has_key('user-agent'):
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 info.has_key('etag') and not self.ignore_etag and 'if-match' not in headers:
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 info.has_key('-x-permanent-redirect-url'):
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 info.has_key('etag') and not self.ignore_etag and not 'if-none-match' in headers:
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 info.has_key('last-modified') and not 'last-modified' in headers:
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 cc.has_key('only-if-cached'):
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, e:
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, name
1780
+ raise AttributeError(name)