From 87abd9c6094f8b682f7457181adbe768d003fd23 Mon Sep 17 00:00:00 2001
From: Ian Cordasco
Date: Sun, 12 Jan 2014 14:27:45 -0600
Subject: [PATCH 001/127] Use calendar.timegm when calculating cookie
expiration
Fixes #1859
Credit: @lukasa
---
requests/cookies.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/requests/cookies.py b/requests/cookies.py
index 831c49c6..ea72f75e 100644
--- a/requests/cookies.py
+++ b/requests/cookies.py
@@ -7,6 +7,7 @@ requests.utils imports from here, so be careful with imports.
"""
import time
+import calendar
import collections
from .compat import cookielib, urlparse, urlunparse, Morsel
@@ -393,8 +394,8 @@ def morsel_to_cookie(morsel):
expires = time.time() + morsel['max-age']
elif morsel['expires']:
time_template = '%a, %d-%b-%Y %H:%M:%S GMT'
- expires = time.mktime(
- time.strptime(morsel['expires'], time_template)) - time.timezone
+ expires = calendar.timegm(time.strptime(morsel['expires'],
+ time_template))
return create_cookie(
comment=morsel['comment'],
comment_url=bool(morsel['comment']),
From 6f6b2fd1d5ca6b281a841e8a31e32eb6c34c429b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Braulio=20Valdivielso=20Mart=C3=ADnez?=
Date: Mon, 23 Nov 2015 20:52:06 +0100
Subject: [PATCH 002/127] Set 'Transfer-Encoding: chunked' if data file length
equals 0
---
requests/models.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/requests/models.py b/requests/models.py
index 639565cf..43a297e6 100644
--- a/requests/models.py
+++ b/requests/models.py
@@ -446,6 +446,8 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
if data:
body = self._encode_params(data)
if isinstance(data, basestring) or hasattr(data, 'read'):
+ if hasattr(data, 'fileno') and length == 0:
+ self.headers['Transfer-Encoding'] = 'chunked'
content_type = None
else:
content_type = 'application/x-www-form-urlencoded'
From 4c82dbab6fc3ad4b66babb1b01d21a26db602579 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Braulio=20Valdivielso=20Mart=C3=ADnez?=
Date: Tue, 24 Nov 2015 13:42:13 +0100
Subject: [PATCH 003/127] Fix 'Transfer-Encoding: chunked' change
---
requests/models.py | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/requests/models.py b/requests/models.py
index 43a297e6..81bd1a84 100644
--- a/requests/models.py
+++ b/requests/models.py
@@ -434,7 +434,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
if files:
raise NotImplementedError('Streamed bodies and files are mutually exclusive.')
- if length is not None:
+ if length:
self.headers['Content-Length'] = builtin_str(length)
else:
self.headers['Transfer-Encoding'] = 'chunked'
@@ -446,8 +446,6 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
if data:
body = self._encode_params(data)
if isinstance(data, basestring) or hasattr(data, 'read'):
- if hasattr(data, 'fileno') and length == 0:
- self.headers['Transfer-Encoding'] = 'chunked'
content_type = None
else:
content_type = 'application/x-www-form-urlencoded'
From 68db4132e36d23dc371219dd99ac51b1c1b1f852 Mon Sep 17 00:00:00 2001
From: Olle Lundberg
Date: Wed, 25 Nov 2015 02:02:41 +0100
Subject: [PATCH 004/127] Update adapters.py
Remove duplicate word.
---
requests/adapters.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requests/adapters.py b/requests/adapters.py
index cecf6c2a..6266d5be 100644
--- a/requests/adapters.py
+++ b/requests/adapters.py
@@ -108,7 +108,7 @@ class HTTPAdapter(BaseAdapter):
def __setstate__(self, state):
# Can't handle by adding 'proxy_manager' to self.__attrs__ because
- # because self.poolmanager uses a lambda function, which isn't pickleable.
+ # self.poolmanager uses a lambda function, which isn't pickleable.
self.proxy_manager = {}
self.config = {}
From 27f5a15364f921fc314eadf3b0370dbfc02c3190 Mon Sep 17 00:00:00 2001
From: Jon Parise
Date: Thu, 26 Nov 2015 09:34:01 -0500
Subject: [PATCH 005/127] Include a link to my GitHub profile.
---
AUTHORS.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/AUTHORS.rst b/AUTHORS.rst
index 6a7f889b..d4bfaf96 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -134,7 +134,7 @@ Patches and Suggestions
- Kevin Burke
- Flavio Curella
- David Pursehouse (`@dpursehouse `_)
-- Jon Parise
+- Jon Parise (`@jparise `_)
- Alexander Karpinsky (`@homm86 `_)
- Marc Schlaich (`@schlamar `_)
- Park Ilsu (`@daftshady `_)
From 23d9b077d8b2db9d13c1edd97ffb65b0582631d0 Mon Sep 17 00:00:00 2001
From: Jakub Wilk
Date: Tue, 1 Dec 2015 12:24:56 +0100
Subject: [PATCH 006/127] Fix typos
---
HISTORY.rst | 6 +++---
requests/cookies.py | 2 +-
requests/models.py | 4 ++--
requests/sessions.py | 4 ++--
test_requests.py | 2 +-
5 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/HISTORY.rst b/HISTORY.rst
index 34226f49..7f20389e 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -50,7 +50,7 @@ dev (XXXX)
- The ``json`` parameter to ``post()`` and friends will now only be used if
neither ``data`` nor ``files`` are present, consistent with the
documentation.
-- We now ignore empty fields in the ``NO_PROXY`` enviroment variable.
+- We now ignore empty fields in the ``NO_PROXY`` environment variable.
- Fixed problem where ``httplib.BadStatusLine`` would get raised if combining
``stream=True`` with ``contextlib.closing``.
- Prevented bugs where we would attempt to return the same connection back to
@@ -533,7 +533,7 @@ This is not a backwards compatible change.
- Improved mime-compatible JSON handling
- Proxy fixes
- Path hack fixes
-- Case-Insensistive Content-Encoding headers
+- Case-Insensitive Content-Encoding headers
- Support for CJK parameters in form posts
@@ -620,7 +620,7 @@ This is not a backwards compatible change.
+++++++++++++++++++
- Removal of Requests.async in favor of `grequests `_
-- Allow disabling of cookie persistiance.
+- Allow disabling of cookie persistence.
- New implementation of safe_mode
- cookies.get now supports default argument
- Session cookies not saved when Session.request is called with return_response=False
diff --git a/requests/cookies.py b/requests/cookies.py
index d097d7db..d61ec2da 100644
--- a/requests/cookies.py
+++ b/requests/cookies.py
@@ -368,7 +368,7 @@ def _copy_cookie_jar(jar):
return None
if hasattr(jar, 'copy'):
- # We're dealing with an instane of RequestsCookieJar
+ # We're dealing with an instance of RequestsCookieJar
return jar.copy()
# We're dealing with a generic CookieJar instance
new_jar = copy.copy(jar)
diff --git a/requests/models.py b/requests/models.py
index 639565cf..b01d3487 100644
--- a/requests/models.py
+++ b/requests/models.py
@@ -324,7 +324,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
def prepare_url(self, url, params):
"""Prepares the given HTTP URL."""
#: Accept objects that have string representations.
- #: We're unable to blindy call unicode/str functions
+ #: We're unable to blindly call unicode/str functions
#: as this will include the bytestring indicator (b'')
#: on python 3.x.
#: https://github.com/kennethreitz/requests/pull/2238
@@ -631,7 +631,7 @@ class Response(object):
@property
def is_permanent_redirect(self):
- """True if this Response one of the permanant versions of redirect"""
+ """True if this Response one of the permanent versions of redirect"""
return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect))
@property
diff --git a/requests/sessions.py b/requests/sessions.py
index 12879a5b..6d607459 100644
--- a/requests/sessions.py
+++ b/requests/sessions.py
@@ -325,7 +325,7 @@ class Session(SessionRedirectMixin):
#: limit, a :class:`TooManyRedirects` exception is raised.
self.max_redirects = DEFAULT_REDIRECT_LIMIT
- #: Trust environement settings for proxy configuration, default
+ #: Trust environment settings for proxy configuration, default
#: authentication and similar.
self.trust_env = True
@@ -634,7 +634,7 @@ class Session(SessionRedirectMixin):
'cert': cert}
def get_adapter(self, url):
- """Returns the appropriate connnection adapter for the given URL."""
+ """Returns the appropriate connection adapter for the given URL."""
for (prefix, adapter) in self.adapters.items():
if url.lower().startswith(prefix):
diff --git a/test_requests.py b/test_requests.py
index e83cbc44..137edc08 100755
--- a/test_requests.py
+++ b/test_requests.py
@@ -612,7 +612,7 @@ class TestRequests(object):
assert prep.hooks['response'] != []
assert prep.hooks['response'] == [hook]
- def test_session_hooks_are_overriden_by_request_hooks(self, httpbin):
+ def test_session_hooks_are_overridden_by_request_hooks(self, httpbin):
hook1 = lambda x, *args, **kwargs: x
hook2 = lambda x, *args, **kwargs: x
assert hook1 is not hook2
From 6e903de0680856ca1dc2c0e80eae97457e3ea29a Mon Sep 17 00:00:00 2001
From: Susan Tan
Date: Fri, 4 Dec 2015 00:01:03 -0800
Subject: [PATCH 007/127] Switch to alabaster instead of kr sphinx theme for
requests docs
Add in the pre-existing ad tracker Javascript tags from kr sphinx theme.
---
docs/_templates/layout.html | 82 +++++++++++++++++++++++++++++++++++++
docs/conf.py | 11 +++--
docs/requirements.txt | 1 +
3 files changed, 91 insertions(+), 3 deletions(-)
create mode 100644 docs/_templates/layout.html
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
new file mode 100644
index 00000000..eab5aa89
--- /dev/null
+++ b/docs/_templates/layout.html
@@ -0,0 +1,82 @@
+{%- extends "basic/layout.html" %}
+{%- block extrahead %}
+ {{ super() }}
+ {% if theme_touch_icon %}
+
+ {% endif %}
+
+{% endblock %}
+{%- block relbar2 %}{% endblock %}
+{%- block footer %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{%- endblock %}
diff --git a/docs/conf.py b/docs/conf.py
index 4969857b..70ec5b97 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -20,6 +20,8 @@ sys.path.insert(0, os.path.abspath('..'))
import requests
from requests import __version__
+import alabaster
+
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
@@ -30,6 +32,7 @@ from requests import __version__
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
+ 'alabaster'
]
# Add any paths that contain templates here, relative to this directory.
@@ -101,7 +104,9 @@ html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
-#html_theme_options = {}
+html_theme_options = {
+ 'show_powered_by': False
+}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
@@ -242,7 +247,7 @@ texinfo_documents = [
texinfo_appendices = []
sys.path.append(os.path.abspath('_themes'))
-html_theme_path = ['_themes']
-html_theme = 'kr'
+html_theme_path =[alabaster.get_path()]
+html_theme = 'alabaster'
intersphinx_mapping = {'urllib3': ('http://urllib3.readthedocs.org/en/latest', None)}
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 30491772..bf596036 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1 +1,2 @@
+alabaster==0.7.3
Sphinx==1.1.3
From 4d5e534467b9f9b0e35bef8e71f8e460475f05f0 Mon Sep 17 00:00:00 2001
From: Susan Tan
Date: Fri, 4 Dec 2015 00:20:40 -0800
Subject: [PATCH 008/127] Remove kenneth's sphinx themes from docs directory
---
docs/_themes/README.rst | 25 -
docs/_themes/kr/layout.html | 85 ----
docs/_themes/kr/relations.html | 19 -
docs/_themes/kr/static/flasky.css_t | 536 ----------------------
docs/_themes/kr/theme.conf | 7 -
docs/_themes/kr_small/layout.html | 22 -
docs/_themes/kr_small/static/flasky.css_t | 287 ------------
docs/_themes/kr_small/theme.conf | 10 -
8 files changed, 991 deletions(-)
delete mode 100644 docs/_themes/README.rst
delete mode 100644 docs/_themes/kr/layout.html
delete mode 100644 docs/_themes/kr/relations.html
delete mode 100644 docs/_themes/kr/static/flasky.css_t
delete mode 100644 docs/_themes/kr/theme.conf
delete mode 100644 docs/_themes/kr_small/layout.html
delete mode 100644 docs/_themes/kr_small/static/flasky.css_t
delete mode 100644 docs/_themes/kr_small/theme.conf
diff --git a/docs/_themes/README.rst b/docs/_themes/README.rst
deleted file mode 100644
index dd8d7c07..00000000
--- a/docs/_themes/README.rst
+++ /dev/null
@@ -1,25 +0,0 @@
-krTheme Sphinx Style
-====================
-
-This repository contains sphinx styles Kenneth Reitz uses in most of
-his projects. It is a derivative of Mitsuhiko's themes for Flask and Flask related
-projects. To use this style in your Sphinx documentation, follow
-this guide:
-
-1. put this folder as _themes into your docs folder. Alternatively
- you can also use git submodules to check out the contents there.
-
-2. add this to your conf.py: ::
-
- sys.path.append(os.path.abspath('_themes'))
- html_theme_path = ['_themes']
- html_theme = 'flask'
-
-The following themes exist:
-
-**kr**
- the standard flask documentation theme for large projects
-
-**kr_small**
- small one-page theme. Intended to be used by very small addon libraries.
-
diff --git a/docs/_themes/kr/layout.html b/docs/_themes/kr/layout.html
deleted file mode 100644
index a9a3cb6e..00000000
--- a/docs/_themes/kr/layout.html
+++ /dev/null
@@ -1,85 +0,0 @@
-{%- extends "basic/layout.html" %}
-{%- block extrahead %}
- {{ super() }}
- {% if theme_touch_icon %}
-
- {% endif %}
-
-
-{% endblock %}
-{%- block relbar2 %}{% endblock %}
-{%- block footer %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{%- endblock %}
diff --git a/docs/_themes/kr/relations.html b/docs/_themes/kr/relations.html
deleted file mode 100644
index 3bbcde85..00000000
--- a/docs/_themes/kr/relations.html
+++ /dev/null
@@ -1,19 +0,0 @@
-Related Topics
-
diff --git a/docs/_themes/kr/static/flasky.css_t b/docs/_themes/kr/static/flasky.css_t
deleted file mode 100644
index 3a13c358..00000000
--- a/docs/_themes/kr/static/flasky.css_t
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * flasky.css_t
- * ~~~~~~~~~~~~
- *
- * :copyright: Copyright 2010 by Armin Ronacher. Modifications by Kenneth Reitz.
- * :license: Flask Design License, see LICENSE for details.
- */
-
-{% set page_width = '940px' %}
-{% set sidebar_width = '220px' %}
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
- font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro';
- font-size: 17px;
- background-color: white;
- color: #000;
- margin: 0;
- padding: 0;
-}
-
-div.document {
- width: {{ page_width }};
- margin: 30px auto 0 auto;
-}
-
-div.documentwrapper {
- float: left;
- width: 100%;
-}
-
-div.bodywrapper {
- margin: 0 0 0 {{ sidebar_width }};
-}
-
-div.sphinxsidebar {
- width: {{ sidebar_width }};
-}
-
-hr {
- border: 1px solid #B1B4B6;
-}
-
-div.body {
- background-color: #ffffff;
- color: #3E4349;
- padding: 0 30px 0 30px;
-}
-
-img.floatingflask {
- padding: 0 0 10px 10px;
- float: right;
-}
-
-div.footer {
- width: {{ page_width }};
- margin: 20px auto 30px auto;
- font-size: 14px;
- color: #888;
- text-align: right;
-}
-
-div.footer a {
- color: #888;
-}
-
-div.related {
- display: none;
-}
-
-div.sphinxsidebar a {
- color: #444;
- text-decoration: none;
- border-bottom: 1px dotted #999;
-}
-
-div.sphinxsidebar a:hover {
- border-bottom: 1px solid #999;
-}
-
-div.sphinxsidebar {
- font-size: 14px;
- line-height: 1.5;
-}
-
-div.sphinxsidebarwrapper {
- padding: 18px 10px;
-}
-
-div.sphinxsidebarwrapper p.logo {
- padding: 0;
- margin: -10px 0 0 -20px;
- text-align: center;
-}
-
-div.sphinxsidebar h3,
-div.sphinxsidebar h4 {
- font-family: 'Garamond', 'Georgia', serif;
- color: #444;
- font-size: 24px;
- font-weight: normal;
- margin: 0 0 5px 0;
- padding: 0;
-}
-
-div.sphinxsidebar h4 {
- font-size: 20px;
-}
-
-div.sphinxsidebar h3 a {
- color: #444;
-}
-
-div.sphinxsidebar p.logo a,
-div.sphinxsidebar h3 a,
-div.sphinxsidebar p.logo a:hover,
-div.sphinxsidebar h3 a:hover {
- border: none;
-}
-
-div.sphinxsidebar p {
- color: #555;
- margin: 10px 0;
-}
-
-div.sphinxsidebar ul {
- margin: 10px 0;
- padding: 0;
- color: #000;
-}
-
-div.sphinxsidebar input {
- border: 1px solid #ccc;
- font-family: 'Georgia', serif;
- font-size: 1em;
-}
-
-/* -- body styles ----------------------------------------------------------- */
-
-a {
- color: #004B6B;
- text-decoration: underline;
-}
-
-a:hover {
- color: #6D4100;
- text-decoration: underline;
-}
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
- font-family: 'Garamond', 'Georgia', serif;
- font-weight: normal;
- margin: 30px 0px 10px 0px;
- padding: 0;
-}
-
-div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
-div.body h2 { font-size: 180%; }
-div.body h3 { font-size: 150%; }
-div.body h4 { font-size: 130%; }
-div.body h5 { font-size: 100%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
- color: #ddd;
- padding: 0 4px;
- text-decoration: none;
-}
-
-a.headerlink:hover {
- color: #444;
- background: #eaeaea;
-}
-
-div.body p, div.body dd, div.body li {
- line-height: 1.4em;
-}
-
-div.admonition {
- background: #fafafa;
- margin: 20px -30px;
- padding: 10px 30px;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-
-div.admonition tt.xref, div.admonition a tt {
- border-bottom: 1px solid #fafafa;
-}
-
-dd div.admonition {
- margin-left: -60px;
- padding-left: 60px;
-}
-
-div.admonition p.admonition-title {
- font-family: 'Garamond', 'Georgia', serif;
- font-weight: normal;
- font-size: 24px;
- margin: 0 0 10px 0;
- padding: 0;
- line-height: 1;
-}
-
-div.admonition p.last {
- margin-bottom: 0;
-}
-
-div.highlight {
- background-color: white;
-}
-
-dt:target, .highlight {
- background: #FAF3E8;
-}
-
-div.note {
- background-color: #eee;
- border: 1px solid #ccc;
-}
-
-div.seealso {
- background-color: #ffc;
- border: 1px solid #ff6;
-}
-
-div.topic {
- background-color: #eee;
-}
-
-p.admonition-title {
- display: inline;
-}
-
-p.admonition-title:after {
- content: ":";
-}
-
-pre, tt {
- font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
- font-size: 0.9em;
-}
-
-img.screenshot {
-}
-
-tt.descname, tt.descclassname {
- font-size: 0.95em;
-}
-
-tt.descname {
- padding-right: 0.08em;
-}
-
-img.screenshot {
- -moz-box-shadow: 2px 2px 4px #eee;
- -webkit-box-shadow: 2px 2px 4px #eee;
- box-shadow: 2px 2px 4px #eee;
-}
-
-table.docutils {
- border: 1px solid #888;
- -moz-box-shadow: 2px 2px 4px #eee;
- -webkit-box-shadow: 2px 2px 4px #eee;
- box-shadow: 2px 2px 4px #eee;
-}
-
-table.docutils td, table.docutils th {
- border: 1px solid #888;
- padding: 0.25em 0.7em;
-}
-
-table.field-list, table.footnote {
- border: none;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-
-table.footnote {
- margin: 15px 0;
- width: 100%;
- border: 1px solid #eee;
- background: #fdfdfd;
- font-size: 0.9em;
-}
-
-table.footnote + table.footnote {
- margin-top: -15px;
- border-top: none;
-}
-
-table.field-list th {
- padding: 0 0.8em 0 0;
-}
-
-table.field-list td {
- padding: 0;
-}
-
-table.footnote td.label {
- width: 0px;
- padding: 0.3em 0 0.3em 0.5em;
-}
-
-table.footnote td {
- padding: 0.3em 0.5em;
-}
-
-dl {
- margin: 0;
- padding: 0;
-}
-
-dl dd {
- margin-left: 30px;
-}
-
-blockquote {
- margin: 0 0 0 30px;
- padding: 0;
-}
-
-ul, ol {
- margin: 10px 0 10px 30px;
- padding: 0;
-}
-
-pre {
- background: #eee;
- padding: 7px 30px;
- margin: 15px -30px;
- line-height: 1.3em;
-}
-
-dl pre, blockquote pre, li pre {
- margin-left: -60px;
- padding-left: 60px;
-}
-
-dl dl pre {
- margin-left: -90px;
- padding-left: 90px;
-}
-
-tt {
- background-color: #ecf0f3;
- color: #222;
- /* padding: 1px 2px; */
-}
-
-tt.xref, a tt {
- background-color: #FBFBFB;
- border-bottom: 1px solid white;
-}
-
-a.reference {
- text-decoration: none;
- border-bottom: 1px dotted #004B6B;
-}
-
-a.reference:hover {
- border-bottom: 1px solid #6D4100;
-}
-
-a.footnote-reference {
- text-decoration: none;
- font-size: 0.7em;
- vertical-align: top;
- border-bottom: 1px dotted #004B6B;
-}
-
-a.footnote-reference:hover {
- border-bottom: 1px solid #6D4100;
-}
-
-a:hover tt {
- background: #EEE;
-}
-
-
-@media screen and (max-width: 870px) {
-
- div.sphinxsidebar {
- display: none;
- }
-
- div.document {
- width: 100%;
-
- }
-
- div.documentwrapper {
- margin-left: 0;
- margin-top: 0;
- margin-right: 0;
- margin-bottom: 0;
- }
-
- div.bodywrapper {
- margin-top: 0;
- margin-right: 0;
- margin-bottom: 0;
- margin-left: 0;
- }
-
- ul {
- margin-left: 0;
- }
-
- .document {
- width: auto;
- }
-
- .footer {
- width: auto;
- }
-
- .bodywrapper {
- margin: 0;
- }
-
- .footer {
- width: auto;
- }
-
- .github {
- display: none;
- }
-
-
-
-}
-
-
-
-@media screen and (max-width: 875px) {
-
- body {
- margin: 0;
- padding: 20px 30px;
- }
-
- div.documentwrapper {
- float: none;
- background: white;
- }
-
- div.sphinxsidebar {
- display: block;
- float: none;
- width: 102.5%;
- margin: 50px -30px -20px -30px;
- padding: 10px 20px;
- background: #333;
- color: white;
- }
-
- div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
- div.sphinxsidebar h3 a {
- color: white;
- }
-
- div.sphinxsidebar a {
- color: #aaa;
- }
-
- div.sphinxsidebar p.logo {
- display: none;
- }
-
- div.document {
- width: 100%;
- margin: 0;
- }
-
- div.related {
- display: block;
- margin: 0;
- padding: 10px 0 20px 0;
- }
-
- div.related ul,
- div.related ul li {
- margin: 0;
- padding: 0;
- }
-
- div.footer {
- display: none;
- }
-
- div.bodywrapper {
- margin: 0;
- }
-
- div.body {
- min-height: 0;
- padding: 0;
- }
-
- .rtd_doc_footer {
- display: none;
- }
-
- .document {
- width: auto;
- }
-
- .footer {
- width: auto;
- }
-
- .footer {
- width: auto;
- }
-
- .github {
- display: none;
- }
-}
-
-
-/* misc. */
-
-.revsys-inline {
- display: none!important;
-}
\ No newline at end of file
diff --git a/docs/_themes/kr/theme.conf b/docs/_themes/kr/theme.conf
deleted file mode 100644
index 07698f6f..00000000
--- a/docs/_themes/kr/theme.conf
+++ /dev/null
@@ -1,7 +0,0 @@
-[theme]
-inherit = basic
-stylesheet = flasky.css
-pygments_style = flask_theme_support.FlaskyStyle
-
-[options]
-touch_icon =
diff --git a/docs/_themes/kr_small/layout.html b/docs/_themes/kr_small/layout.html
deleted file mode 100644
index aa1716aa..00000000
--- a/docs/_themes/kr_small/layout.html
+++ /dev/null
@@ -1,22 +0,0 @@
-{% extends "basic/layout.html" %}
-{% block header %}
- {{ super() }}
- {% if pagename == 'index' %}
-
- {% endif %}
-{% endblock %}
-{% block footer %}
- {% if pagename == 'index' %}
-
- {% endif %}
-{% endblock %}
-{# do not display relbars #}
-{% block relbar1 %}{% endblock %}
-{% block relbar2 %}
- {% if theme_github_fork %}
-
- {% endif %}
-{% endblock %}
-{% block sidebar1 %}{% endblock %}
-{% block sidebar2 %}{% endblock %}
diff --git a/docs/_themes/kr_small/static/flasky.css_t b/docs/_themes/kr_small/static/flasky.css_t
deleted file mode 100644
index 71961a27..00000000
--- a/docs/_themes/kr_small/static/flasky.css_t
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * flasky.css_t
- * ~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- flasky theme based on nature theme.
- *
- * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
- font-family: 'Georgia', serif;
- font-size: 17px;
- color: #000;
- background: white;
- margin: 0;
- padding: 0;
-}
-
-div.documentwrapper {
- float: left;
- width: 100%;
-}
-
-div.bodywrapper {
- margin: 40px auto 0 auto;
- width: 700px;
-}
-
-hr {
- border: 1px solid #B1B4B6;
-}
-
-div.body {
- background-color: #ffffff;
- color: #3E4349;
- padding: 0 30px 30px 30px;
-}
-
-img.floatingflask {
- padding: 0 0 10px 10px;
- float: right;
-}
-
-div.footer {
- text-align: right;
- color: #888;
- padding: 10px;
- font-size: 14px;
- width: 650px;
- margin: 0 auto 40px auto;
-}
-
-div.footer a {
- color: #888;
- text-decoration: underline;
-}
-
-div.related {
- line-height: 32px;
- color: #888;
-}
-
-div.related ul {
- padding: 0 0 0 10px;
-}
-
-div.related a {
- color: #444;
-}
-
-/* -- body styles ----------------------------------------------------------- */
-
-a {
- color: #004B6B;
- text-decoration: underline;
-}
-
-a:hover {
- color: #6D4100;
- text-decoration: underline;
-}
-
-div.body {
- padding-bottom: 40px; /* saved for footer */
-}
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
- font-family: 'Garamond', 'Georgia', serif;
- font-weight: normal;
- margin: 30px 0px 10px 0px;
- padding: 0;
-}
-
-{% if theme_index_logo %}
-div.indexwrapper h1 {
- text-indent: -999999px;
- background: url({{ theme_index_logo }}) no-repeat center center;
- height: {{ theme_index_logo_height }};
-}
-{% endif %}
-
-div.body h2 { font-size: 180%; }
-div.body h3 { font-size: 150%; }
-div.body h4 { font-size: 130%; }
-div.body h5 { font-size: 100%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
- color: white;
- padding: 0 4px;
- text-decoration: none;
-}
-
-a.headerlink:hover {
- color: #444;
- background: #eaeaea;
-}
-
-div.body p, div.body dd, div.body li {
- line-height: 1.4em;
-}
-
-div.admonition {
- background: #fafafa;
- margin: 20px -30px;
- padding: 10px 30px;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-
-div.admonition p.admonition-title {
- font-family: 'Garamond', 'Georgia', serif;
- font-weight: normal;
- font-size: 24px;
- margin: 0 0 10px 0;
- padding: 0;
- line-height: 1;
-}
-
-div.admonition p.last {
- margin-bottom: 0;
-}
-
-div.highlight{
- background-color: white;
-}
-
-dt:target, .highlight {
- background: #FAF3E8;
-}
-
-div.note {
- background-color: #eee;
- border: 1px solid #ccc;
-}
-
-div.seealso {
- background-color: #ffc;
- border: 1px solid #ff6;
-}
-
-div.topic {
- background-color: #eee;
-}
-
-div.warning {
- background-color: #ffe4e4;
- border: 1px solid #f66;
-}
-
-p.admonition-title {
- display: inline;
-}
-
-p.admonition-title:after {
- content: ":";
-}
-
-pre, tt {
- font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
- font-size: 0.85em;
-}
-
-img.screenshot {
-}
-
-tt.descname, tt.descclassname {
- font-size: 0.95em;
-}
-
-tt.descname {
- padding-right: 0.08em;
-}
-
-img.screenshot {
- -moz-box-shadow: 2px 2px 4px #eee;
- -webkit-box-shadow: 2px 2px 4px #eee;
- box-shadow: 2px 2px 4px #eee;
-}
-
-table.docutils {
- border: 1px solid #888;
- -moz-box-shadow: 2px 2px 4px #eee;
- -webkit-box-shadow: 2px 2px 4px #eee;
- box-shadow: 2px 2px 4px #eee;
-}
-
-table.docutils td, table.docutils th {
- border: 1px solid #888;
- padding: 0.25em 0.7em;
-}
-
-table.field-list, table.footnote {
- border: none;
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-
-table.footnote {
- margin: 15px 0;
- width: 100%;
- border: 1px solid #eee;
-}
-
-table.field-list th {
- padding: 0 0.8em 0 0;
-}
-
-table.field-list td {
- padding: 0;
-}
-
-table.footnote td {
- padding: 0.5em;
-}
-
-dl {
- margin: 0;
- padding: 0;
-}
-
-dl dd {
- margin-left: 30px;
-}
-
-pre {
- padding: 0;
- margin: 15px -30px;
- padding: 8px;
- line-height: 1.3em;
- padding: 7px 30px;
- background: #eee;
- border-radius: 2px;
- -moz-border-radius: 2px;
- -webkit-border-radius: 2px;
-}
-
-dl pre {
- margin-left: -60px;
- padding-left: 60px;
-}
-
-tt {
- background-color: #ecf0f3;
- color: #222;
- /* padding: 1px 2px; */
-}
-
-tt.xref, a tt {
- background-color: #FBFBFB;
-}
-
-a:hover tt {
- background: #EEE;
-}
diff --git a/docs/_themes/kr_small/theme.conf b/docs/_themes/kr_small/theme.conf
deleted file mode 100644
index 542b4625..00000000
--- a/docs/_themes/kr_small/theme.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-[theme]
-inherit = basic
-stylesheet = flasky.css
-nosidebar = true
-pygments_style = flask_theme_support.FlaskyStyle
-
-[options]
-index_logo = ''
-index_logo_height = 120px
-github_fork = ''
From 5c19d3e07b68145c7af9ad70dcaa2e48dd06b0b5 Mon Sep 17 00:00:00 2001
From: Matt Jordan
Date: Sat, 5 Dec 2015 09:47:00 -0600
Subject: [PATCH 009/127] requests/auth: Handle an empty 'qop' attribute in a
Authenticate challenge
Some malfunctioning HTTP servers may return a qop directive with no token, as
opposed to correctly omitting the qop directive completely. For example:
header: WWW-Authenticate: Digest realm="foobar_api_auth", qop="",
nonce="a12059eaaad0b86ece8f62f04cbafed6", algorithm="MD5",
stale="false"
Prior to this patch, requests would respond with a 'None' Authorization header.
While the server is certainly incorrect, this patch updates requests to be
more tolerant to this kind of shenaniganry. If we receive an empty string for
the value of the qop attribute, we instead treat that as if the qop attribute
was simply not provided.
Closes #2916
---
requests/auth.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requests/auth.py b/requests/auth.py
index 8c4e847f..2af55fb5 100644
--- a/requests/auth.py
+++ b/requests/auth.py
@@ -136,7 +136,7 @@ class HTTPDigestAuth(AuthBase):
if _algorithm == 'MD5-SESS':
HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce))
- if qop is None:
+ if not qop:
respdig = KD(HA1, "%s:%s" % (nonce, HA2))
elif qop == 'auth' or 'auth' in qop.split(','):
noncebit = "%s:%s:%s:%s:%s" % (
From 3ad66349ea651d13459d7cd2db1613c1b91b40e1 Mon Sep 17 00:00:00 2001
From: Brian Samek
Date: Wed, 9 Dec 2015 11:21:21 -0500
Subject: [PATCH 010/127] Add hint to :param verify.
It is not clear that :param verify defaults to True. The way the verify
portion of the docstring is written it looks like it defaults to False, and
you have to pass in True if you'd like the SSL cert to be verified, but the
opposite is the case.
---
requests/sessions.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requests/sessions.py b/requests/sessions.py
index 6d607459..a1d19686 100644
--- a/requests/sessions.py
+++ b/requests/sessions.py
@@ -434,7 +434,7 @@ class Session(SessionRedirectMixin):
:param stream: (optional) whether to immediately download the response
content. Defaults to ``False``.
:param verify: (optional) if ``True``, the SSL cert will be verified.
- A CA_BUNDLE path can also be provided.
+ A CA_BUNDLE path can also be provided. Defaults to ``True``.
:param cert: (optional) if String, path to ssl client cert file (.pem).
If Tuple, ('cert', 'key') pair.
"""
From 9a20afd6b5140da4b9f187a3c0c6ea7010baeee9 Mon Sep 17 00:00:00 2001
From: Brian Samek
Date: Fri, 11 Dec 2015 13:32:09 -0500
Subject: [PATCH 011/127] Refactor default params
Specified the default argument for params that have a default in the docstring
so that the default is easier to see from the code. Modified the docstring in
api.py to match the docstring in sessions.py.
---
AUTHORS.rst | 1 +
requests/api.py | 2 +-
requests/sessions.py | 6 +++---
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/AUTHORS.rst b/AUTHORS.rst
index d4bfaf96..7d0ac65a 100644
--- a/AUTHORS.rst
+++ b/AUTHORS.rst
@@ -162,3 +162,4 @@ Patches and Suggestions
- Smiley Barry (`@smiley `_)
- Shagun Sodhani (`@shagunsodhani `_)
- Robin Linderborg (`@vienno `_)
+- Brian Samek(`@bsamek ` object
diff --git a/requests/sessions.py b/requests/sessions.py
index a1d19686..79d52ee9 100644
--- a/requests/sessions.py
+++ b/requests/sessions.py
@@ -400,8 +400,8 @@ class Session(SessionRedirectMixin):
allow_redirects=True,
proxies=None,
hooks=None,
- stream=None,
- verify=None,
+ stream=False,
+ verify=True,
cert=None,
json=None):
"""Constructs a :class:`Request `, prepares it and sends it.
@@ -433,7 +433,7 @@ class Session(SessionRedirectMixin):
hostname to the URL of the proxy.
:param stream: (optional) whether to immediately download the response
content. Defaults to ``False``.
- :param verify: (optional) if ``True``, the SSL cert will be verified.
+ :param verify: (optional) whether the SSL cert will be verified.
A CA_BUNDLE path can also be provided. Defaults to ``True``.
:param cert: (optional) if String, path to ssl client cert file (.pem).
If Tuple, ('cert', 'key') pair.
From 9aca57d4bf7fe7906dd7b6d9e7c4836b6f38735d Mon Sep 17 00:00:00 2001
From: Brian Samek
Date: Fri, 11 Dec 2015 16:47:47 -0500
Subject: [PATCH 012/127] Revert changes to params
This reverts commit 9a20afd6b5140da4b9f187a3c0c6ea7010baeee9.
Docstring changes were desirable, but changes to params were not.
---
requests/sessions.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/requests/sessions.py b/requests/sessions.py
index 79d52ee9..9eaa36ae 100644
--- a/requests/sessions.py
+++ b/requests/sessions.py
@@ -400,8 +400,8 @@ class Session(SessionRedirectMixin):
allow_redirects=True,
proxies=None,
hooks=None,
- stream=False,
- verify=True,
+ stream=None,
+ verify=None,
cert=None,
json=None):
"""Constructs a :class:`Request `, prepares it and sends it.
From 3c0f0b9ab510d7ac6b556088d29fcc050c995357 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Tue, 15 Dec 2015 14:47:20 +0000
Subject: [PATCH 013/127] Update urllib3 to 1.13
---
requests/packages/urllib3/__init__.py | 32 +++++++++--
requests/packages/urllib3/_collections.py | 7 +--
requests/packages/urllib3/connection.py | 28 +++++-----
requests/packages/urllib3/connectionpool.py | 34 ++++++------
.../packages/urllib3/contrib/appengine.py | 23 ++++----
requests/packages/urllib3/contrib/ntlmpool.py | 1 +
.../packages/urllib3/contrib/pyopenssl.py | 35 ++++++------
requests/packages/urllib3/exceptions.py | 14 +++--
requests/packages/urllib3/fields.py | 1 +
requests/packages/urllib3/filepost.py | 1 +
.../packages/urllib3/packages/__init__.py | 1 +
.../packages/ssl_match_hostname/.gitignore | 1 +
requests/packages/urllib3/poolmanager.py | 3 +-
requests/packages/urllib3/request.py | 4 +-
requests/packages/urllib3/response.py | 53 ++++++++++++++-----
requests/packages/urllib3/util/__init__.py | 20 +++++++
requests/packages/urllib3/util/connection.py | 1 +
requests/packages/urllib3/util/request.py | 1 +
requests/packages/urllib3/util/response.py | 3 +-
requests/packages/urllib3/util/retry.py | 7 +--
requests/packages/urllib3/util/ssl_.py | 39 ++++++++++++--
requests/packages/urllib3/util/timeout.py | 8 +--
requests/packages/urllib3/util/url.py | 5 +-
23 files changed, 228 insertions(+), 94 deletions(-)
create mode 100644 requests/packages/urllib3/packages/ssl_match_hostname/.gitignore
diff --git a/requests/packages/urllib3/__init__.py b/requests/packages/urllib3/__init__.py
index 86bb71d2..43c88b14 100644
--- a/requests/packages/urllib3/__init__.py
+++ b/requests/packages/urllib3/__init__.py
@@ -2,10 +2,8 @@
urllib3 - Thread-safe connection pooling and re-using.
"""
-__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
-__license__ = 'MIT'
-__version__ = '1.12'
-
+from __future__ import absolute_import
+import warnings
from .connectionpool import (
HTTPConnectionPool,
@@ -32,8 +30,30 @@ except ImportError:
def emit(self, record):
pass
+__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
+__license__ = 'MIT'
+__version__ = '1.13'
+
+__all__ = (
+ 'HTTPConnectionPool',
+ 'HTTPSConnectionPool',
+ 'PoolManager',
+ 'ProxyManager',
+ 'HTTPResponse',
+ 'Retry',
+ 'Timeout',
+ 'add_stderr_logger',
+ 'connection_from_url',
+ 'disable_warnings',
+ 'encode_multipart_formdata',
+ 'get_host',
+ 'make_headers',
+ 'proxy_from_url',
+)
+
logging.getLogger(__name__).addHandler(NullHandler())
+
def add_stderr_logger(level=logging.DEBUG):
"""
Helper for quickly adding a StreamHandler to the logger. Useful for
@@ -55,7 +75,6 @@ def add_stderr_logger(level=logging.DEBUG):
del NullHandler
-import warnings
# SecurityWarning's always go off by default.
warnings.simplefilter('always', exceptions.SecurityWarning, append=True)
# SubjectAltNameWarning's should go off once per host
@@ -63,6 +82,9 @@ warnings.simplefilter('default', exceptions.SubjectAltNameWarning)
# InsecurePlatformWarning's don't vary between requests, so we keep it default.
warnings.simplefilter('default', exceptions.InsecurePlatformWarning,
append=True)
+# SNIMissingWarnings should go off only once.
+warnings.simplefilter('default', exceptions.SNIMissingWarning)
+
def disable_warnings(category=exceptions.HTTPWarning):
"""
diff --git a/requests/packages/urllib3/_collections.py b/requests/packages/urllib3/_collections.py
index b68b9a59..67f3ce99 100644
--- a/requests/packages/urllib3/_collections.py
+++ b/requests/packages/urllib3/_collections.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from collections import Mapping, MutableMapping
try:
from threading import RLock
@@ -167,7 +168,7 @@ class HTTPHeaderDict(MutableMapping):
def __ne__(self, other):
return not self.__eq__(other)
- if not PY3: # Python 2
+ if not PY3: # Python 2
iterkeys = MutableMapping.iterkeys
itervalues = MutableMapping.itervalues
@@ -234,7 +235,7 @@ class HTTPHeaderDict(MutableMapping):
"""
if len(args) > 1:
raise TypeError("extend() takes at most 1 positional "
- "arguments ({} given)".format(len(args)))
+ "arguments ({0} given)".format(len(args)))
other = args[0] if len(args) >= 1 else ()
if isinstance(other, HTTPHeaderDict):
@@ -304,7 +305,7 @@ class HTTPHeaderDict(MutableMapping):
return list(self.iteritems())
@classmethod
- def from_httplib(cls, message): # Python 2
+ def from_httplib(cls, message): # Python 2
"""Read headers from a Python 2 httplib message object."""
# python2.7 does not expose a proper API for exporting multiheaders
# efficiently. This function re-reads raw lines from the message
diff --git a/requests/packages/urllib3/connection.py b/requests/packages/urllib3/connection.py
index 3eab1e28..bb7f3e55 100644
--- a/requests/packages/urllib3/connection.py
+++ b/requests/packages/urllib3/connection.py
@@ -1,4 +1,6 @@
+from __future__ import absolute_import
import datetime
+import os
import sys
import socket
from socket import error as SocketError, timeout as SocketTimeout
@@ -6,18 +8,13 @@ import warnings
from .packages import six
try: # Python 3
- from http.client import HTTPConnection as _HTTPConnection, HTTPException
+ from http.client import HTTPConnection as _HTTPConnection
+ from http.client import HTTPException # noqa: unused in this module
except ImportError:
- from httplib import HTTPConnection as _HTTPConnection, HTTPException
-
-
-class DummyConnection(object):
- "Used to detect a failed ConnectionCls import."
- pass
-
+ from httplib import HTTPConnection as _HTTPConnection
+ from httplib import HTTPException # noqa: unused in this module
try: # Compiled with SSL?
- HTTPSConnection = DummyConnection
import ssl
BaseSSLError = ssl.SSLError
except (ImportError, AttributeError): # Platform-specific: No SSL.
@@ -61,6 +58,11 @@ port_by_scheme = {
RECENT_DATE = datetime.date(2014, 1, 1)
+class DummyConnection(object):
+ """Used to detect a failed ConnectionCls import."""
+ pass
+
+
class HTTPConnection(_HTTPConnection, object):
"""
Based on httplib.HTTPConnection but provides an extra constructor
@@ -205,10 +207,10 @@ class VerifiedHTTPSConnection(HTTPSConnection):
self.key_file = key_file
self.cert_file = cert_file
self.cert_reqs = cert_reqs
- self.ca_certs = ca_certs
- self.ca_cert_dir = ca_cert_dir
self.assert_hostname = assert_hostname
self.assert_fingerprint = assert_fingerprint
+ self.ca_certs = ca_certs and os.path.expanduser(ca_certs)
+ self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir)
def connect(self):
# Add certificate verification
@@ -265,8 +267,8 @@ class VerifiedHTTPSConnection(HTTPSConnection):
)
match_hostname(cert, self.assert_hostname or hostname)
- self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED
- or self.assert_fingerprint is not None)
+ self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or
+ self.assert_fingerprint is not None)
if ssl:
diff --git a/requests/packages/urllib3/connectionpool.py b/requests/packages/urllib3/connectionpool.py
index b38ac68d..995b4167 100644
--- a/requests/packages/urllib3/connectionpool.py
+++ b/requests/packages/urllib3/connectionpool.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import errno
import logging
import sys
@@ -10,7 +11,8 @@ try: # Python 3
from queue import LifoQueue, Empty, Full
except ImportError:
from Queue import LifoQueue, Empty, Full
- import Queue as _ # Platform-specific: Windows
+ # Queue is imported for side effects on MS Windows
+ import Queue as _unused_module_Queue # noqa: unused
from .exceptions import (
@@ -22,7 +24,6 @@ from .exceptions import (
LocationValueError,
MaxRetryError,
ProxyError,
- ConnectTimeoutError,
ReadTimeoutError,
SSLError,
TimeoutError,
@@ -35,7 +36,7 @@ from .connection import (
port_by_scheme,
DummyConnection,
HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection,
- HTTPException, BaseSSLError, ConnectionError
+ HTTPException, BaseSSLError,
)
from .request import RequestMethods
from .response import HTTPResponse
@@ -54,7 +55,7 @@ log = logging.getLogger(__name__)
_Default = object()
-## Pool objects
+# Pool objects
class ConnectionPool(object):
"""
Base class for all connection pools, such as
@@ -68,8 +69,7 @@ class ConnectionPool(object):
if not host:
raise LocationValueError("No host specified.")
- # httplib doesn't like it when we include brackets in ipv6 addresses
- self.host = host.strip('[]')
+ self.host = host
self.port = port
def __str__(self):
@@ -645,22 +645,24 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
return response
log.info("Redirecting %s -> %s" % (url, redirect_location))
- return self.urlopen(method, redirect_location, body, headers,
- retries=retries, redirect=redirect,
- assert_same_host=assert_same_host,
- timeout=timeout, pool_timeout=pool_timeout,
- release_conn=release_conn, **response_kw)
+ return self.urlopen(
+ method, redirect_location, body, headers,
+ retries=retries, redirect=redirect,
+ assert_same_host=assert_same_host,
+ timeout=timeout, pool_timeout=pool_timeout,
+ release_conn=release_conn, **response_kw)
# Check if we should retry the HTTP response.
if retries.is_forced_retry(method, status_code=response.status):
retries = retries.increment(method, url, response=response, _pool=self)
retries.sleep()
log.info("Forced retry: %s" % url)
- return self.urlopen(method, url, body, headers,
- retries=retries, redirect=redirect,
- assert_same_host=assert_same_host,
- timeout=timeout, pool_timeout=pool_timeout,
- release_conn=release_conn, **response_kw)
+ return self.urlopen(
+ method, url, body, headers,
+ retries=retries, redirect=redirect,
+ assert_same_host=assert_same_host,
+ timeout=timeout, pool_timeout=pool_timeout,
+ release_conn=release_conn, **response_kw)
return response
diff --git a/requests/packages/urllib3/contrib/appengine.py b/requests/packages/urllib3/contrib/appengine.py
index ed9d8b81..884cdb22 100644
--- a/requests/packages/urllib3/contrib/appengine.py
+++ b/requests/packages/urllib3/contrib/appengine.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import logging
import os
import warnings
@@ -60,7 +61,7 @@ class AppEngineManager(RequestMethods):
raise AppEnginePlatformError(
"URLFetch is not available in this environment.")
- if is_prod_appengine_v2():
+ if is_prod_appengine_mvms():
raise AppEnginePlatformError(
"Use normal urllib3.PoolManager instead of AppEngineManager"
"on Managed VMs, as using URLFetch is not necessary in "
@@ -108,14 +109,14 @@ class AppEngineManager(RequestMethods):
raise TimeoutError(self, e)
except urlfetch.InvalidURLError as e:
- if 'too large' in e.message:
+ if 'too large' in str(e):
raise AppEnginePlatformError(
"URLFetch request too large, URLFetch only "
"supports requests up to 10mb in size.", e)
raise ProtocolError(e)
except urlfetch.DownloadError as e:
- if 'Too many redirects' in e.message:
+ if 'Too many redirects' in str(e):
raise MaxRetryError(self, url, reason=e)
raise ProtocolError(e)
@@ -155,7 +156,7 @@ class AppEngineManager(RequestMethods):
def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw):
- if is_prod_appengine_v1():
+ if is_prod_appengine():
# Production GAE handles deflate encoding automatically, but does
# not remove the encoding header.
content_encoding = urlfetch_resp.headers.get('content-encoding')
@@ -176,7 +177,7 @@ class AppEngineManager(RequestMethods):
if timeout is Timeout.DEFAULT_TIMEOUT:
return 5 # 5s is the default timeout for URLFetch.
if isinstance(timeout, Timeout):
- if not timeout.read is timeout.connect:
+ if timeout.read is not timeout.connect:
warnings.warn(
"URLFetch does not support granular timeout settings, "
"reverting to total timeout.", AppEnginePlatformWarning)
@@ -199,12 +200,12 @@ class AppEngineManager(RequestMethods):
def is_appengine():
return (is_local_appengine() or
- is_prod_appengine_v1() or
- is_prod_appengine_v2())
+ is_prod_appengine() or
+ is_prod_appengine_mvms())
def is_appengine_sandbox():
- return is_appengine() and not is_prod_appengine_v2()
+ return is_appengine() and not is_prod_appengine_mvms()
def is_local_appengine():
@@ -212,11 +213,11 @@ def is_local_appengine():
'Development/' in os.environ['SERVER_SOFTWARE'])
-def is_prod_appengine_v1():
+def is_prod_appengine():
return ('APPENGINE_RUNTIME' in os.environ and
'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
- not is_prod_appengine_v2())
+ not is_prod_appengine_mvms())
-def is_prod_appengine_v2():
+def is_prod_appengine_mvms():
return os.environ.get('GAE_VM', False) == 'true'
diff --git a/requests/packages/urllib3/contrib/ntlmpool.py b/requests/packages/urllib3/contrib/ntlmpool.py
index c6b266f5..c136a238 100644
--- a/requests/packages/urllib3/contrib/ntlmpool.py
+++ b/requests/packages/urllib3/contrib/ntlmpool.py
@@ -3,6 +3,7 @@ NTLM authenticating pool, contributed by erikcederstran
Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10
"""
+from __future__ import absolute_import
try:
from http.client import HTTPSConnection
diff --git a/requests/packages/urllib3/contrib/pyopenssl.py b/requests/packages/urllib3/contrib/pyopenssl.py
index c20ae46d..5996153a 100644
--- a/requests/packages/urllib3/contrib/pyopenssl.py
+++ b/requests/packages/urllib3/contrib/pyopenssl.py
@@ -43,6 +43,7 @@ Module Variables
.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit)
'''
+from __future__ import absolute_import
try:
from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
@@ -53,7 +54,7 @@ except SyntaxError as e:
import OpenSSL.SSL
from pyasn1.codec.der import decoder as der_decoder
from pyasn1.type import univ, constraint
-from socket import _fileobject, timeout
+from socket import _fileobject, timeout, error as SocketError
import ssl
import select
@@ -71,6 +72,12 @@ _openssl_versions = {
ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD,
}
+if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'):
+ _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD
+
+if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'):
+ _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD
+
try:
_openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD})
except AttributeError:
@@ -79,8 +86,8 @@ except AttributeError:
_openssl_verify = {
ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE,
ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER,
- ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER
- + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
+ ssl.CERT_REQUIRED:
+ OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT,
}
DEFAULT_SSL_CIPHER_LIST = util.ssl_.DEFAULT_CIPHERS
@@ -88,12 +95,6 @@ DEFAULT_SSL_CIPHER_LIST = util.ssl_.DEFAULT_CIPHERS
# OpenSSL will only write 16K at a time
SSL_WRITE_BLOCKSIZE = 16384
-try:
- _ = memoryview
- has_memoryview = True
-except NameError:
- has_memoryview = False
-
orig_util_HAS_SNI = util.HAS_SNI
orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket
@@ -112,7 +113,7 @@ def extract_from_urllib3():
util.HAS_SNI = orig_util_HAS_SNI
-### Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
class SubjectAltName(BaseSubjectAltName):
'''ASN.1 implementation for subjectAltNames support'''
@@ -123,7 +124,7 @@ class SubjectAltName(BaseSubjectAltName):
constraint.ValueSizeConstraint(1, 1024)
-### Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
+# Note: This is a slightly bug-fixed version of same from ndg-httpsclient.
def get_subj_alt_name(peer_cert):
# Search through extensions
dns_name = []
@@ -181,7 +182,7 @@ class WrappedSocket(object):
if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'):
return b''
else:
- raise
+ raise SocketError(e)
except OpenSSL.SSL.ZeroReturnError as e:
if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN:
return b''
@@ -212,12 +213,9 @@ class WrappedSocket(object):
continue
def sendall(self, data):
- if has_memoryview and not isinstance(data, memoryview):
- data = memoryview(data)
-
total_sent = 0
while total_sent < len(data):
- sent = self._send_until_done(data[total_sent:total_sent+SSL_WRITE_BLOCKSIZE])
+ sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
total_sent += sent
def shutdown(self):
@@ -226,7 +224,10 @@ class WrappedSocket(object):
def close(self):
if self._makefile_refs < 1:
- return self.connection.close()
+ try:
+ return self.connection.close()
+ except OpenSSL.SSL.Error:
+ return
else:
self._makefile_refs -= 1
diff --git a/requests/packages/urllib3/exceptions.py b/requests/packages/urllib3/exceptions.py
index 9607d65f..8e07eb61 100644
--- a/requests/packages/urllib3/exceptions.py
+++ b/requests/packages/urllib3/exceptions.py
@@ -1,16 +1,17 @@
+from __future__ import absolute_import
+# Base Exceptions
-## Base Exceptions
class HTTPError(Exception):
"Base exception used by this module."
pass
+
class HTTPWarning(Warning):
"Base warning used by this module."
pass
-
class PoolError(HTTPError):
"Base exception for errors caused within a pool."
def __init__(self, pool, message):
@@ -57,7 +58,7 @@ class ProtocolError(HTTPError):
ConnectionError = ProtocolError
-## Leaf Exceptions
+# Leaf Exceptions
class MaxRetryError(RequestError):
"""Raised when the maximum number of retries is exceeded.
@@ -112,10 +113,12 @@ class ConnectTimeoutError(TimeoutError):
"Raised when a socket timeout occurs while connecting to a server"
pass
+
class NewConnectionError(ConnectTimeoutError, PoolError):
"Raised when we fail to establish a new connection. Usually ECONNREFUSED."
pass
+
class EmptyPoolError(PoolError):
"Raised when a pool runs out of connections and no more are allowed."
pass
@@ -172,6 +175,11 @@ class InsecurePlatformWarning(SecurityWarning):
pass
+class SNIMissingWarning(HTTPWarning):
+ "Warned when making a HTTPS request without SNI available."
+ pass
+
+
class ResponseNotChunked(ProtocolError, ValueError):
"Response needs to be chunked in order to read it as chunks."
pass
diff --git a/requests/packages/urllib3/fields.py b/requests/packages/urllib3/fields.py
index c853f8d5..c7d48113 100644
--- a/requests/packages/urllib3/fields.py
+++ b/requests/packages/urllib3/fields.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import email.utils
import mimetypes
diff --git a/requests/packages/urllib3/filepost.py b/requests/packages/urllib3/filepost.py
index 0fbf488d..97a2843c 100644
--- a/requests/packages/urllib3/filepost.py
+++ b/requests/packages/urllib3/filepost.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import codecs
from uuid import uuid4
diff --git a/requests/packages/urllib3/packages/__init__.py b/requests/packages/urllib3/packages/__init__.py
index 37e83515..170e974c 100644
--- a/requests/packages/urllib3/packages/__init__.py
+++ b/requests/packages/urllib3/packages/__init__.py
@@ -2,3 +2,4 @@ from __future__ import absolute_import
from . import ssl_match_hostname
+__all__ = ('ssl_match_hostname', )
diff --git a/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore b/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore
new file mode 100644
index 00000000..0a764a4d
--- /dev/null
+++ b/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore
@@ -0,0 +1 @@
+env
diff --git a/requests/packages/urllib3/poolmanager.py b/requests/packages/urllib3/poolmanager.py
index 76b6a129..f13e673d 100644
--- a/requests/packages/urllib3/poolmanager.py
+++ b/requests/packages/urllib3/poolmanager.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import logging
try: # Python 3
@@ -25,7 +26,7 @@ pool_classes_by_scheme = {
log = logging.getLogger(__name__)
SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs',
- 'ssl_version')
+ 'ssl_version', 'ca_cert_dir')
class PoolManager(RequestMethods):
diff --git a/requests/packages/urllib3/request.py b/requests/packages/urllib3/request.py
index a1a12bc5..d5aa62d8 100644
--- a/requests/packages/urllib3/request.py
+++ b/requests/packages/urllib3/request.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
try:
from urllib.parse import urlencode
except ImportError:
@@ -133,7 +134,8 @@ class RequestMethods(object):
if fields:
if 'body' in urlopen_kw:
- raise TypeError('request got values for both \'fields\' and \'body\', can only specify one.')
+ raise TypeError(
+ "request got values for both 'fields' and 'body', can only specify one.")
if encode_multipart:
body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary)
diff --git a/requests/packages/urllib3/response.py b/requests/packages/urllib3/response.py
index 788eb6ca..8f2a1b5c 100644
--- a/requests/packages/urllib3/response.py
+++ b/requests/packages/urllib3/response.py
@@ -1,7 +1,9 @@
+from __future__ import absolute_import
from contextlib import contextmanager
import zlib
import io
from socket import timeout as SocketTimeout
+from socket import error as SocketError
from ._collections import HTTPHeaderDict
from .exceptions import (
@@ -130,8 +132,8 @@ class HTTPResponse(io.IOBase):
if "chunked" in encodings:
self.chunked = True
- # We certainly don't want to preload content when the response is chunked.
- if not self.chunked and preload_content and not self._body:
+ # If requested, preload the body.
+ if preload_content and not self._body:
self._body = self.read(decode_content=decode_content)
def get_redirect_location(self):
@@ -194,12 +196,22 @@ class HTTPResponse(io.IOBase):
"Received response with content-encoding: %s, but "
"failed to decode it." % content_encoding, e)
- if flush_decoder and decode_content and self._decoder:
- buf = self._decoder.decompress(binary_type())
- data += buf + self._decoder.flush()
+ if flush_decoder and decode_content:
+ data += self._flush_decoder()
return data
+ def _flush_decoder(self):
+ """
+ Flushes the decoder. Should only be called if the decoder is actually
+ being used.
+ """
+ if self._decoder:
+ buf = self._decoder.decompress(b'')
+ return buf + self._decoder.flush()
+
+ return b''
+
@contextmanager
def _error_catcher(self):
"""
@@ -227,15 +239,22 @@ class HTTPResponse(io.IOBase):
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
- except HTTPException as e:
+ except (HTTPException, SocketError) as e:
# This includes IncompleteRead.
raise ProtocolError('Connection broken: %r' % e, e)
+
except Exception:
# The response may not be closed but we're not going to use it anymore
# so close it now to ensure that the connection is released back to the pool.
if self._original_response and not self._original_response.isclosed():
self._original_response.close()
+ # Closing the response may not actually be sufficient to close
+ # everything, so if we have a hold of the connection close that
+ # too.
+ if self._connection is not None:
+ self._connection.close()
+
raise
finally:
if self._original_response and self._original_response.isclosed():
@@ -301,7 +320,6 @@ class HTTPResponse(io.IOBase):
return data
-
def stream(self, amt=2**16, decode_content=None):
"""
A generator wrapper for the read() method. A call will block until
@@ -340,9 +358,9 @@ class HTTPResponse(io.IOBase):
headers = r.msg
if not isinstance(headers, HTTPHeaderDict):
- if PY3: # Python 3
+ if PY3: # Python 3
headers = HTTPHeaderDict(headers.items())
- else: # Python 2
+ else: # Python 2
headers = HTTPHeaderDict.from_httplib(headers)
# HTTPResponse objects in Python 3 don't have a .strict attribute
@@ -454,7 +472,8 @@ class HTTPResponse(io.IOBase):
self._init_decoder()
# FIXME: Rewrite this method and make it a class with a better structured logic.
if not self.chunked:
- raise ResponseNotChunked("Response is not chunked. "
+ raise ResponseNotChunked(
+ "Response is not chunked. "
"Header 'transfer-encoding: chunked' is missing.")
# Don't bother reading the body of a HEAD request.
@@ -468,8 +487,18 @@ class HTTPResponse(io.IOBase):
if self.chunk_left == 0:
break
chunk = self._handle_chunk(amt)
- yield self._decode(chunk, decode_content=decode_content,
- flush_decoder=True)
+ decoded = self._decode(chunk, decode_content=decode_content,
+ flush_decoder=False)
+ if decoded:
+ yield decoded
+
+ if decode_content:
+ # On CPython and PyPy, we should never need to flush the
+ # decoder. However, on Jython we *might* need to, so
+ # lets defensively do it anyway.
+ decoded = self._flush_decoder()
+ if decoded: # Platform-specific: Jython.
+ yield decoded
# Chunk content ends with \r\n: discard it.
while True:
diff --git a/requests/packages/urllib3/util/__init__.py b/requests/packages/urllib3/util/__init__.py
index 8becc814..c6c6243c 100644
--- a/requests/packages/urllib3/util/__init__.py
+++ b/requests/packages/urllib3/util/__init__.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
# For backwards compatibility, provide imports that used to be here.
from .connection import is_connection_dropped
from .request import make_headers
@@ -22,3 +23,22 @@ from .url import (
split_first,
Url,
)
+
+__all__ = (
+ 'HAS_SNI',
+ 'SSLContext',
+ 'Retry',
+ 'Timeout',
+ 'Url',
+ 'assert_fingerprint',
+ 'current_time',
+ 'is_connection_dropped',
+ 'is_fp_closed',
+ 'get_host',
+ 'parse_url',
+ 'make_headers',
+ 'resolve_cert_reqs',
+ 'resolve_ssl_version',
+ 'split_first',
+ 'ssl_wrap_socket',
+)
diff --git a/requests/packages/urllib3/util/connection.py b/requests/packages/urllib3/util/connection.py
index 4f2f0f18..01a4812f 100644
--- a/requests/packages/urllib3/util/connection.py
+++ b/requests/packages/urllib3/util/connection.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import socket
try:
from select import poll, POLLIN
diff --git a/requests/packages/urllib3/util/request.py b/requests/packages/urllib3/util/request.py
index bc64f6b1..73779315 100644
--- a/requests/packages/urllib3/util/request.py
+++ b/requests/packages/urllib3/util/request.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from base64 import b64encode
from ..packages.six import b
diff --git a/requests/packages/urllib3/util/response.py b/requests/packages/urllib3/util/response.py
index 2c1de154..bc723272 100644
--- a/requests/packages/urllib3/util/response.py
+++ b/requests/packages/urllib3/util/response.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from ..packages.six.moves import http_client as httplib
from ..exceptions import HeaderParsingError
@@ -44,7 +45,7 @@ def assert_header_parsing(headers):
# This will fail silently if we pass in the wrong kind of parameter.
# To make debugging easier add an explicit check.
if not isinstance(headers, httplib.HTTPMessage):
- raise TypeError('expected httplib.Message, got {}.'.format(
+ raise TypeError('expected httplib.Message, got {0}.'.format(
type(headers)))
defects = getattr(headers, 'defects', None)
diff --git a/requests/packages/urllib3/util/retry.py b/requests/packages/urllib3/util/retry.py
index 1fb1f23b..03a01249 100644
--- a/requests/packages/urllib3/util/retry.py
+++ b/requests/packages/urllib3/util/retry.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
import time
import logging
@@ -126,7 +127,7 @@ class Retry(object):
self.method_whitelist = method_whitelist
self.backoff_factor = backoff_factor
self.raise_on_redirect = raise_on_redirect
- self._observed_errors = _observed_errors # TODO: use .history instead?
+ self._observed_errors = _observed_errors # TODO: use .history instead?
def new(self, **kw):
params = dict(
@@ -206,7 +207,8 @@ class Retry(object):
return min(retry_counts) < 0
- def increment(self, method=None, url=None, response=None, error=None, _pool=None, _stacktrace=None):
+ def increment(self, method=None, url=None, response=None, error=None,
+ _pool=None, _stacktrace=None):
""" Return a new Retry object with incremented retry counters.
:param response: A response object, or None, if the server did not
@@ -274,7 +276,6 @@ class Retry(object):
return new_retry
-
def __repr__(self):
return ('{cls.__name__}(total={self.total}, connect={self.connect}, '
'read={self.read}, redirect={self.redirect})').format(
diff --git a/requests/packages/urllib3/util/ssl_.py b/requests/packages/urllib3/util/ssl_.py
index 47b817e3..67f83441 100644
--- a/requests/packages/urllib3/util/ssl_.py
+++ b/requests/packages/urllib3/util/ssl_.py
@@ -1,7 +1,12 @@
+from __future__ import absolute_import
+import errno
+import warnings
+import hmac
+
from binascii import hexlify, unhexlify
from hashlib import md5, sha1, sha256
-from ..exceptions import SSLError, InsecurePlatformWarning
+from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning
SSLContext = None
@@ -15,8 +20,23 @@ HASHFUNC_MAP = {
64: sha256,
}
-import errno
-import warnings
+
+def _const_compare_digest_backport(a, b):
+ """
+ Compare two digests of equal length in constant time.
+
+ The digests must be of type str/bytes.
+ Returns True if the digests match, and False otherwise.
+ """
+ result = abs(len(a) - len(b))
+ for l, r in zip(bytearray(a), bytearray(b)):
+ result |= l ^ r
+ return result == 0
+
+
+_const_compare_digest = getattr(hmac, 'compare_digest',
+ _const_compare_digest_backport)
+
try: # Test for SSL features
import ssl
@@ -134,7 +154,7 @@ def assert_fingerprint(cert, fingerprint):
cert_digest = hashfunc(cert).digest()
- if cert_digest != fingerprint_bytes:
+ if not _const_compare_digest(cert_digest, fingerprint_bytes):
raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".'
.format(fingerprint, hexlify(cert_digest)))
@@ -283,4 +303,15 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
context.load_cert_chain(certfile, keyfile)
if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI
return context.wrap_socket(sock, server_hostname=server_hostname)
+
+ warnings.warn(
+ 'An HTTPS request has been made, but the SNI (Subject Name '
+ 'Indication) extension to TLS is not available on this platform. '
+ 'This may cause the server to present an incorrect TLS '
+ 'certificate, which can cause validation failures. For more '
+ 'information, see '
+ 'https://urllib3.readthedocs.org/en/latest/security.html'
+ '#snimissingwarning.',
+ SNIMissingWarning
+ )
return context.wrap_socket(sock)
diff --git a/requests/packages/urllib3/util/timeout.py b/requests/packages/urllib3/util/timeout.py
index ea7027f3..ff62f476 100644
--- a/requests/packages/urllib3/util/timeout.py
+++ b/requests/packages/urllib3/util/timeout.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
# The default socket timeout, used by httplib to indicate that no timeout was
# specified by the user
from socket import _GLOBAL_DEFAULT_TIMEOUT
@@ -9,6 +10,7 @@ from ..exceptions import TimeoutStateError
# urllib3
_Default = object()
+
def current_time():
"""
Retrieve the current time. This function is mocked out in unit testing.
@@ -226,9 +228,9 @@ class Timeout(object):
has not yet been called on this object.
"""
if (self.total is not None and
- self.total is not self.DEFAULT_TIMEOUT and
- self._read is not None and
- self._read is not self.DEFAULT_TIMEOUT):
+ self.total is not self.DEFAULT_TIMEOUT and
+ self._read is not None and
+ self._read is not self.DEFAULT_TIMEOUT):
# In case the connect timeout has not yet been established.
if self._start_connect is None:
return self._read
diff --git a/requests/packages/urllib3/util/url.py b/requests/packages/urllib3/util/url.py
index e58050cd..e996204a 100644
--- a/requests/packages/urllib3/util/url.py
+++ b/requests/packages/urllib3/util/url.py
@@ -1,3 +1,4 @@
+from __future__ import absolute_import
from collections import namedtuple
from ..exceptions import LocationParseError
@@ -85,6 +86,7 @@ class Url(namedtuple('Url', url_attrs)):
def __str__(self):
return self.url
+
def split_first(s, delims):
"""
Given a string and an iterable of delimiters, split on the first found
@@ -115,7 +117,7 @@ def split_first(s, delims):
if min_idx is None or min_idx < 0:
return s, '', None
- return s[:min_idx], s[min_idx+1:], min_delim
+ return s[:min_idx], s[min_idx + 1:], min_delim
def parse_url(url):
@@ -206,6 +208,7 @@ def parse_url(url):
return Url(scheme, auth, host, port, path, query, fragment)
+
def get_host(url):
"""
Deprecated. Use :func:`.parse_url` instead.
From 2f744b501058d45c36c71391d4a185cccf62f9e1 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Tue, 15 Dec 2015 14:59:14 +0000
Subject: [PATCH 014/127] Update 2.9.0 release log.
---
HISTORY.rst | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/HISTORY.rst b/HISTORY.rst
index 7f20389e..43892ccf 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -10,6 +10,28 @@ dev (XXXX)
- The ``verify`` keyword argument now supports being passed a path to a
directory of CA certificates, not just a single-file bundle.
+- Warnings are now emitted when sending files opened in text mode.
+- Added the 511 Network Authentication Required status code to the status code
+ registry.
+
+**Bugfixes**
+
+- For file-like objects that are not seeked to the very beginning, we now
+ send the content length for the number of bytes we will actually read, rather
+ than the total size of the file, allowing partial file uploads.
+- When uploading file-like objects, if they are empty or have no obvious
+ content length we set ``Transfer-Encoding: chunked`` rather than
+ ``Content-Length: 0``.
+- We correctly receive the response in buffered mode when uploading chunked
+ bodies.
+- We now handle being passed a query string as a bytestring on Python 3, by
+ decoding it as UTF-8.
+- Sessions are now closed in a timely manner when using the function API,
+ rather than leaking and waiting for the garbage collector to clean them up.
+- Correctly handle digest auth headers with a malformed ``qop`` directive that
+ contains no token, by treating it the same as if no ``qop`` directive was
+ provided at all.
+- Minor performance improvements when removing specific cookies by name.
2.8.1 (2015-10-13)
++++++++++++++++++
From 424fe263d8d80c9e8b90fccfc5b26d5bbc239681 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Tue, 15 Dec 2015 15:20:26 +0000
Subject: [PATCH 015/127] Suggested wording from @sigmavirus24
---
HISTORY.rst | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/HISTORY.rst b/HISTORY.rst
index 43892ccf..825cd274 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -26,8 +26,9 @@ dev (XXXX)
bodies.
- We now handle being passed a query string as a bytestring on Python 3, by
decoding it as UTF-8.
-- Sessions are now closed in a timely manner when using the function API,
- rather than leaking and waiting for the garbage collector to clean them up.
+- Sessions are now closed in all cases (exceptional and not) when using the
+ functional API rather than leaking and waiting for the garbage collector to
+ clean them up.
- Correctly handle digest auth headers with a malformed ``qop`` directive that
contains no token, by treating it the same as if no ``qop`` directive was
provided at all.
From 5f7a3a74aab1625c2bb65f643197ee885e3da576 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Tue, 15 Dec 2015 15:29:27 +0000
Subject: [PATCH 016/127] v2.9.0
---
HISTORY.rst | 4 ++--
requests/__init__.py | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/HISTORY.rst b/HISTORY.rst
index 825cd274..d2bbdd91 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -3,8 +3,8 @@
Release History
---------------
-dev (XXXX)
-++++++++++
+2.9.0 (2015-12-15)
+++++++++++++++++++
**Minor Improvements** (Backwards compatible)
diff --git a/requests/__init__.py b/requests/__init__.py
index f7924dc8..35987f95 100644
--- a/requests/__init__.py
+++ b/requests/__init__.py
@@ -42,8 +42,8 @@ is at .
"""
__title__ = 'requests'
-__version__ = '2.8.1'
-__build__ = 0x020801
+__version__ = '2.9.0'
+__build__ = 0x020900
__author__ = 'Kenneth Reitz'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2015 Kenneth Reitz'
From fc8fa1aa265bb14d59c68eb68a179bce17953967 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Wed, 16 Dec 2015 14:56:13 +0000
Subject: [PATCH 017/127] Fix regression from #2844 regarding binary bodies.
---
requests/models.py | 5 ++++-
test_requests.py | 5 +++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/requests/models.py b/requests/models.py
index 9c624d3c..4bcbc548 100644
--- a/requests/models.py
+++ b/requests/models.py
@@ -81,7 +81,7 @@ class RequestEncodingMixin(object):
"""
if isinstance(data, (str, bytes)):
- return to_native_string(data)
+ return data
elif hasattr(data, 'read'):
return data
elif hasattr(data, '__iter__'):
@@ -385,6 +385,9 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
if isinstance(fragment, str):
fragment = fragment.encode('utf-8')
+ if isinstance(params, (str, bytes)):
+ params = to_native_string(params)
+
enc_params = self._encode_params(params)
if enc_params:
if query:
diff --git a/test_requests.py b/test_requests.py
index 137edc08..07952418 100755
--- a/test_requests.py
+++ b/test_requests.py
@@ -157,6 +157,11 @@ class TestRequests(object):
params=b'test=foo').prepare()
assert request.url == 'http://example.com/?test=foo'
+ def test_binary_put(self):
+ request = requests.Request('PUT', 'http://example.com',
+ data=u"ööö".encode("utf-8")).prepare()
+ assert isinstance(request.body, bytes)
+
def test_mixed_case_scheme_acceptable(self, httpbin):
s = requests.Session()
s.proxies = getproxies()
From 589f13ca9d81a3ba2bace8b889f84b8b7c5e4881 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Fri, 18 Dec 2015 09:22:23 +0000
Subject: [PATCH 018/127] Handle bytes and unicode URLs for netloc
---
requests/utils.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/requests/utils.py b/requests/utils.py
index 132cd2b5..563248fb 100644
--- a/requests/utils.py
+++ b/requests/utils.py
@@ -116,7 +116,10 @@ def get_netrc_auth(url, raise_errors=False):
ri = urlparse(url)
# Strip port numbers from netloc
- host = ri.netloc.split(':')[0]
+ if isinstance(url, str):
+ host = ri.netloc.split(u':')[0]
+ else:
+ host = ri.netloc.split(b':')[0]
try:
_netrc = netrc(netrc_path).authenticators(host)
From b444f21b1f1474d5cad1353afd2e75813d1458bd Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Fri, 18 Dec 2015 09:54:42 +0000
Subject: [PATCH 019/127] Update changelog for 2.9.1
---
HISTORY.rst | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/HISTORY.rst b/HISTORY.rst
index d2bbdd91..93514eb4 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -3,6 +3,15 @@
Release History
---------------
+2.9.1 (2015-12-21)
+++++++++++++++++++
+
+**Bugfixes**
+
+- Resolve regression introduced in 2.9.0 that made it impossible to send binary
+ strings as bodies in Python 3.
+- Fixed errors when calculating cookie expiration dates in certain locales.
+
2.9.0 (2015-12-15)
++++++++++++++++++
From 834a9601c3eb3291558ef8d1c16a92b376bf49e0 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Sat, 19 Dec 2015 08:40:39 +0000
Subject: [PATCH 020/127] Update urllib3 to 1.13.1
---
requests/packages/urllib3/__init__.py | 2 +-
requests/packages/urllib3/connection.py | 11 ++++++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/requests/packages/urllib3/__init__.py b/requests/packages/urllib3/__init__.py
index 43c88b14..e43991a9 100644
--- a/requests/packages/urllib3/__init__.py
+++ b/requests/packages/urllib3/__init__.py
@@ -32,7 +32,7 @@ except ImportError:
__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
__license__ = 'MIT'
-__version__ = '1.13'
+__version__ = '1.13.1'
__all__ = (
'HTTPConnectionPool',
diff --git a/requests/packages/urllib3/connection.py b/requests/packages/urllib3/connection.py
index bb7f3e55..1e4cd417 100644
--- a/requests/packages/urllib3/connection.py
+++ b/requests/packages/urllib3/connection.py
@@ -265,7 +265,16 @@ class VerifiedHTTPSConnection(HTTPSConnection):
'for details.)'.format(hostname)),
SubjectAltNameWarning
)
- match_hostname(cert, self.assert_hostname or hostname)
+
+ # In case the hostname is an IPv6 address, strip the square
+ # brackets from it before using it to validate. This is because
+ # a certificate with an IPv6 address in it won't have square
+ # brackets around that address. Sadly, match_hostname won't do this
+ # for us: it expects the plain host part without any extra work
+ # that might have been done to make it palatable to httplib.
+ asserted_hostname = self.assert_hostname or hostname
+ asserted_hostname = asserted_hostname.strip('[]')
+ match_hostname(cert, asserted_hostname)
self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or
self.assert_fingerprint is not None)
From 46b7f19857278c4422ca69ce6bae8d63de9880f3 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Sat, 19 Dec 2015 08:41:51 +0000
Subject: [PATCH 021/127] Changelog for urllib3 update
---
HISTORY.rst | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/HISTORY.rst b/HISTORY.rst
index 93514eb4..f8c1a545 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -12,6 +12,10 @@ Release History
strings as bodies in Python 3.
- Fixed errors when calculating cookie expiration dates in certain locales.
+**Miscellaneous**
+
+- Updated bundled urllib3 to 1.13.1.
+
2.9.0 (2015-12-15)
++++++++++++++++++
@@ -43,6 +47,10 @@ Release History
provided at all.
- Minor performance improvements when removing specific cookies by name.
+**Miscellaneous**
+
+- Updated urllib3 to 1.13.
+
2.8.1 (2015-10-13)
++++++++++++++++++
From 6e0649d9f896ce2dde57911e7f56b1c968575d74 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Sat, 19 Dec 2015 08:44:21 +0000
Subject: [PATCH 022/127] Push code review advice from @sigmavirus24
---
requests/utils.py | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/requests/utils.py b/requests/utils.py
index 563248fb..c5c3fd01 100644
--- a/requests/utils.py
+++ b/requests/utils.py
@@ -115,11 +115,12 @@ def get_netrc_auth(url, raise_errors=False):
ri = urlparse(url)
- # Strip port numbers from netloc
+ # Strip port numbers from netloc. This weird `if...encode`` dance is
+ # used for Python 3.2, which doesn't support unicode literals.
+ splitstr = b':'
if isinstance(url, str):
- host = ri.netloc.split(u':')[0]
- else:
- host = ri.netloc.split(b':')[0]
+ splitstr = splitstr.decode('ascii')
+ host = ri.netloc.split(splitstr)[0]
try:
_netrc = netrc(netrc_path).authenticators(host)
From 1108058626450b863d154bb74d669754b480caa4 Mon Sep 17 00:00:00 2001
From: Cory Benfield
Date: Mon, 21 Dec 2015 14:53:36 +0000
Subject: [PATCH 023/127] v2.9.1
---
requests/__init__.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/requests/__init__.py b/requests/__init__.py
index 35987f95..bd5b5b97 100644
--- a/requests/__init__.py
+++ b/requests/__init__.py
@@ -42,8 +42,8 @@ is at .
"""
__title__ = 'requests'
-__version__ = '2.9.0'
-__build__ = 0x020900
+__version__ = '2.9.1'
+__build__ = 0x020901
__author__ = 'Kenneth Reitz'
__license__ = 'Apache 2.0'
__copyright__ = 'Copyright 2015 Kenneth Reitz'
From fcb8c8d33b72f66a0c94b3f2b0a65cb2a2e06697 Mon Sep 17 00:00:00 2001
From: Isa Hassen
Date: Sun, 20 Dec 2015 21:53:47 -0500
Subject: [PATCH 024/127] Docs: clarify the precedence of `auth=` over `netrc`
This closes #2062 by clarifying in the docs which auth
header takes precedence:
1st auth=
2nd .netrc
3rd headers=
This precedence order is already tested in test_requests.py,
in the test_basicauth_with_netrc method. Perhaps we should
add further tests for non-basic auth schemes.
---
docs/user/authentication.rst | 4 ++--
docs/user/quickstart.rst | 4 +++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/docs/user/authentication.rst b/docs/user/authentication.rst
index dd0bf2b8..2779e9c8 100644
--- a/docs/user/authentication.rst
+++ b/docs/user/authentication.rst
@@ -37,7 +37,8 @@ netrc Authentication
If no authentication method is given with the ``auth`` argument, Requests will
attempt to get the authentication credentials for the URL's hostname from the
-user's netrc file.
+user's netrc file. The netrc file overrides raw HTTP authentication headers
+set with `headers=`.
If credentials for the hostname are found, the request is sent with HTTP Basic
Auth.
@@ -125,4 +126,3 @@ Further examples can be found under the `Requests organization`_ and in the
.. _Kerberos: https://github.com/requests/requests-kerberos
.. _NTLM: https://github.com/requests/requests-ntlm
.. _Requests organization: https://github.com/requests
-
diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst
index 1ff66593..5de5b0ca 100644
--- a/docs/user/quickstart.rst
+++ b/docs/user/quickstart.rst
@@ -197,7 +197,9 @@ For example, we didn't specify our user-agent in the previous example::
Note: Custom headers are given less precedence than more specific sources of information. For instance:
-* Authorization headers will be overridden if credentials are passed via the ``auth`` parameter or are specified in a ``.netrc`` accessible in the environment.
+* Authorization headers set with `headers=` will be overridden if credentials
+are specified in ``.netrc``, which in turn will be overridden by the ``auth=``
+parameter.
* Authorization headers will be removed if you get redirected off-host.
* Proxy-Authorization headers will be overridden by proxy credentials provided in the URL.
* Content-Length headers will be overridden when we can determine the length of the content.
From f14f30817e80b8181ae79114691230d3af1b6f55 Mon Sep 17 00:00:00 2001
From: Vincent Bernat
Date: Mon, 28 Dec 2015 16:21:53 +0100
Subject: [PATCH 025/127] advanced: use "client.*" to designate client
certificate
Using "server.crt" is confusing as one may try to put the server certificate while this is really the client certificate that should be put here. Instead, use "client.cert", "client.key" and "client.pem".
---
docs/user/advanced.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
index f0d2ffd9..8bd7f907 100644
--- a/docs/user/advanced.rst
+++ b/docs/user/advanced.rst
@@ -220,12 +220,12 @@ You can also specify a local cert to use as client side certificate, as a single
file (containing the private key and the certificate) or as a tuple of both
file's path::
- >>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
+ >>> requests.get('https://kennethreitz.com', cert=('/path/client.cert', '/path/client.key'))
If you specify a wrong path or an invalid cert::
- >>> requests.get('https://kennethreitz.com', cert='/wrong_path/server.pem')
+ >>> requests.get('https://kennethreitz.com', cert='/wrong_path/client.pem')
SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib
.. _ca-certificates:
From 06df08e676f5ed84b0f4fea2b56c9c5dbffd32ea Mon Sep 17 00:00:00 2001
From: Nicolas Delvaux
Date: Mon, 4 Jan 2016 17:01:06 +0100
Subject: [PATCH 026/127] Add equality functions for authentication handlers
---
requests/auth.py | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/requests/auth.py b/requests/auth.py
index 2af55fb5..46104ab5 100644
--- a/requests/auth.py
+++ b/requests/auth.py
@@ -47,6 +47,14 @@ class HTTPBasicAuth(AuthBase):
self.username = username
self.password = password
+ def __eq__(self, other):
+ if not isinstance(other, HTTPBasicAuth):
+ return NotImplemented
+ return self.username == other.username and self.password == other.password
+
+ def __ne__(self, other):
+ return not self == other
+
def __call__(self, r):
r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
return r
@@ -221,3 +229,17 @@ class HTTPDigestAuth(AuthBase):
self._thread_local.num_401_calls = 1
return r
+
+ def __eq__(self, other):
+ if not isinstance(other, HTTPDigestAuth):
+ return NotImplemented
+ return self.username == other.username and \
+ self.password == other.password and \
+ self.last_nonce == other.last_nonce and \
+ self.nonce_count == other.nonce_count and \
+ self.chal == other.chal and \
+ self.pos == other.pos and \
+ self.num_401_calls == other.num_401_calls
+
+ def __ne__(self, other):
+ return not self == other
From fe0850f34134254c7aee753da2bdaa450acf5e7b Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 15 Jan 2016 17:57:46 -0500
Subject: [PATCH 027/127] Update conf.py
---
docs/conf.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/conf.py b/docs/conf.py
index 4969857b..557e21fe 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -46,7 +46,7 @@ master_doc = 'index'
# General information about the project.
project = u'Requests'
-copyright = u'2015. A Kenneth Reitz Project'
+copyright = u'2016. A Kenneth Reitz Project'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
From 07d8c28a756660a1a5b3cabc26f291ac0f28bd06 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 15 Jan 2016 18:41:30 -0500
Subject: [PATCH 028/127] align rezzy the sea turtle
---
docs/_templates/layout.html | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
index eab5aa89..2a7bd608 100644
--- a/docs/_templates/layout.html
+++ b/docs/_templates/layout.html
@@ -1,10 +1,18 @@
{%- extends "basic/layout.html" %}
{%- block extrahead %}
+
{{ super() }}
+
{% if theme_touch_icon %}
{% endif %}
+
+
+
+
{% endblock %}
{%- block relbar2 %}{% endblock %}
{%- block footer %}
From f9d5cbe5b56227d61709cb1309d6152f90df24e8 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 15 Jan 2016 18:44:56 -0500
Subject: [PATCH 029/127] add github banner
---
docs/conf.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/conf.py b/docs/conf.py
index 07a8eb86..bcb8c006 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -105,7 +105,9 @@ html_theme = 'default'
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
- 'show_powered_by': False
+ 'show_powered_by': False,
+ 'github_user': 'kennethreitz',
+ 'github_repo': 'requests',
}
# Add any paths that contain custom themes here, relative to this directory.
From 72506652971a99492c0d50c7a29129798f6150bc Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 15 Jan 2016 18:45:17 -0500
Subject: [PATCH 030/127] Python 3.5
---
docs/index.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/index.rst b/docs/index.rst
index d1ebbd58..617e01a3 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -83,7 +83,7 @@ Requests is ready for today's web.
- Multipart File Uploads
- Connection Timeouts
- ``.netrc`` support
-- Python 2.6—3.4
+- Python 2.6—3.5
- Thread-safe.
From 851d65efb751bff625a3fdd4142f647fdeff6f8d Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 15 Jan 2016 18:55:26 -0500
Subject: [PATCH 031/127] remove hellobar
---
docs/_templates/layout.html | 4 ----
1 file changed, 4 deletions(-)
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
index 2a7bd608..3f435497 100644
--- a/docs/_templates/layout.html
+++ b/docs/_templates/layout.html
@@ -43,10 +43,6 @@
a.async=true;a.type="text/javascript";b.parentNode.insertBefore(a,b)}, 1);
-
-
-
-
-
-
+ (function() {
+ window._pa = window._pa || {};
+ _pa.productId = "requests-docs";
+ var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true;
+ pa.src = ('https:' == document.location.protocol ? 'https:' : 'http:') + "//tag.perfectaudience.com/serve/5226171f87bc6890da0000a0.js";
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(pa, s);
+ })();
+
{%- endblock %}
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index d2cbfe9d..38661e00 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -14,29 +14,15 @@
human beings.
-
-
- Buy Requests Pro
-
-
-
-Get Updates
+Stay Informed
Receive updates on new releases and upcoming projects.
-Subscribe to Newsletter
+
+
-Translations
-
+Join Mailing List .
Useful Links
+
+
+Translations
+
+
+
diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html
index 928cd2fd..5fcfae19 100644
--- a/docs/_templates/sidebarlogo.html
+++ b/docs/_templates/sidebarlogo.html
@@ -14,13 +14,12 @@
development release.
-
- Buy Requests Pro
-
-
-Get Updates
+Stay Informed
Receive updates on new releases and upcoming projects.
-Subscribe to Newsletter
+Join Mailing List .
+
+
\ No newline at end of file
From f6252c2203dc3f9152056955266cce7050bc8e85 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Thu, 18 Feb 2016 20:59:01 -0500
Subject: [PATCH 086/127] improved installation instructions
---
docs/user/install.rst | 28 ++++++++++------------------
1 file changed, 10 insertions(+), 18 deletions(-)
diff --git a/docs/user/install.rst b/docs/user/install.rst
index 5f0ef9c4..b14ee310 100644
--- a/docs/user/install.rst
+++ b/docs/user/install.rst
@@ -7,20 +7,16 @@ This part of the documentation covers the installation of Requests.
The first step to using any software package is getting it properly installed.
-Distribute & Pip
-----------------
+Pip Install
+-----------
-Installing Requests is simple with `pip `_, just run
-this in your terminal::
+To install Requests, simply run this simple command in your terminal of choice::
$ pip install requests
-or, with `easy_install `_::
-
- $ easy_install requests
-
-But, you really `shouldn't do that `_.
-
+If you don't have `pip `_ installed (tisk tisk!),
+`this Python installation guide `_
+can guide you through the process.
Get the Code
------------
@@ -32,16 +28,12 @@ You can either clone the public repository::
$ git clone git://github.com/kennethreitz/requests.git
-Download the `tarball `_::
+Or, download the `tarball `_::
$ curl -OL https://github.com/kennethreitz/requests/tarball/master
+ # optionally, zipball is also available (for Windows users).
-Or, download the `zipball `_::
-
- $ curl -OL https://github.com/kennethreitz/requests/zipball/master
-
-
-Once you have a copy of the source, you can embed it in your Python package,
-or install it into your site-packages easily::
+Once you have a copy of the source, you can embed it in your own Python
+package, or install it into your site-packages easily::
$ python setup.py install
From 47fa07dcd844663e7062713f510dd34fdf231b2d Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Thu, 18 Feb 2016 23:57:30 -0500
Subject: [PATCH 087/127] update requirements workflow
---
requirements-to-freeze.txt | 3 +++
requirements.txt | 20 ++++++++++++++------
2 files changed, 17 insertions(+), 6 deletions(-)
create mode 100644 requirements-to-freeze.txt
diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt
new file mode 100644
index 00000000..7dc46a32
--- /dev/null
+++ b/requirements-to-freeze.txt
@@ -0,0 +1,3 @@
+pytest
+pytest-cov
+pytest-httpbin
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index ad5da761..f41e8aa1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,14 @@
-py==1.4.30
-pytest==2.8.1
-pytest-cov==2.1.0
-pytest-httpbin==0.0.7
-httpbin==0.4.0
-wheel
+coverage==4.0.3
+decorator==4.0.9
+Flask==0.10.1
+httpbin==0.4.1
+itsdangerous==0.24
+Jinja2==2.8
+MarkupSafe==0.23
+py==1.4.31
+pytest==2.8.7
+pytest-cov==2.2.1
+pytest-httpbin==0.2.0
+six==1.10.0
+Werkzeug==0.11.4
+wheel==0.29.0
From 45992769b2a4adcb4859da73417e8da92e4ae967 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Thu, 18 Feb 2016 23:58:47 -0500
Subject: [PATCH 088/127] +sphinx
---
requirements-to-freeze.txt | 3 ++-
requirements.txt | 8 ++++++++
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/requirements-to-freeze.txt b/requirements-to-freeze.txt
index 7dc46a32..e8b9e354 100644
--- a/requirements-to-freeze.txt
+++ b/requirements-to-freeze.txt
@@ -1,3 +1,4 @@
pytest
pytest-cov
-pytest-httpbin
\ No newline at end of file
+pytest-httpbin
+sphinx
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
index f41e8aa1..3d29de0c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,14 +1,22 @@
+alabaster==0.7.7
+Babel==2.2.0
coverage==4.0.3
decorator==4.0.9
+docutils==0.12
Flask==0.10.1
httpbin==0.4.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
py==1.4.31
+Pygments==2.1.1
pytest==2.8.7
pytest-cov==2.2.1
pytest-httpbin==0.2.0
+pytz==2015.7
six==1.10.0
+snowballstemmer==1.2.1
+Sphinx==1.3.5
+sphinx-rtd-theme==0.1.9
Werkzeug==0.11.4
wheel==0.29.0
From e98d71de135fceff1ce08fc52adb78f239e2c3c0 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 00:56:14 -0500
Subject: [PATCH 089/127] docs cleanup
---
docs/Makefile | 71 ++++++-
docs/make.bat | 453 ++++++++++++++++++++++++-----------------
docs/requirements.txt | 2 -
docs/user/advanced.rst | 5 +-
4 files changed, 333 insertions(+), 198 deletions(-)
delete mode 100644 docs/requirements.txt
diff --git a/docs/Makefile b/docs/Makefile
index 946ba445..08a2acf6 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -7,6 +7,11 @@ SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
+# User-friendly check for sphinx-build
+ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
+$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
+endif
+
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
@@ -14,8 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
+.PHONY: help
help:
@echo "Please use \`make ' where is one of"
@echo " html to make standalone HTML files"
@@ -25,53 +29,66 @@ help:
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
+ @echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " xml to make Docutils-native XML files"
+ @echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
+ @echo " coverage to run coverage check of the documentation (if enabled)"
+.PHONY: clean
clean:
- -rm -rf $(BUILDDIR)/*
+ rm -rf $(BUILDDIR)/*
+.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
+.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
+.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
+.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@@ -81,6 +98,16 @@ qthelp:
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Requests.qhc"
+.PHONY: applehelp
+applehelp:
+ $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
+ @echo
+ @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
+ @echo "N.B. You won't be able to view it unless you put it in" \
+ "~/Library/Documentation/Help or install it in your application" \
+ "bundle."
+
+.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@@ -90,11 +117,13 @@ devhelp:
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Requests"
@echo "# devhelp"
+.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@@ -102,22 +131,33 @@ latex:
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
+.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
- make -C $(BUILDDIR)/latex all-pdf
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+.PHONY: latexpdfja
+latexpdfja:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through platex and dvipdfmx..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
+.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@@ -125,29 +165,52 @@ texinfo:
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
+.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
+.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
+.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
+.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
+.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
+
+.PHONY: coverage
+coverage:
+ $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
+ @echo "Testing of coverage in the sources finished, look at the " \
+ "results in $(BUILDDIR)/coverage/python.txt."
+
+.PHONY: xml
+xml:
+ $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
+ @echo
+ @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
+
+.PHONY: pseudoxml
+pseudoxml:
+ $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
+ @echo
+ @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/docs/make.bat b/docs/make.bat
index 4441160c..9eaf9b88 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,190 +1,263 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=_build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
-set I18NSPHINXOPTS=%SPHINXOPTS% .
-if NOT "%PAPER%" == "" (
- set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
- set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
- :help
- echo.Please use `make ^` where ^ is one of
- echo. html to make standalone HTML files
- echo. dirhtml to make HTML files named index.html in directories
- echo. singlehtml to make a single large HTML file
- echo. pickle to make pickle files
- echo. json to make JSON files
- echo. htmlhelp to make HTML files and a HTML help project
- echo. qthelp to make HTML files and a qthelp project
- echo. devhelp to make HTML files and a Devhelp project
- echo. epub to make an epub
- echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
- echo. text to make text files
- echo. man to make manual pages
- echo. texinfo to make Texinfo files
- echo. gettext to make PO message catalogs
- echo. changes to make an overview over all changed/added/deprecated items
- echo. linkcheck to check all external links for integrity
- echo. doctest to run all doctests embedded in the documentation if enabled
- goto end
-)
-
-if "%1" == "clean" (
- for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
- del /q /s %BUILDDIR%\*
- goto end
-)
-
-if "%1" == "html" (
- %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/html.
- goto end
-)
-
-if "%1" == "dirhtml" (
- %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
- goto end
-)
-
-if "%1" == "singlehtml" (
- %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
- goto end
-)
-
-if "%1" == "pickle" (
- %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the pickle files.
- goto end
-)
-
-if "%1" == "json" (
- %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the JSON files.
- goto end
-)
-
-if "%1" == "htmlhelp" (
- %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
- goto end
-)
-
-if "%1" == "qthelp" (
- %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
- echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Requests.qhcp
- echo.To view the help file:
- echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Requests.ghc
- goto end
-)
-
-if "%1" == "devhelp" (
- %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished.
- goto end
-)
-
-if "%1" == "epub" (
- %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The epub file is in %BUILDDIR%/epub.
- goto end
-)
-
-if "%1" == "latex" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "text" (
- %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The text files are in %BUILDDIR%/text.
- goto end
-)
-
-if "%1" == "man" (
- %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The manual pages are in %BUILDDIR%/man.
- goto end
-)
-
-if "%1" == "texinfo" (
- %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
- goto end
-)
-
-if "%1" == "gettext" (
- %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
- goto end
-)
-
-if "%1" == "changes" (
- %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
- if errorlevel 1 exit /b 1
- echo.
- echo.The overview file is in %BUILDDIR%/changes.
- goto end
-)
-
-if "%1" == "linkcheck" (
- %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
- if errorlevel 1 exit /b 1
- echo.
- echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
- goto end
-)
-
-if "%1" == "doctest" (
- %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
- if errorlevel 1 exit /b 1
- echo.
- echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
- goto end
-)
-
-:end
+@ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=_build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+set I18NSPHINXOPTS=%SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+ :help
+ echo.Please use `make ^` where ^ is one of
+ echo. html to make standalone HTML files
+ echo. dirhtml to make HTML files named index.html in directories
+ echo. singlehtml to make a single large HTML file
+ echo. pickle to make pickle files
+ echo. json to make JSON files
+ echo. htmlhelp to make HTML files and a HTML help project
+ echo. qthelp to make HTML files and a qthelp project
+ echo. devhelp to make HTML files and a Devhelp project
+ echo. epub to make an epub
+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+ echo. text to make text files
+ echo. man to make manual pages
+ echo. texinfo to make Texinfo files
+ echo. gettext to make PO message catalogs
+ echo. changes to make an overview over all changed/added/deprecated items
+ echo. xml to make Docutils-native XML files
+ echo. pseudoxml to make pseudoxml-XML files for display purposes
+ echo. linkcheck to check all external links for integrity
+ echo. doctest to run all doctests embedded in the documentation if enabled
+ echo. coverage to run coverage check of the documentation if enabled
+ goto end
+)
+
+if "%1" == "clean" (
+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+ del /q /s %BUILDDIR%\*
+ goto end
+)
+
+
+REM Check if sphinx-build is available and fallback to Python version if any
+%SPHINXBUILD% 1>NUL 2>NUL
+if errorlevel 9009 goto sphinx_python
+goto sphinx_ok
+
+:sphinx_python
+
+set SPHINXBUILD=python -m sphinx.__init__
+%SPHINXBUILD% 2> nul
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+:sphinx_ok
+
+
+if "%1" == "html" (
+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+ goto end
+)
+
+if "%1" == "dirhtml" (
+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+ goto end
+)
+
+if "%1" == "singlehtml" (
+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+ goto end
+)
+
+if "%1" == "pickle" (
+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the pickle files.
+ goto end
+)
+
+if "%1" == "json" (
+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can process the JSON files.
+ goto end
+)
+
+if "%1" == "htmlhelp" (
+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+ goto end
+)
+
+if "%1" == "qthelp" (
+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Requests.qhcp
+ echo.To view the help file:
+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Requests.ghc
+ goto end
+)
+
+if "%1" == "devhelp" (
+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished.
+ goto end
+)
+
+if "%1" == "epub" (
+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
+ goto end
+)
+
+if "%1" == "latex" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdf" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "latexpdfja" (
+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+ cd %BUILDDIR%/latex
+ make all-pdf-ja
+ cd %~dp0
+ echo.
+ echo.Build finished; the PDF files are in %BUILDDIR%/latex.
+ goto end
+)
+
+if "%1" == "text" (
+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The text files are in %BUILDDIR%/text.
+ goto end
+)
+
+if "%1" == "man" (
+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
+ goto end
+)
+
+if "%1" == "texinfo" (
+ %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
+ goto end
+)
+
+if "%1" == "gettext" (
+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
+ goto end
+)
+
+if "%1" == "changes" (
+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.The overview file is in %BUILDDIR%/changes.
+ goto end
+)
+
+if "%1" == "linkcheck" (
+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+ goto end
+)
+
+if "%1" == "doctest" (
+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+ goto end
+)
+
+if "%1" == "coverage" (
+ %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Testing of coverage in the sources finished, look at the ^
+results in %BUILDDIR%/coverage/python.txt.
+ goto end
+)
+
+if "%1" == "xml" (
+ %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The XML files are in %BUILDDIR%/xml.
+ goto end
+)
+
+if "%1" == "pseudoxml" (
+ %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
+ if errorlevel 1 exit /b 1
+ echo.
+ echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
+ goto end
+)
+
+:end
diff --git a/docs/requirements.txt b/docs/requirements.txt
deleted file mode 100644
index bf596036..00000000
--- a/docs/requirements.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-alabaster==0.7.3
-Sphinx==1.1.3
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
index 9c31950d..d3bf3cf4 100644
--- a/docs/user/advanced.rst
+++ b/docs/user/advanced.rst
@@ -356,11 +356,11 @@ POST Multiple Multipart-Encoded Files
-------------------------------------
You can send multiple files in one request. For example, suppose you want to
-upload image files to an HTML form with a multiple file field 'images':
+upload image files to an HTML form with a multiple file field 'images'::
-To do that, just set files to a list of tuples of (form_field_name, file_info):
+To do that, just set files to a list of tuples of ``(form_field_name, file_info)``:
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
@@ -519,6 +519,7 @@ You can also configure proxies by setting the environment variables
$ export HTTP_PROXY="http://10.10.1.10:3128"
$ export HTTPS_PROXY="http://10.10.1.10:1080"
+
$ python
>>> import requests
>>> requests.get("http://example.org")
From dbefff68214b9a65d53a6f13fc1f1e49d6c7c91f Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 01:23:31 -0500
Subject: [PATCH 090/127] sphinx is now working properly on RTD (grrrR)
---
docs/MANIFEST.in | 1 -
docs/_templates/hacks.html | 23 ++++
docs/_templates/layout.html | 59 ----------
docs/conf.py | 215 ++++++++++++++++++++++++++++--------
4 files changed, 192 insertions(+), 106 deletions(-)
delete mode 100644 docs/MANIFEST.in
create mode 100644 docs/_templates/hacks.html
delete mode 100644 docs/_templates/layout.html
diff --git a/docs/MANIFEST.in b/docs/MANIFEST.in
deleted file mode 100644
index fb1021bf..00000000
--- a/docs/MANIFEST.in
+++ /dev/null
@@ -1 +0,0 @@
-include HISTORY.rst README.rst LICENSE
\ No newline at end of file
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
new file mode 100644
index 00000000..b18e73d0
--- /dev/null
+++ b/docs/_templates/hacks.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
deleted file mode 100644
index b53db050..00000000
--- a/docs/_templates/layout.html
+++ /dev/null
@@ -1,59 +0,0 @@
-{%- extends "basic/layout.html" %}
-{%- block extrahead %}
-
- {{ super() }}
-
- {% if theme_touch_icon %}
-
- {% endif %}
-
-
-
-
-
-{% endblock %}
-{%- block relbar2 %}{% endblock %}
-{%- block footer %}
-
-
-
-
-
-
-
-
-
-
-
-{%- endblock %}
diff --git a/docs/conf.py b/docs/conf.py
index a84469db..00e4261c 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
#
# Requests documentation build configuration file, created by
-# sphinx-quickstart on Sun Feb 13 23:54:25 2011.
+# sphinx-quickstart on Fri Feb 19 00:05:47 2016.
#
-# This file is execfile()d with the current directory set to its containing dir.
+# This file is execfile()d with the current directory set to its
+# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
@@ -11,34 +12,43 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-import sys, os
+import sys
+import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# Insert Requests' path into the system.
sys.path.insert(0, os.path.abspath('..'))
+sys.path.insert(0, os.path.abspath('_themes'))
+
import requests
from requests import __version__
-import alabaster
-# -- General configuration -----------------------------------------------------
+# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
-# Add any Sphinx extension module names here, as strings. They can be extensions
-# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.intersphinx',
- 'alabaster'
+ 'sphinx.ext.todo',
+ 'sphinx.ext.viewcode',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
-# The suffix of source filenames.
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
@@ -50,6 +60,7 @@ master_doc = 'index'
# General information about the project.
project = u'Requests'
copyright = u'2016. A Kenneth Reitz Project'
+author = u'Kenneth Reitz'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -58,11 +69,14 @@ copyright = u'2016. A tag referring to it. The value of this option must be the
@@ -181,23 +208,45 @@ html_show_sphinx = False
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
# Output file base name for HTML help builder.
htmlhelp_basename = 'Requestsdoc'
+# -- Options for LaTeX output ---------------------------------------------
-# -- Options for LaTeX output --------------------------------------------------
-
-# The paper size ('letter' or 'a4').
-#latex_paper_size = 'letter'
+latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
-#latex_font_size = '10pt'
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+
+# Latex figure (float) alignment
+#'figure_align': 'htbp',
+}
# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title, author, documentclass [howto/manual]).
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
latex_documents = [
- ('index', 'Requests.tex', u'Requests Documentation',
- u'Kenneth Reitz', 'manual'),
+ (master_doc, 'Requests.tex', u'Requests Documentation',
+ u'Kenneth Reitz', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -214,9 +263,6 @@ latex_documents = [
# If true, show URL addresses after external links.
#latex_show_urls = False
-# Additional stuff for the LaTeX preamble.
-#latex_preamble = ''
-
# Documents to append as an appendix to all manuals.
#latex_appendices = []
@@ -224,33 +270,110 @@ latex_documents = [
#latex_domain_indices = True
-# -- Options for manual page output --------------------------------------------
+# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- ('index', 'requests', u'Requests Documentation',
- [u'Kenneth Reitz'], 1)
+ (master_doc, 'requests', u'Requests Documentation',
+ [author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
-# -- Options for Texinfo output ------------------------------------------------
+
+# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- ('index', 'Requests', u'Requests Documentation', u'Kenneth Reitz',
- 'Requests', 'One line description of project.', 'Miscellaneous'),
+ (master_doc, 'Requests', u'Requests Documentation',
+ author, 'Requests', 'One line description of project.',
+ 'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
-texinfo_appendices = []
+#texinfo_appendices = []
-sys.path.append(os.path.abspath('_themes'))
-html_theme_path =[alabaster.get_path()]
-html_theme = 'alabaster'
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
+
+
+# -- Options for Epub output ----------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = project
+epub_author = author
+epub_publisher = author
+epub_copyright = copyright
+
+# The basename for the epub file. It defaults to the project name.
+#epub_basename = project
+
+# The HTML theme for the epub output. Since the default themes are not
+# optimized for small screen space, using the same theme for HTML and epub
+# output is usually not wise. This defaults to 'epub', a theme designed to save
+# visual space.
+#epub_theme = 'epub'
+
+# The language of the text. It defaults to the language option
+# or 'en' if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# A tuple containing the cover image and cover page html template filenames.
+#epub_cover = ()
+
+# A sequence of (type, uri, title) tuples for the guide element of content.opf.
+#epub_guide = ()
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files that should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+epub_exclude_files = ['search.html']
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
+
+# Choose between 'default' and 'includehidden'.
+#epub_tocscope = 'default'
+
+# Fix unsupported image types using the Pillow.
+#epub_fix_images = False
+
+# Scale large images.
+#epub_max_image_width = 0
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#epub_show_urls = 'inline'
+
+# If false, no index is generated.
+#epub_use_index = True
intersphinx_mapping = {'urllib3': ('http://urllib3.readthedocs.org/en/latest', None)}
From 60b591eaac1836998550f555cd6d28a2c87b4f84 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 01:47:54 -0500
Subject: [PATCH 091/127] docs: widen things up
---
docs/_templates/hacks.html | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index b18e73d0..997f8b23 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -2,8 +2,21 @@
@@ -21,3 +34,7 @@
s.parentNode.insertBefore(t, s);
})();
+
+
+
+
\ No newline at end of file
From f422ace07e92d79308f2e72897126971c37a3414 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 01:52:59 -0500
Subject: [PATCH 092/127] clean up codeblock styles
---
docs/_templates/hacks.html | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index 997f8b23..4763b26b 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -12,11 +12,15 @@
/* Make the document a little wider, less code is cut-off. */
div.document {width: 1008px;}
+ /* Much-improved spacing around code blocks. */
+ div.highlight pre {padding: 11px 14px;}
+
/* Remain Responsive! */
@media screen and (max-width: 1008px) {
div.sphinxsidebar {display: none;}
div.document {width: 100%!important;}
}
+
From f4f863f168d6e2c660cd73d158aaf330ba9070da Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 02:06:33 -0500
Subject: [PATCH 093/127] cleanup advanced.rst
single-quoted strings, yo!
---
docs/user/advanced.rst | 47 ++++++++++++++++++++++++++++--------------
1 file changed, 32 insertions(+), 15 deletions(-)
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
index d3bf3cf4..79ba227b 100644
--- a/docs/user/advanced.rst
+++ b/docs/user/advanced.rst
@@ -24,7 +24,7 @@ Let's persist some cookies across requests::
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
- r = s.get("http://httpbin.org/cookies")
+ r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
@@ -50,6 +50,7 @@ requests, even if using a session. This example will only send the cookies
with the first request, but not the second::
s = requests.Session()
+
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
@@ -129,14 +130,15 @@ request. The simple recipe for this is the following::
from requests import Request, Session
s = Session()
- req = Request('GET', url,
- data=data,
- headers=header
- )
+
+ req = Request('POST', url, data=data, headers=headers)
prepped = req.prepare()
# do something with prepped.body
+ prepped.body = 'No, I want exactly this as the body.'
+
# do something with prepped.headers
+ del prepped.headers['Content-Type']
resp = s.send(prepped,
stream=stream,
@@ -491,7 +493,9 @@ set ``stream`` to ``True`` and iterate over the response with
lines = r.iter_lines()
# Save the first line for later or just skip it
+
first_line = next(lines)
+
for line in lines:
print(line)
@@ -506,11 +510,11 @@ If you need to use a proxy, you can configure individual requests with the
import requests
proxies = {
- "http": "http://10.10.1.10:3128",
- "https": "http://10.10.1.10:1080",
+ 'http': 'http://10.10.1.10:3128',
+ 'https': 'http://10.10.1.10:1080',
}
- requests.get("http://example.org", proxies=proxies)
+ requests.get('http://example.org', proxies=proxies)
You can also configure proxies by setting the environment variables
``HTTP_PROXY`` and ``HTTPS_PROXY``.
@@ -522,12 +526,12 @@ You can also configure proxies by setting the environment variables
$ python
>>> import requests
- >>> requests.get("http://example.org")
+ >>> requests.get('http://example.org')
To use HTTP Basic Auth with your proxy, use the `http://user:password@host/` syntax::
proxies = {
- "http": "http://user:pass@10.10.1.10:3128/",
+ 'http': 'http://user:pass@10.10.1.10:3128/',
}
To give a proxy for a specific scheme and host, use the
@@ -537,7 +541,7 @@ any request to the given scheme and exact hostname.
::
proxies = {
- "http://10.20.1.128": "http://10.10.1.10:5323",
+ 'http://10.20.1.128': 'http://10.10.1.10:5323',
}
Note that proxy URLs must include the scheme.
@@ -603,10 +607,13 @@ So, GitHub returns JSON. That's great, we can use the :meth:`r.json
::
>>> commit_data = r.json()
+
>>> print(commit_data.keys())
[u'committer', u'author', u'url', u'tree', u'sha', u'parents', u'message']
+
>>> print(commit_data[u'committer'])
{u'date': u'2012-05-10T11:10:50-07:00', u'email': u'me@kennethreitz.com', u'name': u'Kenneth Reitz'}
+
>>> print(commit_data[u'message'])
makin' history
@@ -646,9 +653,12 @@ already exists, we will use it as an example. Let's start by getting it.
>>> r = requests.get('https://api.github.com/repos/kennethreitz/requests/issues/482')
>>> r.status_code
200
+
>>> issue = json.loads(r.text)
+
>>> print(issue[u'title'])
Feature any http verb in docs
+
>>> print(issue[u'comments'])
3
@@ -659,9 +669,12 @@ Cool, we have three comments. Let's take a look at the last of them.
>>> r = requests.get(r.url + u'/comments')
>>> r.status_code
200
+
>>> comments = r.json()
+
>>> print(comments[0].keys())
[u'body', u'url', u'created_at', u'updated_at', u'user', u'id']
+
>>> print(comments[2][u'body'])
Probably in the "advanced" section
@@ -681,6 +694,7 @@ is to POST to the thread. Let's do it.
>>> body = json.dumps({u"body": u"Sounds great! I'll get right on it!"})
>>> url = u"https://api.github.com/repos/kennethreitz/requests/issues/482/comments"
+
>>> r = requests.post(url=url, data=body)
>>> r.status_code
404
@@ -693,9 +707,11 @@ the very common Basic Auth.
>>> from requests.auth import HTTPBasicAuth
>>> auth = HTTPBasicAuth('fake@example.com', 'not_a_real_password')
+
>>> r = requests.post(url=url, data=body, auth=auth)
>>> r.status_code
201
+
>>> content = r.json()
>>> print(content[u'body'])
Sounds great! I'll get right on it.
@@ -709,8 +725,10 @@ that.
>>> print(content[u"id"])
5804413
+
>>> body = json.dumps({u"body": u"Sounds great! I'll get right on it once I feed my cat."})
>>> url = u"https://api.github.com/repos/kennethreitz/requests/issues/comments/5804413"
+
>>> r = requests.patch(url=url, data=body, auth=auth)
>>> r.status_code
200
@@ -831,10 +849,9 @@ SSLv3:
""""Transport adapter" that allows us to use SSLv3."""
def init_poolmanager(self, connections, maxsize, block=False):
- self.poolmanager = PoolManager(num_pools=connections,
- maxsize=maxsize,
- block=block,
- ssl_version=ssl.PROTOCOL_SSLv3)
+ self.poolmanager = PoolManager(
+ num_pools=connections, maxsize=maxsize,
+ block=block, ssl_version=ssl.PROTOCOL_SSLv3)
.. _`described here`: http://www.kennethreitz.org/essays/the-future-of-python-http
.. _`urllib3`: https://github.com/shazow/urllib3
From bf8c8312ddece928b2549104b5864600df368904 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 02:12:15 -0500
Subject: [PATCH 094/127] cleanup quickstart
---
docs/user/quickstart.rst | 30 ++++++++++++++++++++++--------
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/docs/user/quickstart.rst b/docs/user/quickstart.rst
index 10037fe6..d31f224e 100644
--- a/docs/user/quickstart.rst
+++ b/docs/user/quickstart.rst
@@ -37,15 +37,15 @@ get all the information we need from this object.
Requests' simple API means that all forms of HTTP request are as obvious. For
example, this is how you make an HTTP POST request::
- >>> r = requests.post("http://httpbin.org/post", data = {"key":"value"})
+ >>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
Nice, right? What about the other HTTP request types: PUT, DELETE, HEAD and
OPTIONS? These are all just as simple::
- >>> r = requests.put("http://httpbin.org/put", data = {"key":"value"})
- >>> r = requests.delete("http://httpbin.org/delete")
- >>> r = requests.head("http://httpbin.org/get")
- >>> r = requests.options("http://httpbin.org/get")
+ >>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
+ >>> r = requests.delete('http://httpbin.org/delete')
+ >>> r = requests.head('http://httpbin.org/get')
+ >>> r = requests.options('http://httpbin.org/get')
That's all well and good, but it's also only the start of what Requests can
do.
@@ -63,7 +63,7 @@ Requests allows you to provide these arguments as a dictionary, using the
following code::
>>> payload = {'key1': 'value1', 'key2': 'value2'}
- >>> r = requests.get("http://httpbin.org/get", params=payload)
+ >>> r = requests.get('http://httpbin.org/get', params=payload)
You can see that the URL has been correctly encoded by printing the URL::
@@ -76,7 +76,8 @@ URL's query string.
You can also pass a list of items as a value::
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
- >>> r = requests.get("http://httpbin.org/get", params=payload)
+
+ >>> r = requests.get('http://httpbin.org/get', params=payload)
>>> print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
@@ -87,6 +88,7 @@ We can read the content of the server's response. Consider the GitHub timeline
again::
>>> import requests
+
>>> r = requests.get('https://api.github.com/events')
>>> r.text
u'[{"repository":{"open_issues":0,"url":"https://github.com/...
@@ -131,6 +133,7 @@ use the following code::
>>> from PIL import Image
>>> from StringIO import StringIO
+
>>> i = Image.open(StringIO(r.content))
@@ -140,6 +143,7 @@ JSON Response Content
There's also a builtin JSON decoder, in case you're dealing with JSON data::
>>> import requests
+
>>> r = requests.get('https://api.github.com/events')
>>> r.json()
[{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...
@@ -163,8 +167,10 @@ server, you can access ``r.raw``. If you want to do this, make sure you set
``stream=True`` in your initial request. Once you do, you can do this::
>>> r = requests.get('https://api.github.com/events', stream=True)
+
>>> r.raw
+
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
@@ -189,7 +195,6 @@ If you'd like to add HTTP headers to a request, simply pass in a ``dict`` to the
For example, we didn't specify our user-agent in the previous example::
- >>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}
@@ -215,6 +220,7 @@ To do this, simply pass a dictionary to the ``data`` argument. Your
dictionary of data will automatically be form-encoded when the request is made::
>>> payload = {'key1': 'value1', 'key2': 'value2'}
+
>>> r = requests.post("http://httpbin.org/post", data=payload)
>>> print(r.text)
{
@@ -232,6 +238,7 @@ you pass in a ``string`` instead of a ``dict``, that data will be posted directl
For example, the GitHub API v3 accepts JSON-Encoded POST/PATCH data::
>>> import json
+
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
@@ -426,10 +433,13 @@ response.
For example, GitHub redirects all HTTP requests to HTTPS::
>>> r = requests.get('http://github.com')
+
>>> r.url
'https://github.com/'
+
>>> r.status_code
200
+
>>> r.history
[]
@@ -438,16 +448,20 @@ If you're using GET, OPTIONS, POST, PUT, PATCH or DELETE, you can disable
redirection handling with the ``allow_redirects`` parameter::
>>> r = requests.get('http://github.com', allow_redirects=False)
+
>>> r.status_code
301
+
>>> r.history
[]
If you're using HEAD, you can enable redirection as well::
>>> r = requests.head('http://github.com', allow_redirects=True)
+
>>> r.url
'https://github.com/'
+
>>> r.history
[]
From f4445b3d4f320f66142cf5aa0656fe62a6c0df3e Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 02:40:14 -0500
Subject: [PATCH 095/127] improve advanced.rst
---
docs/user/advanced.rst | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
index 79ba227b..cc99b679 100644
--- a/docs/user/advanced.rst
+++ b/docs/user/advanced.rst
@@ -167,15 +167,15 @@ applied, replace the call to :meth:`Request.prepare()
from requests import Request, Session
s = Session()
- req = Request('GET', url,
- data=data
- headers=headers
- )
+ req = Request('GET', url, data=data, headers=headers)
prepped = s.prepare_request(req)
# do something with prepped.body
+ prepped.body = 'Seriously, send exactly these bytes.'
+
# do something with prepped.headers
+ prepped.headers['Keep-Dead'] = 'parrot'
resp = s.send(prepped,
stream=stream,
@@ -362,11 +362,12 @@ upload image files to an HTML form with a multiple file field 'images'::
-To do that, just set files to a list of tuples of ``(form_field_name, file_info)``:
+To do that, just set files to a list of tuples of ``(form_field_name, file_info)``::
>>> url = 'http://httpbin.org/post'
- >>> multiple_files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
- ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
+ >>> multiple_files = [
+ ('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
+ ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)
>>> r.text
{
From f8af499700b58cf550205c463ad4b163a784892b Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 02:45:07 -0500
Subject: [PATCH 096/127] improve further advanced.rst
---
docs/user/advanced.rst | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst
index cc99b679..ddd6edf6 100644
--- a/docs/user/advanced.rst
+++ b/docs/user/advanced.rst
@@ -531,9 +531,7 @@ You can also configure proxies by setting the environment variables
To use HTTP Basic Auth with your proxy, use the `http://user:password@host/` syntax::
- proxies = {
- 'http': 'http://user:pass@10.10.1.10:3128/',
- }
+ proxies = {'http': 'http://user:pass@10.10.1.10:3128/'}
To give a proxy for a specific scheme and host, use the
`scheme://hostname` form for the key. This will match for
@@ -541,9 +539,7 @@ any request to the given scheme and exact hostname.
::
- proxies = {
- 'http://10.20.1.128': 'http://10.10.1.10:5323',
- }
+ proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
Note that proxy URLs must include the scheme.
From f63106005b3050b5a99833ec47b78667dc4766b2 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 02:59:05 -0500
Subject: [PATCH 097/127] better codeblocks on mobile
---
docs/_templates/hacks.html | 3 +++
1 file changed, 3 insertions(+)
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index 4763b26b..ba032452 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -19,6 +19,9 @@
@media screen and (max-width: 1008px) {
div.sphinxsidebar {display: none;}
div.document {width: 100%!important;}
+
+ /* Have code blocks escape the document right-margin. */
+ div.highlight pre {margin-right: -30px;}
}
From 688a00c38643f55df41f8337b063ba1944f33ca6 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 03:47:12 -0500
Subject: [PATCH 098/127] improve contributions section
---
docs/dev/contributing.rst | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 075d042a..f619e569 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -22,12 +22,8 @@ contributors.
.. _Ian Cordasco: http://www.coglib.com/~icordasc/
.. _Cory Benfield: https://lukasa.co.uk/about
-
-All Contributions
------------------
-
Be Cordial
-~~~~~~~~~~
+----------
**Be cordial or be on your way.**
@@ -41,7 +37,7 @@ everyone involved is treated with respect.
.. _early-feedback:
Get Early Feedback
-~~~~~~~~~~~~~~~~~~
+------------------
If you are contributing, do not feel the need to sit on your contribution until
it is perfectly polished and complete. It helps everyone involved for you to
@@ -51,7 +47,7 @@ getting that contribution accepted, and can save you from putting a lot of work
into a contribution that is not suitable for the project.
Contribution Suitability
-~~~~~~~~~~~~~~~~~~~~~~~~
+------------------------
The project maintainer has the last word on whether or not a contribution is
suitable for Requests. All contributions will be considered, but from time
@@ -116,6 +112,9 @@ When contributing documentation, please attempt to follow the style of the
documentation files. This means a soft-limit of 79 characters wide in your text
files and a semi-formal prose style.
+When presenting Python code, use single-quoted strings (``'hello'`` instead of
+``"hello"``).
+
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
.. _Sphinx: http://sphinx-doc.org/index.html
From d3bd9f30a6acec62cafee067e82f7cb1cd775701 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:09:03 -0500
Subject: [PATCH 099/127] contributing
---
docs/dev/contributing.rst | 45 +++++++++++++++++++++++----------------
1 file changed, 27 insertions(+), 18 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index f619e569..7aa763cd 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -3,33 +3,38 @@
Contributor's Guide
===================
-If you're reading this you're probably interested in contributing to
-Requests. First, We'd like to say: thank you! Open source projects
-live-and-die based on the support they receive from others, and the fact that
-you're even considering supporting Requests is very generous of
-you.
+If you're reading this, you're probably interested in contributing to Requests.
+Thank you very much! Open source projects live-and-die based on the support
+they receive from others, and the fact that you're even considering
+contributing to the Requests project is *very* generous of you.
-This document lays out guidelines and advice for contributing to Requests.
-If you're thinking of contributing, start by reading this thoroughly and
-getting a feel for how contributing to the project works. If you have any
+This document lays out guidelines and advice for contributing to this project.
+If you're thinking of contributing, please start by reading this document and
+getting a feel for how contributing to this project works. If you have any
questions, feel free to reach out to either `Ian Cordasco`_ or `Cory Benfield`_,
the primary maintainers.
+.. _Ian Cordasco: http://www.coglib.com/~icordasc/
+.. _Cory Benfield: https://lukasa.co.uk/about
+
+If you have non-technical feedback, philisophical ponderings, crazy ideas, or
+other general thoughts about Requests or its position within the Python
+ecosystem, the BDFL, `Kenneth Reitz`_, would love to hear from you.
+
The guide is split into sections based on the type of contribution you're
thinking of making, with a section that covers general guidelines for all
contributors.
-.. _Ian Cordasco: http://www.coglib.com/~icordasc/
-.. _Cory Benfield: https://lukasa.co.uk/about
+.. _Kenneth Reitz: mailto:me@kennethreitz.org
Be Cordial
----------
-**Be cordial or be on your way.**
+ **Be cordial or be on your way**. *—Kenneth Reitz*
Requests has one very important rule governing all forms of contribution,
including reporting bugs or requesting features. This golden rule is
-`be cordial or be on your way`_. **All contributions are welcome**, as long as
+"`be cordial or be on your way`_". **All contributions are welcome**, as long as
everyone involved is treated with respect.
.. _be cordial or be on your way: http://kennethreitz.org/be-cordial-or-be-on-your-way/
@@ -108,9 +113,9 @@ the ``docs/`` directory of the codebase. They're written in
`reStructuredText`_, and use `Sphinx`_ to generate the full suite of
documentation.
-When contributing documentation, please attempt to follow the style of the
+When contributing documentation, please do your best to follow the style of the
documentation files. This means a soft-limit of 79 characters wide in your text
-files and a semi-formal prose style.
+files and a semi-formal, yet friendly and approachable, prose style.
When presenting Python code, use single-quoted strings (``'hello'`` instead of
``"hello"``).
@@ -135,10 +140,14 @@ of other contributors, and should be avoided as much as possible.
Feature Requests
----------------
-Requests is in a perpetual feature freeze. The maintainers believe that
-requests contains every major feature currently required by the vast majority
-of users.
+Requests is in a perpetual feature freeze, only the BDFL can add or approve of
+new features. The maintainers believe that Requests is a feature-complete
+peice of software at this time.
+
+One of the most important skills to have while maintaining a largely-used
+open source project is learning the ability to say "no" to suggested changes,
+while keeping an open ear and mind.
If you believe there is a feature missing, feel free to raise a feature
request, but please do be aware that the overwhelming likelihood is that your
-feature request will not be accepted.
+feature request will not be accepted.
\ No newline at end of file
From 886f92324a4a030676fca440d33f34631c27acd9 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:10:37 -0500
Subject: [PATCH 100/127] contributing
---
docs/dev/contributing.rst | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 7aa763cd..ceedda33 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -34,7 +34,9 @@ Be Cordial
Requests has one very important rule governing all forms of contribution,
including reporting bugs or requesting features. This golden rule is
-"`be cordial or be on your way`_". **All contributions are welcome**, as long as
+"`be cordial or be on your way`_".
+
+**All contributions are welcome**, as long as
everyone involved is treated with respect.
.. _be cordial or be on your way: http://kennethreitz.org/be-cordial-or-be-on-your-way/
From 2cb052aa950a20744778af802acff240830505f3 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:11:41 -0500
Subject: [PATCH 101/127] sp
---
docs/dev/contributing.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index ceedda33..094b7b19 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -17,7 +17,7 @@ the primary maintainers.
.. _Ian Cordasco: http://www.coglib.com/~icordasc/
.. _Cory Benfield: https://lukasa.co.uk/about
-If you have non-technical feedback, philisophical ponderings, crazy ideas, or
+If you have non-technical feedback, philosophical ponderings, crazy ideas, or
other general thoughts about Requests or its position within the Python
ecosystem, the BDFL, `Kenneth Reitz`_, would love to hear from you.
From 5d0ffd85cef1f85124ab38a9207f9d4d734910cf Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:30:06 -0500
Subject: [PATCH 102/127] style guide
---
docs/dev/contributing.rst | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 094b7b19..585497bb 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -68,8 +68,8 @@ accepted.
Code Contributions
------------------
-Steps
-~~~~~
+Steps for Submitting Code
+~~~~~~~~~~~~~~~~~~~~~~~~~
When contributing code, you'll want to follow this checklist:
@@ -107,6 +107,30 @@ asking for help.
Please also check the :ref:`early-feedback` section.
+Code Style
+~~~~~~~~~~
+
+The Requests codebase uses the `PEP8`_ code style.
+
+In addition to the standards outlined in PEP8, we have a few guidelines:
+
+- Line-length can exceed 79 characters, to 100, when convenient.
+- Line-length can exceed 100 characters, when doing otherwise would be *terribly* inconvenient.
+- Always use single-quoted strings (e.g. ``'#flatearth'``), unless a single-quote occurs within the string.
+
+Additionally, one of the few style recommendations PEP8 makes for
+`line continuations`_ lacks all sense of taste, and is not to be found within
+the Requests codebase::
+
+ # Aligned with opening delimiter.
+ foo = long_function_name(var_one, var_two,
+ var_three, var_four)
+
+Just don't. Ever.
+
+.. _PEP8: https://www.python.org/dev/peps/pep-0008/
+.. _line continuations: https://www.python.org/dev/peps/pep-0008/#indentation
+
Documentation Contributions
---------------------------
From 90ddeca70d7846e6a5b99a9c1fe1a2666b5ca47c Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:42:54 -0500
Subject: [PATCH 103/127] updated style guide
---
docs/dev/contributing.rst | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 585497bb..1c43cea7 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -126,7 +126,21 @@ the Requests codebase::
foo = long_function_name(var_one, var_two,
var_three, var_four)
-Just don't. Ever.
+No.
+
+Docstrings are to follow the following syntaxes::
+
+ def the_earth_is_flat():
+ """There is no curve! Also, human cloning centers."""
+
+::
+
+ def well_documented_utility():
+ """Lorem ipsum dolor sit amet, consectetur adipiscing elit,
+ sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
+ Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
+ nisi ut aliquip ex ea commodo consequat.
+ """
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
.. _line continuations: https://www.python.org/dev/peps/pep-0008/#indentation
From ee024423a5d586b2e2cfe773cc5c47a8dcf1db99 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:44:11 -0500
Subject: [PATCH 104/127] more pleasant wording about strong opinion
---
docs/dev/contributing.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 1c43cea7..e4209366 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -126,7 +126,7 @@ the Requests codebase::
foo = long_function_name(var_one, var_two,
var_three, var_four)
-No.
+No. Just don't. Please.
Docstrings are to follow the following syntaxes::
From 29b191b5ea66f7d8e4f9a5db2cc6e0aec9c0d884 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:48:47 -0500
Subject: [PATCH 105/127]
---
docs/dev/contributing.rst | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index e4209366..85e443b2 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -142,6 +142,8 @@ Docstrings are to follow the following syntaxes::
nisi ut aliquip ex ea commodo consequat.
"""
+Thanks for helping to make the world a better place!
+
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
.. _line continuations: https://www.python.org/dev/peps/pep-0008/#indentation
From 8dc5f68bc1d9d28b79478f495be445ba048e8081 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:50:55 -0500
Subject: [PATCH 106/127] sp
---
docs/dev/contributing.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 85e443b2..feb7e741 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -184,7 +184,7 @@ Feature Requests
Requests is in a perpetual feature freeze, only the BDFL can add or approve of
new features. The maintainers believe that Requests is a feature-complete
-peice of software at this time.
+piece of software at this time.
One of the most important skills to have while maintaining a largely-used
open source project is learning the ability to say "no" to suggested changes,
From 1cf1699e37139daa37913e989c91fa130a2472fe Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 04:56:25 -0500
Subject: [PATCH 107/127] what's docstrung
---
docs/dev/contributing.rst | 3 +++
1 file changed, 3 insertions(+)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index feb7e741..41159fb9 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -142,6 +142,9 @@ Docstrings are to follow the following syntaxes::
nisi ut aliquip ex ea commodo consequat.
"""
+All functions, methods, and classes are to contain docstrings. Object data
+model methods (e.g. ``__repr__``) are usually an exception to this rule.
+
Thanks for helping to make the world a better place!
.. _PEP8: https://www.python.org/dev/peps/pep-0008/
From f653b9ac58ad74441e118538619979edcf6749a5 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 05:03:04 -0500
Subject: [PATCH 108/127] sentences
---
docs/dev/contributing.rst | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 41159fb9..0c17c3b3 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -56,13 +56,14 @@ into a contribution that is not suitable for the project.
Contribution Suitability
------------------------
-The project maintainer has the last word on whether or not a contribution is
-suitable for Requests. All contributions will be considered, but from time
-to time contributions will be rejected because they do not suit the project.
+Our project maintainers have the last word on whether or not a contribution is
+suitable for Requests. All contributions will be considered carefully, but from
+time to time, contributions will be rejected because they do not suit the
+current goals or needs of the project.
-If your contribution is rejected, don't despair! So long as you followed these
-guidelines, you'll have a much better chance of getting your next contribution
-accepted.
+If your contribution is rejected, don't despair! As long as you followed these
+guidelines, you will have a much better chance of getting your next
+contribution accepted.
Code Contributions
From b70136cf52e8dfd5a950fecfe2aee820dc7926ef Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 05:38:33 -0500
Subject: [PATCH 109/127] completely (docs)
---
docs/dev/contributing.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 0c17c3b3..82b4a45c 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -119,8 +119,8 @@ In addition to the standards outlined in PEP8, we have a few guidelines:
- Line-length can exceed 100 characters, when doing otherwise would be *terribly* inconvenient.
- Always use single-quoted strings (e.g. ``'#flatearth'``), unless a single-quote occurs within the string.
-Additionally, one of the few style recommendations PEP8 makes for
-`line continuations`_ lacks all sense of taste, and is not to be found within
+Additionally, one of the styles that PEP8 recommends for `line continuations`_
+completely lacks all sense of taste, and is not to be permitted within
the Requests codebase::
# Aligned with opening delimiter.
From 14a83339a74929eae193fbbefd3668cfa8943780 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 05:41:17 -0500
Subject: [PATCH 110/127] words (docs)
---
docs/dev/contributing.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 82b4a45c..f17af82c 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -144,7 +144,7 @@ Docstrings are to follow the following syntaxes::
"""
All functions, methods, and classes are to contain docstrings. Object data
-model methods (e.g. ``__repr__``) are usually an exception to this rule.
+model methods (e.g. ``__repr__``) are typically the exception to this rule.
Thanks for helping to make the world a better place!
From d8bf59dde4bd47f07ef88a4161b4a652b06c7599 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 05:45:55 -0500
Subject: [PATCH 111/127] namedrop
---
docs/dev/contributing.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index f17af82c..1f692621 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -108,8 +108,8 @@ asking for help.
Please also check the :ref:`early-feedback` section.
-Code Style
-~~~~~~~~~~
+Kenneth Reitz's Code Style
+~~~~~~~~~~~~~~~~~~~~~~~~~~
The Requests codebase uses the `PEP8`_ code style.
From 1b1f4ac77d778eb730790890ce764e5127758e02 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 06:08:38 -0500
Subject: [PATCH 112/127] cheat code
---
docs/_static/konami.js | 116 +++++++++++++++++++++++++++++++++++++
docs/_templates/hacks.html | 9 ++-
docs/index.rst | 9 ++-
3 files changed, 130 insertions(+), 4 deletions(-)
create mode 100644 docs/_static/konami.js
diff --git a/docs/_static/konami.js b/docs/_static/konami.js
new file mode 100644
index 00000000..d72cf9df
--- /dev/null
+++ b/docs/_static/konami.js
@@ -0,0 +1,116 @@
+/*
+ * Konami-JS ~
+ * :: Now with support for touch events and multiple instances for
+ * :: those situations that call for multiple easter eggs!
+ * Code: http://konami-js.googlecode.com/
+ * Examples: http://www.snaptortoise.com/konami-js
+ * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
+ * Version: 1.4.2 (9/2/2013)
+ * Licensed under the MIT License (http://opensource.org/licenses/MIT)
+ * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser
+ */
+
+var Konami = function (callback) {
+ var konami = {
+ addEvent: function (obj, type, fn, ref_obj) {
+ if (obj.addEventListener)
+ obj.addEventListener(type, fn, false);
+ else if (obj.attachEvent) {
+ // IE
+ obj["e" + type + fn] = fn;
+ obj[type + fn] = function () {
+ obj["e" + type + fn](window.event, ref_obj);
+ };
+ obj.attachEvent("on" + type, obj[type + fn]);
+ }
+ },
+ input: "",
+ pattern: "38384040373937396665",
+ load: function (link) {
+ this.addEvent(document, "keydown", function (e, ref_obj) {
+ if (ref_obj) konami = ref_obj; // IE
+ konami.input += e ? e.keyCode : event.keyCode;
+ if (konami.input.length > konami.pattern.length)
+ konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
+ if (konami.input == konami.pattern) {
+ konami.code(link);
+ konami.input = "";
+ e.preventDefault();
+ return false;
+ }
+ }, this);
+ this.iphone.load(link);
+ },
+ code: function (link) {
+ window.location = link
+ },
+ iphone: {
+ start_x: 0,
+ start_y: 0,
+ stop_x: 0,
+ stop_y: 0,
+ tapTolerance: 8,
+ capture: false,
+ orig_keys: "",
+ keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
+ code: function (link) {
+ konami.code(link);
+ },
+ touchCapture: function(evt) {
+ konami.iphone.start_x = evt.changedTouches[0].pageX;
+ konami.iphone.start_y = evt.changedTouches[0].pageY;
+ konami.iphone.capture = true;
+ },
+ load: function (link) {
+ this.orig_keys = this.keys;
+ konami.addEvent(document, "touchmove", function (e) {
+ if (e.touches.length == 1 && konami.iphone.capture == true) {
+ var touch = e.touches[0];
+ konami.iphone.stop_x = touch.pageX;
+ konami.iphone.stop_y = touch.pageY;
+ konami.iphone.check_direction();
+ }
+ });
+ konami.addEvent(document, "touchend", function (evt) {
+ konami.touchCapture(evt);
+ konami.iphone.check_direction(link);
+ }, false);
+ konami.addEvent(document, "touchstart", function (evt) {
+ konami.touchCapture(evt);
+ });
+ },
+ check_direction: function (link) {
+ var x_magnitude = Math.abs(this.start_x - this.stop_x);
+ var y_magnitude = Math.abs(this.start_y - this.stop_y);
+ var hasMoved = (x_magnitude > this.tapTolerance || y_magnitude > this.tapTolerance);
+ var result;
+ if (this.capture === true && hasMoved) {
+ this.capture = false;
+ var x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
+ var y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
+ var result = (x_magnitude > y_magnitude) ? x : y;
+ }
+ else if (this.capture === false && !hasMoved) {
+ result = (this.tap == true) ? "TAP" : result;
+ result = "TAP";
+ }
+ if (result) {
+ if (result == this.keys[0]) this.keys = this.keys.slice(1, this.keys.length);
+ else this.keys = this.orig_keys;
+ }
+ if (this.keys.length == 0) {
+ this.keys = this.orig_keys;
+ this.code(link);
+ }
+ }
+ }
+ }
+
+ typeof callback === "string" && konami.load(callback);
+ if (typeof callback === "function") {
+ konami.code = callback;
+ konami.load();
+ }
+
+ return konami;
+};
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index ba032452..ca9865d6 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -44,4 +44,11 @@
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/index.rst b/docs/index.rst
index 0df56107..75983c37 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -124,8 +124,8 @@ Requests ecosystem and community.
community/updates
community/release-process
-API Documentation
------------------
+API Documentation / Guide
+-------------------------
If you are looking for information on a specific function, class or method,
this part of the documentation is for you.
@@ -143,9 +143,12 @@ If you want to contribute to the project, this part of the documentation is for
you.
.. toctree::
- :maxdepth: 1
+ :maxdepth: 2
dev/contributing
dev/philosophy
dev/todo
dev/authors
+
+There are no more guides. You are now guideless.
+Good luck.
From ca303cda0a4664bf925ba2eecdd4c5abf1987443 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 06:14:51 -0500
Subject: [PATCH 113/127] letters
---
docs/index.rst | 2 +-
docs/user/install.rst | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/docs/index.rst b/docs/index.rst
index 75983c37..cc4d4510 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -143,7 +143,7 @@ If you want to contribute to the project, this part of the documentation is for
you.
.. toctree::
- :maxdepth: 2
+ :maxdepth: 3
dev/contributing
dev/philosophy
diff --git a/docs/user/install.rst b/docs/user/install.rst
index b14ee310..c3f0084e 100644
--- a/docs/user/install.rst
+++ b/docs/user/install.rst
@@ -7,8 +7,8 @@ This part of the documentation covers the installation of Requests.
The first step to using any software package is getting it properly installed.
-Pip Install
------------
+Pip Install Requests
+--------------------
To install Requests, simply run this simple command in your terminal of choice::
@@ -18,8 +18,8 @@ If you don't have `pip `_ installed (tisk tisk!),
`this Python installation guide `_
can guide you through the process.
-Get the Code
-------------
+Get the Source Code
+-------------------
Requests is actively developed on GitHub, where the code is
`always available `_.
From a7b5e3191d1b121e452e83798287209d12ade7ee Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 08:51:36 -0500
Subject: [PATCH 114/127] pass go, yay $200
---
docs/dev/contributing.rst | 2 ++
1 file changed, 2 insertions(+)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 1f692621..24f4b9f7 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -133,6 +133,7 @@ Docstrings are to follow the following syntaxes::
def the_earth_is_flat():
"""There is no curve! Also, human cloning centers."""
+ pass
::
@@ -142,6 +143,7 @@ Docstrings are to follow the following syntaxes::
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
"""
+ pass
All functions, methods, and classes are to contain docstrings. Object data
model methods (e.g. ``__repr__``) are typically the exception to this rule.
From fc1e9b46a197b8412fa3fdb7d2bcb5e0f62f68a5 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 09:08:29 -0500
Subject: [PATCH 115/127] lyrics, er, docstrings
---
docs/dev/contributing.rst | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 24f4b9f7..302d1bd6 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -132,16 +132,20 @@ No. Just don't. Please.
Docstrings are to follow the following syntaxes::
def the_earth_is_flat():
- """There is no curve! Also, human cloning centers."""
+ """NASA divided up the seas into thirty-three degrees."""
pass
::
- def well_documented_utility():
- """Lorem ipsum dolor sit amet, consectetur adipiscing elit,
- sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
- nisi ut aliquip ex ea commodo consequat.
+ def fibonacci_spiral_tool():
+ """With my feet upon the ground I lose myself / between the sounds and open
+ wide to suck it in. / I feel it move across my skin. / I'm reaching up and
+ reaching out. / I'm reaching for the random or whatever will bewilder me. /
+ Whatever will bewilder me. /And following our will and wind we may just go
+ where no one's been. / We'll ride the spiral to the end and may just go
+ where no one's been.
+
+ Spiral out. Keep going...
"""
pass
From b366ef039cf2d9cafaaeed063d44ebef2d7f801c Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 09:11:09 -0500
Subject: [PATCH 116/127] improved presentation of style guide
---
docs/dev/contributing.rst | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index 302d1bd6..fb6eb874 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -138,12 +138,13 @@ Docstrings are to follow the following syntaxes::
::
def fibonacci_spiral_tool():
- """With my feet upon the ground I lose myself / between the sounds and open
- wide to suck it in. / I feel it move across my skin. / I'm reaching up and
- reaching out. / I'm reaching for the random or whatever will bewilder me. /
- Whatever will bewilder me. /And following our will and wind we may just go
- where no one's been. / We'll ride the spiral to the end and may just go
- where no one's been.
+ """With my feet upon the ground I lose myself / between the sounds
+ and open wide to suck it in. / I feel it move across my skin. / I'm
+ reaching up and reaching out. / I'm reaching for the random or
+ whatever will bewilder me. / Whatever will bewilder me. / And
+ following our will and wind we may just go where no one's been. /
+ We'll ride the spiral to the end and may just go where no one's
+ been.
Spiral out. Keep going...
"""
From 75096a167cd6c3293223995d9207ceb96f254fd6 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Fri, 19 Feb 2016 09:26:21 -0500
Subject: [PATCH 117/127] transcendental meditation
---
docs/dev/contributing.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/dev/contributing.rst b/docs/dev/contributing.rst
index fb6eb874..4b98a945 100644
--- a/docs/dev/contributing.rst
+++ b/docs/dev/contributing.rst
@@ -108,8 +108,8 @@ asking for help.
Please also check the :ref:`early-feedback` section.
-Kenneth Reitz's Code Style
-~~~~~~~~~~~~~~~~~~~~~~~~~~
+Kenneth Reitz's Code Style™
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Requests codebase uses the `PEP8`_ code style.
From 41c26ce1f54278954575df015d861b4dd5cb8894 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Sun, 21 Feb 2016 20:32:36 -0500
Subject: [PATCH 118/127] improvements to index
---
docs/index.rst | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/docs/index.rst b/docs/index.rst
index cc4d4510..5eb643e1 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -38,8 +38,8 @@ URLs, or to form-encode your POST data. Keep-alive and HTTP connection pooling
are 100% automatic, powered by `urllib3 `_,
which is embedded within Requests.
-Testimonials
-------------
+User Testimonials
+-----------------
Her Majesty's Government, Amazon, Google, Twilio, Runscope, Mozilla, Heroku,
PayPal, NPR, Obama for America, Transifex, Native Instruments, The Washington
@@ -65,8 +65,8 @@ Institutions that prefer to be unnamed claim to use Requests internally.
Requests is one of the most downloaded Python packages of all time, pulling in
over 7,000,000 downloads every month. All the cool kids are doing it!
-Feature Support
----------------
+Supported Features
+------------------
Requests is ready for today's web.
@@ -90,8 +90,8 @@ Requests is ready for today's web.
Requests supports Python 2.6 — 3.5, and runs great on PyPy.
-User Guide
-----------
+The User Guide
+--------------
This part of the documentation, which is mostly prose, begins with some
background information about Requests, then focuses on step-by-step
@@ -107,8 +107,8 @@ instructions for getting the most out of Requests.
user/authentication
-Community Guide
------------------
+The Community Guide
+-------------------
This part of the documentation, which is mostly prose, details the
Requests ecosystem and community.
@@ -124,10 +124,10 @@ Requests ecosystem and community.
community/updates
community/release-process
-API Documentation / Guide
--------------------------
+The API Documentation / Guide
+-----------------------------
-If you are looking for information on a specific function, class or method,
+If you are looking for information on a specific function, class, or method,
this part of the documentation is for you.
.. toctree::
@@ -136,8 +136,8 @@ this part of the documentation is for you.
api
-Contributor Guide
------------------
+The Contributor Guide
+---------------------
If you want to contribute to the project, this part of the documentation is for
you.
From 5f06b8196e8a652101b32fdffcd0d10e8b961fd2 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Sun, 21 Feb 2016 20:32:42 -0500
Subject: [PATCH 119/127] updated sidebars
---
docs/_templates/sidebarintro.html | 15 ++++++++++++++-
docs/_templates/sidebarlogo.html | 16 ++++++++++++++--
2 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index 38661e00..69ef6685 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -14,7 +14,7 @@
human beings.
-Stay Informed
+Get Updates
Receive updates on new releases and upcoming projects.
+Other Projects
+
+More Kenneth Reitz projects:
+
+
+
Useful Links
Recommended Packages and Extensions
diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html
index 5fcfae19..c05ab3e7 100644
--- a/docs/_templates/sidebarlogo.html
+++ b/docs/_templates/sidebarlogo.html
@@ -14,7 +14,7 @@
development release.
-Stay Informed
+Get Updates
Receive updates on new releases and upcoming projects.
Join Mailing List .
@@ -22,4 +22,16 @@
-
\ No newline at end of file
+
+
+Other Projects
+
+MoreKenneth Reitz projects:
+
\ No newline at end of file
From e47e80b92f354efe5db7049b40f9cadc4ea7566e Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Sun, 21 Feb 2016 20:34:15 -0500
Subject: [PATCH 120/127] &bsp;
---
docs/_templates/sidebarlogo.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html
index c05ab3e7..7bcd4735 100644
--- a/docs/_templates/sidebarlogo.html
+++ b/docs/_templates/sidebarlogo.html
@@ -26,7 +26,7 @@
Other Projects
-MoreKenneth Reitz projects:
+More Kenneth Reitz projects:
pep8.org
The Python Guide
From f2ec732ce8bd339187cc01f3c5290d4fc19ed0d1 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Sun, 21 Feb 2016 20:45:45 -0500
Subject: [PATCH 121/127] stay informed
---
docs/_templates/sidebarintro.html | 2 +-
docs/_templates/sidebarlogo.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index 69ef6685..3fa77a1d 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -14,7 +14,7 @@
human beings.
-Get Updates
+Stay Informed
Receive updates on new releases and upcoming projects.
\ No newline at end of file
+
+
+
+Translations
+
+
+
From 7de1495bf5df610887cb4bdd4cf8ac2c92bb9ff7 Mon Sep 17 00:00:00 2001
From: Kenneth Reitz
Date: Sun, 21 Feb 2016 22:54:04 -0500
Subject: [PATCH 124/127] add httpbin.org
---
docs/_templates/sidebarintro.html | 1 +
docs/_templates/sidebarlogo.html | 1 +
2 files changed, 2 insertions(+)
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index 3fa77a1d..7dbd74c8 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -29,6 +29,7 @@
More Kenneth Reitz projects: