summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2019-05-14 17:25:56 +0200
committerMatěj Cepl <mcepl@cepl.eu>2019-05-14 17:25:56 +0200
commit55d4e9542de3519fb0085da9abfd8e0b8eee0d7a (patch)
tree7fb876c783bb73d55359c71be48c2d927c288352 /doc
parent2dc2935f2aeaa57bb6d066cf9c01f337a8c9e506 (diff)
downloadm2crypto-55d4e9542de3519fb0085da9abfd8e0b8eee0d7a.tar.gz
Correct URL of https://www.schneier.com/academic/smime/
Renegerate documentation.
Diffstat (limited to 'doc')
-rw-r--r--doc/Makefile2
-rw-r--r--doc/doctrees/M2Crypto.SSL.doctreebin383428 -> 349315 bytes
-rw-r--r--doc/doctrees/M2Crypto.doctreebin1368244 -> 963869 bytes
-rw-r--r--doc/doctrees/ZServerSSL-HOWTO.doctreebin47807 -> 43570 bytes
-rw-r--r--doc/doctrees/environment.picklebin490409 -> 535122 bytes
-rw-r--r--doc/doctrees/howto.ca.doctreebin49739 -> 49113 bytes
-rw-r--r--doc/doctrees/howto.smime.doctreebin89126 -> 88860 bytes
-rw-r--r--doc/doctrees/howto.ssl.doctreebin21303 -> 20890 bytes
-rw-r--r--doc/doctrees/index.doctreebin7215 -> 6360 bytes
-rw-r--r--doc/html/.buildinfo2
-rw-r--r--doc/html/M2Crypto.SSL.html260
-rw-r--r--doc/html/M2Crypto.html459
-rw-r--r--doc/html/ZServerSSL-HOWTO.html139
-rw-r--r--doc/html/_modules/M2Crypto/ASN1.html72
-rw-r--r--doc/html/_modules/M2Crypto/AuthCookie.html68
-rw-r--r--doc/html/_modules/M2Crypto/BIO.html71
-rw-r--r--doc/html/_modules/M2Crypto/BN.html54
-rw-r--r--doc/html/_modules/M2Crypto/DH.html58
-rw-r--r--doc/html/_modules/M2Crypto/DSA.html66
-rw-r--r--doc/html/_modules/M2Crypto/EC.html58
-rw-r--r--doc/html/_modules/M2Crypto/EVP.html82
-rw-r--r--doc/html/_modules/M2Crypto/Engine.html71
-rw-r--r--doc/html/_modules/M2Crypto/Err.html70
-rw-r--r--doc/html/_modules/M2Crypto/RC4.html56
-rw-r--r--doc/html/_modules/M2Crypto/RSA.html63
-rw-r--r--doc/html/_modules/M2Crypto/Rand.html88
-rw-r--r--doc/html/_modules/M2Crypto/SMIME.html108
-rw-r--r--doc/html/_modules/M2Crypto/SSL.html63
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Checker.html64
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Cipher.html66
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Connection.html135
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Context.html58
-rw-r--r--doc/html/_modules/M2Crypto/SSL/SSLServer.html68
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Session.html59
-rw-r--r--doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html66
-rw-r--r--doc/html/_modules/M2Crypto/SSL/cb.html54
-rw-r--r--doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html56
-rw-r--r--doc/html/_modules/M2Crypto/SSL/timeout.html80
-rw-r--r--doc/html/_modules/M2Crypto/X509.html124
-rw-r--r--doc/html/_modules/M2Crypto/ftpslib.html56
-rw-r--r--doc/html/_modules/M2Crypto/httpslib.html64
-rw-r--r--doc/html/_modules/M2Crypto/m2crypto.html172
-rw-r--r--doc/html/_modules/M2Crypto/m2urllib.html61
-rw-r--r--doc/html/_modules/M2Crypto/m2urllib2.html56
-rw-r--r--doc/html/_modules/M2Crypto/m2xmlrpclib.html56
-rw-r--r--doc/html/_modules/M2Crypto/threading.html54
-rw-r--r--doc/html/_modules/M2Crypto/util.html114
-rw-r--r--doc/html/_modules/index.html56
-rw-r--r--doc/html/_modules/urllib/request.html2841
-rw-r--r--doc/html/_modules/urllib2.html1575
-rw-r--r--doc/html/_sources/M2Crypto.SSL.txt91
-rw-r--r--doc/html/_sources/M2Crypto.txt218
-rw-r--r--doc/html/_sources/ZServerSSL-HOWTO.txt239
-rw-r--r--doc/html/_sources/howto.ca.txt370
-rw-r--r--doc/html/_sources/howto.smime.txt778
-rw-r--r--doc/html/_sources/howto.ssl.txt131
-rw-r--r--doc/html/_sources/index.txt30
-rw-r--r--doc/html/_static/alabaster.css146
-rw-r--r--doc/html/_static/basic.css43
-rw-r--r--doc/html/_static/default.css256
-rw-r--r--doc/html/_static/doctools.js66
-rw-r--r--doc/html/_static/documentation_options.js10
-rw-r--r--doc/html/_static/jquery-3.2.1.js (renamed from doc/html/_static/jquery-3.1.0.js)769
-rw-r--r--doc/html/_static/jquery.js8
-rw-r--r--doc/html/_static/language_data.js297
-rw-r--r--doc/html/_static/searchtools.js355
-rw-r--r--doc/html/_static/sidebar.js151
-rw-r--r--doc/html/_static/websupport.js4
-rw-r--r--doc/html/genindex.html65
-rw-r--r--doc/html/howto.ca.html113
-rw-r--r--doc/html/howto.smime.html202
-rw-r--r--doc/html/howto.ssl.html77
-rw-r--r--doc/html/index.html136
-rw-r--r--doc/html/objects.invbin4390 -> 4395 bytes
-rw-r--r--doc/html/py-modindex.html54
-rw-r--r--doc/html/search.html49
-rw-r--r--doc/html/searchindex.js2
77 files changed, 6251 insertions, 6254 deletions
diff --git a/doc/Makefile b/doc/Makefile
index f755563..cbe8480 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -39,7 +39,7 @@ help:
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
- -rm -rf $(BUILDDIR)/*
+ -rm -rf $(BUILDDIR)/{doctrees,html}
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
diff --git a/doc/doctrees/M2Crypto.SSL.doctree b/doc/doctrees/M2Crypto.SSL.doctree
index d4c48b1..7ea180d 100644
--- a/doc/doctrees/M2Crypto.SSL.doctree
+++ b/doc/doctrees/M2Crypto.SSL.doctree
Binary files differ
diff --git a/doc/doctrees/M2Crypto.doctree b/doc/doctrees/M2Crypto.doctree
index e8b41bc..9a06cce 100644
--- a/doc/doctrees/M2Crypto.doctree
+++ b/doc/doctrees/M2Crypto.doctree
Binary files differ
diff --git a/doc/doctrees/ZServerSSL-HOWTO.doctree b/doc/doctrees/ZServerSSL-HOWTO.doctree
index 4bb8159..040bc3f 100644
--- a/doc/doctrees/ZServerSSL-HOWTO.doctree
+++ b/doc/doctrees/ZServerSSL-HOWTO.doctree
Binary files differ
diff --git a/doc/doctrees/environment.pickle b/doc/doctrees/environment.pickle
index da5be06..9a85a4e 100644
--- a/doc/doctrees/environment.pickle
+++ b/doc/doctrees/environment.pickle
Binary files differ
diff --git a/doc/doctrees/howto.ca.doctree b/doc/doctrees/howto.ca.doctree
index 83eb476..d86d193 100644
--- a/doc/doctrees/howto.ca.doctree
+++ b/doc/doctrees/howto.ca.doctree
Binary files differ
diff --git a/doc/doctrees/howto.smime.doctree b/doc/doctrees/howto.smime.doctree
index 0761480..4199adb 100644
--- a/doc/doctrees/howto.smime.doctree
+++ b/doc/doctrees/howto.smime.doctree
Binary files differ
diff --git a/doc/doctrees/howto.ssl.doctree b/doc/doctrees/howto.ssl.doctree
index c757283..e90779b 100644
--- a/doc/doctrees/howto.ssl.doctree
+++ b/doc/doctrees/howto.ssl.doctree
Binary files differ
diff --git a/doc/doctrees/index.doctree b/doc/doctrees/index.doctree
index d8661d3..cab8fd0 100644
--- a/doc/doctrees/index.doctree
+++ b/doc/doctrees/index.doctree
Binary files differ
diff --git a/doc/html/.buildinfo b/doc/html/.buildinfo
index 1473c05..50b077b 100644
--- a/doc/html/.buildinfo
+++ b/doc/html/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: a5615f96278642a071afe91980cda73c
+config: f47da9e27c47bb67c681b112c1dbec32
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/doc/html/M2Crypto.SSL.html b/doc/html/M2Crypto.SSL.html
index 63d1f24..4a81972 100644
--- a/doc/html/M2Crypto.SSL.html
+++ b/doc/html/M2Crypto.SSL.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>SSL Package &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="M2Crypto Package" href="M2Crypto.html" />
@@ -30,34 +23,35 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="ssl-package">
<h1>SSL Package<a class="headerlink" href="#ssl-package" title="Permalink to this headline">¶</a></h1>
<div class="section" id="id1">
-<h2><code class="xref py py-mod docutils literal"><span class="pre">SSL</span></code> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">SSL</span></code> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<span class="target" id="module-M2Crypto.SSL"></span><dl class="exception">
<dt id="M2Crypto.SSL.SSLError">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.</code><code class="descname">SSLError</code><a class="reference internal" href="_modules/M2Crypto/SSL.html#SSLError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="exception">
<dt id="M2Crypto.SSL.SSLTimeoutError">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.</code><code class="descname">SSLTimeoutError</code><a class="reference internal" href="_modules/M2Crypto/SSL.html#SSLTimeoutError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLTimeoutError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.SSLError" title="M2Crypto.SSL.SSLError"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLError</span></code></a>, <code class="xref py py-class docutils literal"><span class="pre">socket.timeout</span></code></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.SSLError" title="M2Crypto.SSL.SSLError"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.SSLError</span></code></a>, <code class="xref py py-class docutils literal notranslate"><span class="pre">socket.timeout</span></code></p>
</dd></dl>
</div>
<div class="section" id="module-M2Crypto.SSL.Checker">
-<span id="checker-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Checker</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Checker" title="Permalink to this headline">¶</a></h2>
+<span id="checker-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Checker</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Checker" title="Permalink to this headline">¶</a></h2>
<p>SSL peer certificate checking routines</p>
<p>Copyright (c) 2004-2007 Open Source Applications Foundation.
All rights reserved.</p>
@@ -65,46 +59,48 @@ All rights reserved.</p>
<dl class="exception">
<dt id="M2Crypto.SSL.Checker.SSLVerificationError">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.Checker.</code><code class="descname">SSLVerificationError</code><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#SSLVerificationError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="exception">
<dt id="M2Crypto.SSL.Checker.NoCertificate">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.Checker.</code><code class="descname">NoCertificate</code><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#NoCertificate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.NoCertificate" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
</dd></dl>
<dl class="exception">
<dt id="M2Crypto.SSL.Checker.WrongCertificate">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.Checker.</code><code class="descname">WrongCertificate</code><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#WrongCertificate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.WrongCertificate" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
</dd></dl>
<dl class="exception">
<dt id="M2Crypto.SSL.Checker.WrongHost">
<em class="property">exception </em><code class="descclassname">M2Crypto.SSL.Checker.</code><code class="descname">WrongHost</code><span class="sig-paren">(</span><em>expectedHost</em>, <em>actualHost</em>, <em>fieldName='commonName'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#WrongHost"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.WrongHost" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></code></a></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.SSL.Checker.Checker">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Checker.</code><code class="descname">Checker</code><span class="sig-paren">(</span><em>host=None</em>, <em>peerCertHash=None</em>, <em>peerCertDigest='sha1'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#Checker"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.Checker" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="attribute">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="attribute">
<dt id="M2Crypto.SSL.Checker.Checker.numericIpMatch">
-<code class="descname">numericIpMatch</code><em class="property"> = &lt;_sre.SRE_Pattern object&gt;</em><a class="headerlink" href="#M2Crypto.SSL.Checker.Checker.numericIpMatch" title="Permalink to this definition">¶</a></dt>
+<code class="descname">numericIpMatch</code><em class="property"> = re.compile('^[0-9]+(\\.[0-9]+)*$')</em><a class="headerlink" href="#M2Crypto.SSL.Checker.Checker.numericIpMatch" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
</dd></dl>
</div>
<div class="section" id="module-M2Crypto.SSL.Cipher">
-<span id="cipher-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Cipher</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Cipher" title="Permalink to this headline">¶</a></h2>
+<span id="cipher-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Cipher</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Cipher" title="Permalink to this headline">¶</a></h2>
<p>SSL Ciphers</p>
<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
<dl class="class">
<dt id="M2Crypto.SSL.Cipher.Cipher">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Cipher.</code><code class="descname">Cipher</code><span class="sig-paren">(</span><em>cipher</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.SSL.Cipher.Cipher.name">
<code class="descname">name</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher.name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher.name" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -119,15 +115,17 @@ All rights reserved.</p>
<dl class="class">
<dt id="M2Crypto.SSL.Cipher.Cipher_Stack">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Cipher.</code><code class="descname">Cipher_Stack</code><span class="sig-paren">(</span><em>stack</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher_Stack" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+</dd></dl>
</div>
<div class="section" id="module-M2Crypto.SSL.Connection">
-<span id="connection-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Connection</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Connection" title="Permalink to this headline">¶</a></h2>
+<span id="connection-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Connection</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Connection" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.SSL.Connection.Connection">
-<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Connection.</code><code class="descname">Connection</code><span class="sig-paren">(</span><em>ctx</em>, <em>sock=None</em>, <em>family=2</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection" title="Permalink to this definition">¶</a></dt>
-<dd><p>An SSL connection.</p>
+<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Connection.</code><code class="descname">Connection</code><span class="sig-paren">(</span><em>ctx</em>, <em>sock=None</em>, <em>family=&lt;AddressFamily.AF_INET: 2&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>An SSL connection.</p>
<dl class="method">
<dt id="M2Crypto.SSL.Connection.Connection.accept">
<code class="descname">accept</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.accept"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.accept" title="Permalink to this definition">¶</a></dt>
@@ -195,7 +193,7 @@ from cache.</p>
<dl class="attribute">
<dt id="M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck">
-<code class="descname">clientPostConnectionCheck</code><em class="property"> = &lt;M2Crypto.SSL.Checker.Checker instance&gt;</em><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
+<code class="descname">clientPostConnectionCheck</code><em class="property"> = &lt;M2Crypto.SSL.Checker.Checker object&gt;</em><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="method">
@@ -425,6 +423,11 @@ C structures encoded as byte strings).</p>
<code class="descname">m2_bio_free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.m2_bio_free" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
+<dl class="attribute">
+<dt id="M2Crypto.SSL.Connection.Connection.m2_bio_noclose">
+<code class="descname">m2_bio_noclose</code><em class="property"> = 0</em><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.m2_bio_noclose" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
<dl class="method">
<dt id="M2Crypto.SSL.Connection.Connection.m2_ssl_free">
<code class="descname">m2_ssl_free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.m2_ssl_free" title="Permalink to this definition">¶</a></dt>
@@ -458,9 +461,25 @@ C structures encoded as byte strings).</p>
than creating a new string. Receive up to buffersize bytes from
the socket. If buffersize is not specified (or 0), receive up
to the size available in the given buffer.</p>
-<p>&#64;param buffer: a buffer for the received bytes
-&#64;param nbytes: maximum number of bytes to read
-&#64;return: number of bytes added</p>
+<p>If buff is bytearray, it will have after return length of the
+actually returned number of bytes. If buff is memoryview, then
+the size of buff won’t change (it cannot), but all bytes after
+the number of returned bytes will be NULL.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>buffer</strong> – a buffer for the received bytes</li>
+<li><strong>nbytes</strong> – maximum number of bytes to read</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">number of bytes read</p>
+</td>
+</tr>
+</tbody>
+</table>
<p>See recv() for documentation about the flags.</p>
</dd></dl>
@@ -482,10 +501,16 @@ to the size available in the given buffer.</p>
<dl class="method">
<dt id="M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck">
-<code class="descname">serverPostConnectionCheck</code><span class="sig-paren">(</span><em>*args</em>, <em>**kw</em><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
+<code class="descname">serverPostConnectionCheck</code><span class="sig-paren">(</span><em>**kw</em><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set1_host">
+<code class="descname">set1_host</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set1_host"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set1_host" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the requested hostname to check in the server certificate.</p>
+</dd></dl>
+
+<dl class="method">
<dt id="M2Crypto.SSL.Connection.Connection.set_accept_state">
<code class="descname">set_accept_state</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_accept_state"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_accept_state" title="Permalink to this definition">¶</a></dt>
<dd><p>Sets Connection to work in the server mode.</p>
@@ -727,7 +752,7 @@ encode C structures as strings).</li>
</div>
<div class="section" id="module-M2Crypto.SSL.Context">
-<span id="context-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Context</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Context" title="Permalink to this headline">¶</a></h2>
+<span id="context-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Context</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Context" title="Permalink to this headline">¶</a></h2>
<dl class="function">
<dt id="M2Crypto.SSL.Context.ctxmap">
<code class="descclassname">M2Crypto.SSL.Context.</code><code class="descname">ctxmap</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#ctxmap"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.ctxmap" title="Permalink to this definition">¶</a></dt>
@@ -736,7 +761,8 @@ encode C structures as strings).</li>
<dl class="class">
<dt id="M2Crypto.SSL.Context.Context">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Context.</code><code class="descname">Context</code><span class="sig-paren">(</span><em>protocol='tls'</em>, <em>weak_crypto=None</em>, <em>post_connection_check=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context" title="Permalink to this definition">¶</a></dt>
-<dd><p>‘Context’ for SSL connections.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>‘Context’ for SSL connections.</p>
<dl class="method">
<dt id="M2Crypto.SSL.Context.Context.add_session">
<code class="descname">add_session</code><span class="sig-paren">(</span><em>session</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.add_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.add_session" title="Permalink to this definition">¶</a></dt>
@@ -1274,44 +1300,49 @@ verification checks.</li>
</div>
<div class="section" id="module-M2Crypto.SSL.SSLServer">
-<span id="sslserver-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">SSLServer</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.SSLServer" title="Permalink to this headline">¶</a></h2>
+<span id="sslserver-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">SSLServer</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.SSLServer" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.SSL.SSLServer.SSLServer">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.SSLServer.</code><code class="descname">SSLServer</code><span class="sig-paren">(</span><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">SocketServer.TCPServer</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">socketserver.TCPServer</span></code></p>
<dl class="method">
<dt id="M2Crypto.SSL.SSLServer.SSLServer.handle_error">
<code class="descname">handle_error</code><span class="sig-paren">(</span><em>request</em>, <em>client_address</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer.handle_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer.handle_error" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Handle an error gracefully. May be overridden.</p>
+<p>The default is to print a traceback and continue.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.SSL.SSLServer.SSLServer.handle_request">
<code class="descname">handle_request</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer.handle_request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer.handle_request" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Handle one request, possibly blocking.</p>
+<p>Respects self.timeout.</p>
+</dd></dl>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.SSL.SSLServer.ForkingSSLServer">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.SSLServer.</code><code class="descname">ForkingSSLServer</code><span class="sig-paren">(</span><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#ForkingSSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.ForkingSSLServer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">SocketServer.ForkingMixIn</span></code>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">socketserver.ForkingMixIn</span></code>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></code></a></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.SSL.SSLServer.ThreadingSSLServer">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.SSLServer.</code><code class="descname">ThreadingSSLServer</code><span class="sig-paren">(</span><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#ThreadingSSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.ThreadingSSLServer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">SocketServer.ThreadingMixIn</span></code>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">socketserver.ThreadingMixIn</span></code>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></code></a></p>
</dd></dl>
</div>
<div class="section" id="module-M2Crypto.SSL.Session">
-<span id="session-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Session</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Session" title="Permalink to this headline">¶</a></h2>
+<span id="session-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Session</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.Session" title="Permalink to this headline">¶</a></h2>
<p>SSL Session</p>
<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
<dl class="class">
<dt id="M2Crypto.SSL.Session.Session">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.Session.</code><code class="descname">Session</code><span class="sig-paren">(</span><em>session</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.SSL.Session.Session.as_der">
<code class="descname">as_der</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.as_der" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -1360,7 +1391,7 @@ verification checks.</li>
</div>
<div class="section" id="module-M2Crypto.SSL.TwistedProtocolWrapper">
-<span id="twistedprotocolwrapper-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">TwistedProtocolWrapper</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.TwistedProtocolWrapper" title="Permalink to this headline">¶</a></h2>
+<span id="twistedprotocolwrapper-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">TwistedProtocolWrapper</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.TwistedProtocolWrapper" title="Permalink to this headline">¶</a></h2>
<p>Make Twisted use M2Crypto for SSL</p>
<p>Copyright (c) 2004-2007 Open Source Applications Foundation.
All rights reserved.</p>
@@ -1369,14 +1400,14 @@ BEEN FINISHED. THE FURTHER WORK WILL BE DONE WHEN THE STATUS OF TWISTED
IN THE PYTHON 3 (AND ASYNCIO) WORLD WILL BE CLEAR.</p>
<dl class="function">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.connectSSL">
-<code class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</code><code class="descname">connectSSL</code><span class="sig-paren">(</span><em>host</em>, <em>port</em>, <em>factory</em>, <em>contextFactory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker instance&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectSSL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectSSL" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</code><code class="descname">connectSSL</code><span class="sig-paren">(</span><em>host</em>, <em>port</em>, <em>factory</em>, <em>contextFactory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker object&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectSSL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectSSL" title="Permalink to this definition">¶</a></dt>
<dd><p>A convenience function to start an SSL/TLS connection using Twisted.</p>
<p>See IReactorSSL interface in Twisted.</p>
</dd></dl>
<dl class="function">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.connectTCP">
-<code class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</code><code class="descname">connectTCP</code><span class="sig-paren">(</span><em>host</em>, <em>port</em>, <em>factory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker instance&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectTCP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectTCP" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</code><code class="descname">connectTCP</code><span class="sig-paren">(</span><em>host</em>, <em>port</em>, <em>factory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker object&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectTCP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectTCP" title="Permalink to this definition">¶</a></dt>
<dd><p>A convenience function to start a TCP connection using Twisted.</p>
<p>NOTE: You must call startTLS(ctx) to go into SSL/TLS mode.</p>
<p>See IReactorTCP interface in Twisted.</p>
@@ -1400,7 +1431,7 @@ IN THE PYTHON 3 (AND ASYNCIO) WORLD WILL BE CLEAR.</p>
<dl class="class">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</code><code class="descname">TLSProtocolWrapper</code><span class="sig-paren">(</span><em>factory</em>, <em>wrappedProtocol</em>, <em>startPassThrough</em>, <em>client</em>, <em>contextFactory</em>, <em>postConnectionCheck</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">twisted.protocols.policies.ProtocolWrapper</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">twisted.protocols.policies.ProtocolWrapper</span></code></p>
<p>A SSL/TLS protocol wrapper to be used with Twisted. Typically
you would not use this class directly. Use connectTCP,
connectSSL, listenTCP, listenSSL functions defined above,
@@ -1414,17 +1445,39 @@ which will hook in this class.</p>
<dl class="method">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost">
<code class="descname">connectionLost</code><span class="sig-paren">(</span><em>reason</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.connectionLost"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Called when the connection is shut down.</p>
+<p>Clear any circular references here, and any external references
+to this Protocol. The connection has been closed.</p>
+<p>&#64;type reason: L{twisted.python.failure.Failure}</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade">
<code class="descname">connectionMade</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.connectionMade"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Called when a connection is made.</p>
+<p>This may be considered the initializer of the protocol, because
+it is called when the connection is completed. For clients,
+this is called once the connection to the server has been
+established; for servers, this is called after an accept() call
+stops blocking and a socket has been received. If you need to
+send any greeting or initial message, do it here.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived">
<code class="descname">dataReceived</code><span class="sig-paren">(</span><em>data</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.dataReceived"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Called whenever data is received.</p>
+<p>Use this method to translate to a higher-level message. Usually, some
+callback will be made upon the receipt of each complete protocol
+message.</p>
+<dl class="docutils">
+<dt>&#64;param data: a string of indeterminate length. Please keep in mind</dt>
+<dd>that you will probably need to buffer some data, as partial
+(or multiple) protocol messages may be received! I recommend
+that unit tests for protocols call through to this method with
+differing chunk sizes, down to one byte at a time.</dd>
+</dl>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.loseConnection">
@@ -1452,7 +1505,7 @@ through untouched.</p>
</div>
<div class="section" id="module-M2Crypto.SSL.cb">
-<span id="cb-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">cb</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.cb" title="Permalink to this headline">¶</a></h2>
+<span id="cb-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">cb</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.cb" title="Permalink to this headline">¶</a></h2>
<dl class="function">
<dt id="M2Crypto.SSL.cb.ssl_verify_callback_stub">
<code class="descclassname">M2Crypto.SSL.cb.</code><code class="descname">ssl_verify_callback_stub</code><span class="sig-paren">(</span><em>ssl_ctx_ptr</em>, <em>x509_ptr</em>, <em>errnum</em>, <em>errdepth</em>, <em>ok</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/cb.html#ssl_verify_callback_stub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.cb.ssl_verify_callback_stub" title="Permalink to this definition">¶</a></dt>
@@ -1475,11 +1528,11 @@ through untouched.</p>
</div>
<div class="section" id="module-M2Crypto.SSL.ssl_dispatcher">
-<span id="ssl-dispatcher-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">ssl_dispatcher</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.ssl_dispatcher" title="Permalink to this headline">¶</a></h2>
+<span id="ssl-dispatcher-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">ssl_dispatcher</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.ssl_dispatcher" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.ssl_dispatcher.</code><code class="descname">ssl_dispatcher</code><span class="sig-paren">(</span><em>sock=None</em>, <em>map=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">asyncore.dispatcher</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">asyncore.dispatcher</span></code></p>
<dl class="method">
<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect">
<code class="descname">connect</code><span class="sig-paren">(</span><em>addr</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect" title="Permalink to this definition">¶</a></dt>
@@ -1506,14 +1559,15 @@ through untouched.</p>
</div>
<div class="section" id="module-M2Crypto.SSL.timeout">
-<span id="timeout-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">timeout</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.timeout" title="Permalink to this headline">¶</a></h2>
+<span id="timeout-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">timeout</span></code> Module<a class="headerlink" href="#module-M2Crypto.SSL.timeout" title="Permalink to this headline">¶</a></h2>
<p>Support for SSL socket timeouts.</p>
<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
<p>Copyright 2008 Heikki Toivonen. All rights reserved.</p>
<dl class="class">
<dt id="M2Crypto.SSL.timeout.timeout">
<em class="property">class </em><code class="descclassname">M2Crypto.SSL.timeout.</code><code class="descname">timeout</code><span class="sig-paren">(</span><em>sec=600</em>, <em>microsec=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.timeout" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.SSL.timeout.timeout.pack">
<code class="descname">pack</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#timeout.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.timeout.pack" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -1535,27 +1589,70 @@ through untouched.</p>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">SSL Package</a><ul>
-<li><a class="reference internal" href="#id1"><code class="docutils literal"><span class="pre">SSL</span></code> Package</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.Checker"><code class="docutils literal"><span class="pre">Checker</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.Cipher"><code class="docutils literal"><span class="pre">Cipher</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.Connection"><code class="docutils literal"><span class="pre">Connection</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.Context"><code class="docutils literal"><span class="pre">Context</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.SSLServer"><code class="docutils literal"><span class="pre">SSLServer</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.Session"><code class="docutils literal"><span class="pre">Session</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.cb"><code class="docutils literal"><span class="pre">cb</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SSL.timeout"><code class="docutils literal"><span class="pre">timeout</span></code> Module</a></li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a><ul class="current">
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#id1"><code class="docutils literal notranslate"><span class="pre">M2Crypto</span></code> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ASN1"><code class="docutils literal notranslate"><span class="pre">ASN1</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.AuthCookie"><code class="docutils literal notranslate"><span class="pre">AuthCookie</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BIO"><code class="docutils literal notranslate"><span class="pre">BIO</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BN"><code class="docutils literal notranslate"><span class="pre">BN</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DH"><code class="docutils literal notranslate"><span class="pre">DH</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DSA"><code class="docutils literal notranslate"><span class="pre">DSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EC"><code class="docutils literal notranslate"><span class="pre">EC</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EVP"><code class="docutils literal notranslate"><span class="pre">EVP</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Engine"><code class="docutils literal notranslate"><span class="pre">Engine</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Err"><code class="docutils literal notranslate"><span class="pre">Err</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RC4"><code class="docutils literal notranslate"><span class="pre">RC4</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RSA"><code class="docutils literal notranslate"><span class="pre">RSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Rand"><code class="docutils literal notranslate"><span class="pre">Rand</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.SMIME"><code class="docutils literal notranslate"><span class="pre">SMIME</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.X509"><code class="docutils literal notranslate"><span class="pre">X509</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.callback"><code class="docutils literal notranslate"><span class="pre">callback</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ftpslib"><code class="docutils literal notranslate"><span class="pre">ftpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.httpslib"><code class="docutils literal notranslate"><span class="pre">httpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2"><code class="docutils literal notranslate"><span class="pre">m2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2crypto"><code class="docutils literal notranslate"><span class="pre">m2crypto</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib"><code class="docutils literal notranslate"><span class="pre">m2urllib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib2"><code class="docutils literal notranslate"><span class="pre">m2urllib2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2xmlrpclib"><code class="docutils literal notranslate"><span class="pre">m2xmlrpclib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.threading"><code class="docutils literal notranslate"><span class="pre">threading</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.util"><code class="docutils literal notranslate"><span class="pre">util</span></code> Module</a></li>
+<li class="toctree-l2 current"><a class="reference internal" href="M2Crypto.html#subpackages">Subpackages</a><ul class="current">
+<li class="toctree-l3 current"><a class="current reference internal" href="#">SSL Package</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="#id1"><code class="docutils literal notranslate"><span class="pre">SSL</span></code> Package</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.Checker"><code class="docutils literal notranslate"><span class="pre">Checker</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.Cipher"><code class="docutils literal notranslate"><span class="pre">Cipher</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.Connection"><code class="docutils literal notranslate"><span class="pre">Connection</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.Context"><code class="docutils literal notranslate"><span class="pre">Context</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.SSLServer"><code class="docutils literal notranslate"><span class="pre">SSLServer</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.Session"><code class="docutils literal notranslate"><span class="pre">Session</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal notranslate"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.cb"><code class="docutils literal notranslate"><span class="pre">cb</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal notranslate"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="#module-M2Crypto.SSL.timeout"><code class="docutils literal notranslate"><span class="pre">timeout</span></code> Module</a></li>
+</ul>
+</li>
</ul>
</li>
</ul>
+</li>
+</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -1566,23 +1663,26 @@ through untouched.</p>
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/M2Crypto.SSL.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -1591,8 +1691,8 @@ through untouched.</p>
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/M2Crypto.SSL.rst.txt"
diff --git a/doc/html/M2Crypto.html b/doc/html/M2Crypto.html
index eb54dcf..b659a5e 100644
--- a/doc/html/M2Crypto.html
+++ b/doc/html/M2Crypto.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto Package &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="SSL Package" href="M2Crypto.SSL.html" />
@@ -31,26 +24,28 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="m2crypto-package">
<h1>M2Crypto Package<a class="headerlink" href="#m2crypto-package" title="Permalink to this headline">¶</a></h1>
<div class="section" id="id1">
-<h2><code class="xref py py-mod docutils literal"><span class="pre">M2Crypto</span></code> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">M2Crypto</span></code> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
<span class="target" id="module-M2Crypto.__init__"></span></div>
<div class="section" id="module-M2Crypto.ASN1">
-<span id="asn1-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">ASN1</span></code> Module<a class="headerlink" href="#module-M2Crypto.ASN1" title="Permalink to this headline">¶</a></h2>
+<span id="asn1-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">ASN1</span></code> Module<a class="headerlink" href="#module-M2Crypto.ASN1" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.ASN1.ASN1_Integer">
<em class="property">class </em><code class="descclassname">M2Crypto.ASN1.</code><code class="descname">ASN1_Integer</code><span class="sig-paren">(</span><em>asn1int</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_Integer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Integer" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.ASN1.ASN1_Integer.m2_asn1_integer_free">
<code class="descname">m2_asn1_integer_free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Integer.m2_asn1_integer_free" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -60,7 +55,8 @@
<dl class="class">
<dt id="M2Crypto.ASN1.ASN1_Object">
<em class="property">class </em><code class="descclassname">M2Crypto.ASN1.</code><code class="descname">ASN1_Object</code><span class="sig-paren">(</span><em>asn1obj</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_Object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Object" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.ASN1.ASN1_Object.m2_asn1_object_free">
<code class="descname">m2_asn1_object_free</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Object.m2_asn1_object_free" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -70,7 +66,8 @@
<dl class="class">
<dt id="M2Crypto.ASN1.ASN1_String">
<em class="property">class </em><code class="descclassname">M2Crypto.ASN1.</code><code class="descname">ASN1_String</code><span class="sig-paren">(</span><em>asn1str</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_String"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_String" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.ASN1.ASN1_String.as_text">
<code class="descname">as_text</code><span class="sig-paren">(</span><em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_String.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_String.as_text" title="Permalink to this definition">¶</a></dt>
<dd><p>Output an ASN1_STRING structure according to the set flags.</p>
@@ -98,7 +95,8 @@ manpage for their meaning.</td>
<dl class="class">
<dt id="M2Crypto.ASN1.ASN1_TIME">
<em class="property">class </em><code class="descclassname">M2Crypto.ASN1.</code><code class="descname">ASN1_TIME</code><span class="sig-paren">(</span><em>asn1_time=None</em>, <em>_pyfree=0</em>, <em>asn1_utctime=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.ASN1.ASN1_TIME.get_datetime">
<code class="descname">get_datetime</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME.get_datetime"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.get_datetime" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -130,38 +128,42 @@ manpage for their meaning.</td>
<dl class="attribute">
<dt id="M2Crypto.ASN1.ASN1_UTCTIME">
<code class="descclassname">M2Crypto.ASN1.</code><code class="descname">ASN1_UTCTIME</code><a class="headerlink" href="#M2Crypto.ASN1.ASN1_UTCTIME" title="Permalink to this definition">¶</a></dt>
-<dd><p>alias of <a class="reference internal" href="#M2Crypto.ASN1.ASN1_TIME" title="M2Crypto.ASN1.ASN1_TIME"><code class="xref py py-class docutils literal"><span class="pre">ASN1_TIME</span></code></a></p>
+<dd><p>alias of <a class="reference internal" href="#M2Crypto.ASN1.ASN1_TIME" title="M2Crypto.ASN1.ASN1_TIME"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.ASN1.ASN1_TIME</span></code></a></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.ASN1.LocalTimezone">
<em class="property">class </em><code class="descclassname">M2Crypto.ASN1.</code><code class="descname">LocalTimezone</code><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">datetime.tzinfo</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.tzinfo</span></code></p>
<p>Localtimezone from datetime manual.</p>
<dl class="method">
<dt id="M2Crypto.ASN1.LocalTimezone.dst">
<code class="descname">dst</code><span class="sig-paren">(</span><em>dt</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.dst"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.dst" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>datetime -&gt; DST offset as timedelta positive east of UTC.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.ASN1.LocalTimezone.tzname">
<code class="descname">tzname</code><span class="sig-paren">(</span><em>dt</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.tzname"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.tzname" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>datetime -&gt; string name of time zone.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.ASN1.LocalTimezone.utcoffset">
<code class="descname">utcoffset</code><span class="sig-paren">(</span><em>dt</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.utcoffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.utcoffset" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>datetime -&gt; timedelta showing offset from UTC, negative values indicating West of UTC</p>
+</dd></dl>
</dd></dl>
</div>
<div class="section" id="module-M2Crypto.AuthCookie">
-<span id="authcookie-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">AuthCookie</span></code> Module<a class="headerlink" href="#module-M2Crypto.AuthCookie" title="Permalink to this headline">¶</a></h2>
+<span id="authcookie-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">AuthCookie</span></code> Module<a class="headerlink" href="#module-M2Crypto.AuthCookie" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.AuthCookie.AuthCookie">
<em class="property">class </em><code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">AuthCookie</code><span class="sig-paren">(</span><em>expiry</em>, <em>data</em>, <em>dough</em>, <em>mac</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.AuthCookie.AuthCookie.data">
<code class="descname">data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.data" title="Permalink to this definition">¶</a></dt>
<dd><p>Return the data portion of the cookie.</p>
@@ -212,7 +214,8 @@ manpage for their meaning.</td>
<dl class="class">
<dt id="M2Crypto.AuthCookie.AuthCookieJar">
<em class="property">class </em><code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">AuthCookieJar</code><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie">
<code class="descname">isGoodCookie</code><span class="sig-paren">(</span><em>cookie</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar.isGoodCookie"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -252,21 +255,21 @@ manpage for their meaning.</td>
<dl class="function">
<dt id="M2Crypto.AuthCookie.unmix">
-<code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">unmix</code><span class="sig-paren">(</span><em>dough</em>, <em>regex=&lt;_sre.SRE_Pattern object&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">unmix</code><span class="sig-paren">(</span><em>dough</em>, <em>regex=re.compile('exp=(\\d+\\.\\d+)&amp;data=(.+)&amp;digest=(\\S*)')</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="function">
<dt id="M2Crypto.AuthCookie.unmix3">
-<code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">unmix3</code><span class="sig-paren">(</span><em>dough</em>, <em>regex=&lt;_sre.SRE_Pattern object&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix3"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix3" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.AuthCookie.</code><code class="descname">unmix3</code><span class="sig-paren">(</span><em>dough</em>, <em>regex=re.compile('exp=(\\d+\\.\\d+)&amp;data=(.+)&amp;digest=(\\S*)')</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix3"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix3" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
</div>
<div class="section" id="module-M2Crypto.BIO">
-<span id="bio-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">BIO</span></code> Module<a class="headerlink" href="#module-M2Crypto.BIO" title="Permalink to this headline">¶</a></h2>
+<span id="bio-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">BIO</span></code> Module<a class="headerlink" href="#module-M2Crypto.BIO" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.BIO.BIO">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">BIO</code><span class="sig-paren">(</span><em>bio=None</em>, <em>_pyfree=0</em>, <em>_close_cb=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">object</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Abstract object interface to the BIO API.</p>
<dl class="method">
<dt id="M2Crypto.BIO.BIO.bio_ptr">
@@ -397,13 +400,13 @@ ie do_handshake</p>
<dl class="exception">
<dt id="M2Crypto.BIO.BIOError">
<em class="property">exception </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">BIOError</code><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIOError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIOError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.BIO.CipherStream">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">CipherStream</code><span class="sig-paren">(</span><em>obio</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#CipherStream"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.CipherStream" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
<p>Object interface to BIO_f_cipher.</p>
<dl class="attribute">
<dt id="M2Crypto.BIO.CipherStream.SALT_LEN">
@@ -440,7 +443,7 @@ ie do_handshake</p>
<dl class="class">
<dt id="M2Crypto.BIO.File">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">File</code><span class="sig-paren">(</span><em>pyfile</em>, <em>close_pyfile=1</em>, <em>mode='rb'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#File"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.File" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
<p>Object interface to BIO_s_pyfd.</p>
<p>This class interfaces Python to OpenSSL functions that expect BIO. For
general file manipulation in Python, use Python’s builtin file object.</p>
@@ -452,7 +455,16 @@ general file manipulation in Python, use Python’s builtin file object.</p>
<dl class="method">
<dt id="M2Crypto.BIO.File.flush">
<code class="descname">flush</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#File.flush"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.File.flush" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Flush the buffers.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 for success, and 0 or -1 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.BIO.File.reset">
@@ -473,7 +485,7 @@ general file manipulation in Python, use Python’s builtin file object.</p>
<dl class="class">
<dt id="M2Crypto.BIO.IOBuffer">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">IOBuffer</code><span class="sig-paren">(</span><em>under_bio</em>, <em>mode='rwb'</em>, <em>_pyfree=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#IOBuffer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.IOBuffer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
<p>Object interface to BIO_f_buffer.</p>
<p>Its principal function is to be BIO_push()’ed on top of a BIO_f_ssl, so
that makefile() of said underlying SSL socket works.</p>
@@ -497,7 +509,7 @@ that makefile() of said underlying SSL socket works.</p>
<dl class="class">
<dt id="M2Crypto.BIO.MemoryBuffer">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">MemoryBuffer</code><span class="sig-paren">(</span><em>data=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#MemoryBuffer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
<p>Object interface to BIO_s_mem.</p>
<p>Empirical testing suggests that this class performs less well than
cStringIO, because cStringIO is implemented in C, whereas this class
@@ -534,7 +546,7 @@ a MemoryBuffer object only when necessary.</p>
<dl class="class">
<dt id="M2Crypto.BIO.SSLBio">
<em class="property">class </em><code class="descclassname">M2Crypto.BIO.</code><code class="descname">SSLBio</code><span class="sig-paren">(</span><em>_pyfree=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BIO.html#SSLBio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.SSLBio" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.BIO.BIO</span></code></a></p>
<p>Object interface to BIO_f_ssl.</p>
<dl class="method">
<dt id="M2Crypto.BIO.SSLBio.do_handshake">
@@ -560,7 +572,7 @@ contained in the connection object.</p>
</div>
<div class="section" id="module-M2Crypto.BN">
-<span id="bn-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">BN</span></code> Module<a class="headerlink" href="#module-M2Crypto.BN" title="Permalink to this headline">¶</a></h2>
+<span id="bn-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">BN</span></code> Module<a class="headerlink" href="#module-M2Crypto.BN" title="Permalink to this headline">¶</a></h2>
<dl class="function">
<dt id="M2Crypto.BN.rand">
<code class="descclassname">M2Crypto.BN.</code><code class="descname">rand</code><span class="sig-paren">(</span><em>bits</em>, <em>top=-1</em>, <em>bottom=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/BN.html#rand"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BN.rand" title="Permalink to this definition">¶</a></dt>
@@ -617,11 +629,12 @@ the characters are from the set [a-zA-Z0-9].</p>
</div>
<div class="section" id="module-M2Crypto.DH">
-<span id="dh-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">DH</span></code> Module<a class="headerlink" href="#module-M2Crypto.DH" title="Permalink to this headline">¶</a></h2>
+<span id="dh-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">DH</span></code> Module<a class="headerlink" href="#module-M2Crypto.DH" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.DH.DH">
<em class="property">class </em><code class="descclassname">M2Crypto.DH.</code><code class="descname">DH</code><span class="sig-paren">(</span><em>dh</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/DH.html#DH"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH" title="Permalink to this definition">¶</a></dt>
-<dd><p>Object interface to the Diffie-Hellman key exchange protocol.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Object interface to the Diffie-Hellman key exchange protocol.</p>
<dl class="method">
<dt id="M2Crypto.DH.DH.check_params">
<code class="descname">check_params</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/DH.html#DH.check_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH.check_params" title="Permalink to this definition">¶</a></dt>
@@ -652,7 +665,7 @@ the characters are from the set [a-zA-Z0-9].</p>
<dl class="exception">
<dt id="M2Crypto.DH.DHError">
<em class="property">exception </em><code class="descclassname">M2Crypto.DH.</code><code class="descname">DHError</code><a class="reference internal" href="_modules/M2Crypto/DH.html#DHError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DHError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="function">
@@ -677,14 +690,15 @@ the characters are from the set [a-zA-Z0-9].</p>
</div>
<div class="section" id="module-M2Crypto.DSA">
-<span id="dsa-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">DSA</span></code> Module<a class="headerlink" href="#module-M2Crypto.DSA" title="Permalink to this headline">¶</a></h2>
+<span id="dsa-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">DSA</span></code> Module<a class="headerlink" href="#module-M2Crypto.DSA" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.DSA.DSA">
<em class="property">class </em><code class="descclassname">M2Crypto.DSA.</code><code class="descname">DSA</code><span class="sig-paren">(</span><em>dsa</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA" title="Permalink to this definition">¶</a></dt>
-<dd><p>This class is a context supporting DSA key and parameter
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>This class is a context supporting DSA key and parameter
values, signing and verifying.</p>
<p>Simple example:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">DSA</span><span class="p">,</span> <span class="n">util</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">DSA</span><span class="p">,</span> <span class="n">util</span>
<span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;Kilroy was here!&#39;</span>
<span class="n">md</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">MessageDigest</span><span class="p">(</span><span class="s1">&#39;sha1&#39;</span><span class="p">)</span>
@@ -922,13 +936,13 @@ from MessageDigest, a “byte string”)</li>
<dl class="exception">
<dt id="M2Crypto.DSA.DSAError">
<em class="property">exception </em><code class="descclassname">M2Crypto.DSA.</code><code class="descname">DSAError</code><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSAError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSAError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.DSA.DSA_pub">
<em class="property">class </em><code class="descclassname">M2Crypto.DSA.</code><code class="descname">DSA_pub</code><span class="sig-paren">(</span><em>dsa</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA_pub" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.DSA.DSA" title="M2Crypto.DSA.DSA"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.DSA.DSA</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.DSA.DSA" title="M2Crypto.DSA.DSA"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.DSA.DSA</span></code></a></p>
<p>This class is a DSA context that only supports a public key
and verification. It does NOT support a private key or
signing.</p>
@@ -982,12 +996,38 @@ to this object.</td>
<dl class="method">
<dt id="M2Crypto.DSA.DSA_pub.sign">
<code class="descname">sign</code><span class="sig-paren">(</span><em>*argv</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA_pub.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.sign" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Sign the digest.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>digest</strong> – SHA-1 hash of message (same as output
+from MessageDigest, a “byte string”)</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">DSA signature, a tuple of two values, r and s,
+both “byte strings”.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.DSA.DSA_pub.sign_asn1">
<code class="descname">sign_asn1</code><span class="sig-paren">(</span><em>*argv</em><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.sign_asn1" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Sign the digest.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>digest</strong> – SHA-1 hash of message (same as output
+from MessageDigest, a “byte string”)</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">DSA signature, a tuple of two values, r and s,
+both “byte strings”.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
</dd></dl>
@@ -1217,11 +1257,12 @@ parameters.</p>
</div>
<div class="section" id="module-M2Crypto.EC">
-<span id="ec-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">EC</span></code> Module<a class="headerlink" href="#module-M2Crypto.EC" title="Permalink to this headline">¶</a></h2>
+<span id="ec-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">EC</span></code> Module<a class="headerlink" href="#module-M2Crypto.EC" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.EC.EC">
<em class="property">class </em><code class="descclassname">M2Crypto.EC.</code><code class="descname">EC</code><span class="sig-paren">(</span><em>ec</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EC.html#EC"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC" title="Permalink to this definition">¶</a></dt>
-<dd><p>Object interface to a EC key pair.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Object interface to a EC key pair.</p>
<dl class="method">
<dt id="M2Crypto.EC.EC.as_pem">
<code class="descname">as_pem</code><span class="sig-paren">(</span><em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.as_pem" title="Permalink to this definition">¶</a></dt>
@@ -1248,7 +1289,7 @@ applied.</p>
<dt id="M2Crypto.EC.EC.gen_key">
<code class="descname">gen_key</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.gen_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.gen_key" title="Permalink to this definition">¶</a></dt>
<dd><p>Generates the key pair from its parameters. Use:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">keypair</span> <span class="o">=</span> <span class="n">EC</span><span class="o">.</span><span class="n">gen_params</span><span class="p">(</span><span class="n">curve</span><span class="p">)</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">keypair</span> <span class="o">=</span> <span class="n">EC</span><span class="o">.</span><span class="n">gen_params</span><span class="p">(</span><span class="n">curve</span><span class="p">)</span>
<span class="n">keypair</span><span class="o">.</span><span class="n">gen_key</span><span class="p">()</span>
</pre></div>
</div>
@@ -1370,13 +1411,13 @@ signature parameters.</p>
<dl class="exception">
<dt id="M2Crypto.EC.ECError">
<em class="property">exception </em><code class="descclassname">M2Crypto.EC.</code><code class="descname">ECError</code><a class="reference internal" href="_modules/M2Crypto/EC.html#ECError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.ECError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.EC.EC_pub">
<em class="property">class </em><code class="descclassname">M2Crypto.EC.</code><code class="descname">EC_pub</code><span class="sig-paren">(</span><em>ec</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EC.html#EC_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC_pub" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.EC.EC" title="M2Crypto.EC.EC"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.EC.EC</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.EC.EC" title="M2Crypto.EC.EC"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.EC.EC</span></code></a></p>
<p>Object interface to an EC public key.
((don’t like this implementation inheritance))</p>
<dl class="method">
@@ -1580,11 +1621,12 @@ format.</td>
</div>
<div class="section" id="module-M2Crypto.EVP">
-<span id="evp-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">EVP</span></code> Module<a class="headerlink" href="#module-M2Crypto.EVP" title="Permalink to this headline">¶</a></h2>
+<span id="evp-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">EVP</span></code> Module<a class="headerlink" href="#module-M2Crypto.EVP" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.EVP.Cipher">
-<em class="property">class </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">Cipher</code><span class="sig-paren">(</span><em>alg</em>, <em>key</em>, <em>iv</em>, <em>op</em>, <em>key_as_bytes=0</em>, <em>d='md5'</em>, <em>salt='12345678'</em>, <em>i=1</em>, <em>padding=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<em class="property">class </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">Cipher</code><span class="sig-paren">(</span><em>alg</em>, <em>key</em>, <em>iv</em>, <em>op</em>, <em>key_as_bytes=0</em>, <em>d='md5'</em>, <em>salt=b'12345678'</em>, <em>i=1</em>, <em>padding=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.EVP.Cipher.final">
<code class="descname">final</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher.final" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -1610,13 +1652,14 @@ format.</td>
<dl class="exception">
<dt id="M2Crypto.EVP.EVPError">
<em class="property">exception </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">EVPError</code><a class="reference internal" href="_modules/M2Crypto/EVP.html#EVPError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.EVPError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.EVP.HMAC">
<em class="property">class </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">HMAC</code><span class="sig-paren">(</span><em>key</em>, <em>algo='sha1'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#HMAC"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.HMAC" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.EVP.HMAC.digest">
<code class="descname">digest</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.EVP.HMAC.digest" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -1646,7 +1689,8 @@ format.</td>
<dl class="class">
<dt id="M2Crypto.EVP.MessageDigest">
<em class="property">class </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">MessageDigest</code><span class="sig-paren">(</span><em>algo</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#MessageDigest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.MessageDigest" title="Permalink to this definition">¶</a></dt>
-<dd><p>Message Digest</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Message Digest</p>
<dl class="method">
<dt id="M2Crypto.EVP.MessageDigest.digest">
<code class="descname">digest</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.EVP.MessageDigest.digest" title="Permalink to this definition">¶</a></dt>
@@ -1681,7 +1725,8 @@ format.</td>
<dl class="class">
<dt id="M2Crypto.EVP.PKey">
<em class="property">class </em><code class="descclassname">M2Crypto.EVP.</code><code class="descname">PKey</code><span class="sig-paren">(</span><em>pkey=None</em>, <em>_pyfree=0</em>, <em>md='sha1'</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey" title="Permalink to this definition">¶</a></dt>
-<dd><p>Public Key</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Public Key</p>
<dl class="method">
<dt id="M2Crypto.EVP.PKey.as_der">
<code class="descname">as_der</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.as_der" title="Permalink to this definition">¶</a></dt>
@@ -1698,7 +1743,7 @@ format.</td>
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>cipher</strong> – Symmetric cipher to protect the key. The default
-cipher is <code class="docutils literal"><span class="pre">'aes_128_cbc'</span></code>. If cipher is None,
+cipher is <code class="docutils literal notranslate"><span class="pre">'aes_128_cbc'</span></code>. If cipher is None,
then the key is saved in the clear.</li>
<li><strong>callback</strong> – A Python callable object that is invoked
to acquire a passphrase with which to protect
@@ -2073,14 +2118,12 @@ key.</li>
</div>
<div class="section" id="module-M2Crypto.Engine">
-<span id="engine-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Engine</span></code> Module<a class="headerlink" href="#module-M2Crypto.Engine" title="Permalink to this headline">¶</a></h2>
-<p>M2Crypto wrapper for OpenSSL ENGINE API.</p>
-<p>Pavel Shramov
-IMEC MSU</p>
+<span id="engine-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Engine</span></code> Module<a class="headerlink" href="#module-M2Crypto.Engine" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.Engine.Engine">
<em class="property">class </em><code class="descclassname">M2Crypto.Engine.</code><code class="descname">Engine</code><span class="sig-paren">(</span><em>id=None</em>, <em>_ptr=None</em>, <em>_pyfree=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine" title="Permalink to this definition">¶</a></dt>
-<dd><p>Wrapper for ENGINE object.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Wrapper for ENGINE object.</p>
<dl class="method">
<dt id="M2Crypto.Engine.Engine.ctrl_cmd_string">
<code class="descname">ctrl_cmd_string</code><span class="sig-paren">(</span><em>cmd</em>, <em>arg</em>, <em>optional=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.ctrl_cmd_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.ctrl_cmd_string" title="Permalink to this definition">¶</a></dt>
@@ -2163,7 +2206,7 @@ If pin is not set it will be asked</p>
<dl class="exception">
<dt id="M2Crypto.Engine.EngineError">
<em class="property">exception </em><code class="descclassname">M2Crypto.Engine.</code><code class="descname">EngineError</code><a class="reference internal" href="_modules/M2Crypto/Engine.html#EngineError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.EngineError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="function">
@@ -2193,17 +2236,17 @@ is finished with the engines.</p>
</div>
<div class="section" id="module-M2Crypto.Err">
-<span id="err-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Err</span></code> Module<a class="headerlink" href="#module-M2Crypto.Err" title="Permalink to this headline">¶</a></h2>
+<span id="err-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Err</span></code> Module<a class="headerlink" href="#module-M2Crypto.Err" title="Permalink to this headline">¶</a></h2>
<dl class="exception">
<dt id="M2Crypto.Err.M2CryptoError">
<em class="property">exception </em><code class="descclassname">M2Crypto.Err.</code><code class="descname">M2CryptoError</code><a class="reference internal" href="_modules/M2Crypto/Err.html#M2CryptoError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.M2CryptoError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="exception">
<dt id="M2Crypto.Err.SSLError">
<em class="property">exception </em><code class="descclassname">M2Crypto.Err.</code><code class="descname">SSLError</code><span class="sig-paren">(</span><em>err</em>, <em>client_addr</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/Err.html#SSLError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.SSLError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="function">
@@ -2248,11 +2291,12 @@ is finished with the engines.</p>
</div>
<div class="section" id="module-M2Crypto.RC4">
-<span id="rc4-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">RC4</span></code> Module<a class="headerlink" href="#module-M2Crypto.RC4" title="Permalink to this headline">¶</a></h2>
+<span id="rc4-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">RC4</span></code> Module<a class="headerlink" href="#module-M2Crypto.RC4" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.RC4.RC4">
<em class="property">class </em><code class="descclassname">M2Crypto.RC4.</code><code class="descname">RC4</code><span class="sig-paren">(</span><em>key=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4" title="Permalink to this definition">¶</a></dt>
-<dd><p>Object interface to the stream cipher RC4.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Object interface to the stream cipher RC4.</p>
<dl class="method">
<dt id="M2Crypto.RC4.RC4.final">
<code class="descname">final</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4.final" title="Permalink to this definition">¶</a></dt>
@@ -2277,11 +2321,12 @@ is finished with the engines.</p>
</div>
<div class="section" id="module-M2Crypto.RSA">
-<span id="rsa-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">RSA</span></code> Module<a class="headerlink" href="#module-M2Crypto.RSA" title="Permalink to this headline">¶</a></h2>
+<span id="rsa-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">RSA</span></code> Module<a class="headerlink" href="#module-M2Crypto.RSA" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.RSA.RSA">
<em class="property">class </em><code class="descclassname">M2Crypto.RSA.</code><code class="descname">RSA</code><span class="sig-paren">(</span><em>rsa</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA" title="Permalink to this definition">¶</a></dt>
-<dd><p>RSA Key Pair.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>RSA Key Pair.</p>
<dl class="method">
<dt id="M2Crypto.RSA.RSA.as_pem">
<code class="descname">as_pem</code><span class="sig-paren">(</span><em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.as_pem" title="Permalink to this definition">¶</a></dt>
@@ -2291,7 +2336,9 @@ is finished with the engines.</p>
<dl class="method">
<dt id="M2Crypto.RSA.RSA.check_key">
<code class="descname">check_key</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.check_key" title="Permalink to this definition">¶</a></dt>
-<dd><table class="docutils field-list" frame="void" rules="none">
+<dd><p>Validate RSA keys.</p>
+<p>It checks that p and q are in fact prime, and that n = p*q.</p>
+<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
@@ -2565,18 +2612,31 @@ verified or not.</p>
<dl class="exception">
<dt id="M2Crypto.RSA.RSAError">
<em class="property">exception </em><code class="descclassname">M2Crypto.RSA.</code><code class="descname">RSAError</code><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSAError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSAError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.RSA.RSA_pub">
<em class="property">class </em><code class="descclassname">M2Crypto.RSA.</code><code class="descname">RSA_pub</code><span class="sig-paren">(</span><em>rsa</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.RSA.RSA" title="M2Crypto.RSA.RSA"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.RSA.RSA</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.RSA.RSA" title="M2Crypto.RSA.RSA"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.RSA.RSA</span></code></a></p>
<p>Object interface to an RSA public key.</p>
<dl class="method">
<dt id="M2Crypto.RSA.RSA_pub.check_key">
<code class="descname">check_key</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.check_key" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Validate RSA keys.</p>
+<p>It checks that p and q are in fact prime, and that n = p*q.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">returns 1 if rsa is a valid RSA key, and 0 otherwise.
+-1 is returned if an error occurs while checking the key.
+If the key is invalid or an error occurred, the reason
+code can be obtained using ERR_get_error(3).</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.RSA.RSA_pub.private_decrypt">
@@ -2629,7 +2689,7 @@ keygen_callback.</li>
<dl class="function">
<dt id="M2Crypto.RSA.keygen_callback">
-<code class="descclassname">M2Crypto.RSA.</code><code class="descname">keygen_callback</code><span class="sig-paren">(</span><em>p</em>, <em>n</em>, <em>out=&lt;open file '&lt;stdout&gt;'</em>, <em>mode 'w'&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#keygen_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.keygen_callback" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.RSA.</code><code class="descname">keygen_callback</code><span class="sig-paren">(</span><em>p</em>, <em>n</em>, <em>out=&lt;_io.TextIOWrapper name='&lt;stdout&gt;' mode='w' encoding='UTF-8'&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/RSA.html#keygen_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.keygen_callback" title="Permalink to this definition">¶</a></dt>
<dd><p>Default callback for gen_key().</p>
</dd></dl>
@@ -2768,7 +2828,7 @@ appropriate number of bits.</li>
</div>
<div class="section" id="module-M2Crypto.Rand">
-<span id="rand-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">Rand</span></code> Module<a class="headerlink" href="#module-M2Crypto.Rand" title="Permalink to this headline">¶</a></h2>
+<span id="rand-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">Rand</span></code> Module<a class="headerlink" href="#module-M2Crypto.Rand" title="Permalink to this headline">¶</a></h2>
<p>M2Crypto wrapper for OpenSSL PRNG. Requires OpenSSL 0.9.5 and above.</p>
<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.
Copyright (c) 2014-2017 Matej Cepl. All rights reserved.</p>
@@ -2930,18 +2990,20 @@ data, 0 otherwise.</td>
</div>
<div class="section" id="module-M2Crypto.SMIME">
-<span id="smime-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">SMIME</span></code> Module<a class="headerlink" href="#module-M2Crypto.SMIME" title="Permalink to this headline">¶</a></h2>
+<span id="smime-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">SMIME</span></code> Module<a class="headerlink" href="#module-M2Crypto.SMIME" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.SMIME.Cipher">
<em class="property">class </em><code class="descclassname">M2Crypto.SMIME.</code><code class="descname">Cipher</code><span class="sig-paren">(</span><em>algo</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SMIME.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.Cipher" title="Permalink to this definition">¶</a></dt>
-<dd><p>Object interface to EVP_CIPHER without all the frills of
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>Object interface to EVP_CIPHER without all the frills of
M2Crypto.EVP.Cipher.</p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.SMIME.PKCS7">
<em class="property">class </em><code class="descclassname">M2Crypto.SMIME.</code><code class="descname">PKCS7</code><span class="sig-paren">(</span><em>pkcs7=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.SMIME.PKCS7.get0_signers">
<code class="descname">get0_signers</code><span class="sig-paren">(</span><em>certs</em>, <em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7.get0_signers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.get0_signers" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -2971,13 +3033,14 @@ M2Crypto.EVP.Cipher.</p>
<dl class="exception">
<dt id="M2Crypto.SMIME.PKCS7_Error">
<em class="property">exception </em><code class="descclassname">M2Crypto.SMIME.</code><code class="descname">PKCS7_Error</code><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7_Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7_Error" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.SMIME.SMIME">
<em class="property">class </em><code class="descclassname">M2Crypto.SMIME.</code><code class="descname">SMIME</code><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<dl class="method">
<dt id="M2Crypto.SMIME.SMIME.decrypt">
<code class="descname">decrypt</code><span class="sig-paren">(</span><em>pkcs7</em>, <em>flags=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.decrypt" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -3052,7 +3115,7 @@ M2Crypto.EVP.Cipher.</p>
<dl class="exception">
<dt id="M2Crypto.SMIME.SMIME_Error">
<em class="property">exception </em><code class="descclassname">M2Crypto.SMIME.</code><code class="descname">SMIME_Error</code><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME_Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME_Error" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="function">
@@ -3097,11 +3160,12 @@ M2Crypto.EVP.Cipher.</p>
</div>
<div class="section" id="module-M2Crypto.X509">
-<span id="x509-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">X509</span></code> Module<a class="headerlink" href="#module-M2Crypto.X509" title="Permalink to this headline">¶</a></h2>
+<span id="x509-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">X509</span></code> Module<a class="headerlink" href="#module-M2Crypto.X509" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.X509.CRL">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">CRL</code><span class="sig-paren">(</span><em>crl=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#CRL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.CRL" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Certificate Revocation List</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Certificate Revocation List</p>
<dl class="method">
<dt id="M2Crypto.X509.CRL.as_text">
<code class="descname">as_text</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#CRL.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.CRL.as_text" title="Permalink to this definition">¶</a></dt>
@@ -3126,7 +3190,8 @@ M2Crypto.EVP.Cipher.</p>
<dl class="class">
<dt id="M2Crypto.X509.Request">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">Request</code><span class="sig-paren">(</span><em>req=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#Request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Certificate Request.</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Certificate Request.</p>
<dl class="method">
<dt id="M2Crypto.X509.Request.add_extensions">
<code class="descname">add_extensions</code><span class="sig-paren">(</span><em>ext_stack</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.add_extensions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.add_extensions" title="Permalink to this definition">¶</a></dt>
@@ -3331,7 +3396,8 @@ The error code can be obtained by ERR_get_error.</p>
<dl class="class">
<dt id="M2Crypto.X509.X509">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509</code><span class="sig-paren">(</span><em>x509=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509" title="Permalink to this definition">¶</a></dt>
-<dd><p>X.509 Certificate</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X.509 Certificate</p>
<dl class="method">
<dt id="M2Crypto.X509.X509.add_ext">
<code class="descname">add_ext</code><span class="sig-paren">(</span><em>ext</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.add_ext"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.add_ext" title="Permalink to this definition">¶</a></dt>
@@ -3692,13 +3758,14 @@ for example ‘sha1’.</li>
<dl class="exception">
<dt id="M2Crypto.X509.X509Error">
<em class="property">exception </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509Error</code><a class="reference internal" href="_modules/M2Crypto/X509.html#X509Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509Error" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ValueError</span></code></p>
</dd></dl>
<dl class="class">
<dt id="M2Crypto.X509.X509_Extension">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Extension</code><span class="sig-paren">(</span><em>x509_ext_ptr=None</em>, <em>_pyfree=1</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Extension</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Extension</p>
<dl class="method">
<dt id="M2Crypto.X509.X509_Extension.get_critical">
<code class="descname">get_critical</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension.get_critical"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension.get_critical" title="Permalink to this definition">¶</a></dt>
@@ -3766,7 +3833,8 @@ set this extension to critical.</td>
<dl class="class">
<dt id="M2Crypto.X509.X509_Extension_Stack">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Extension_Stack</code><span class="sig-paren">(</span><em>stack=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension_Stack" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Extension Stack</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Extension Stack</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
@@ -3820,7 +3888,8 @@ even python crashes!</td>
<dl class="class">
<dt id="M2Crypto.X509.X509_Name">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Name</code><span class="sig-paren">(</span><em>x509_name=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Name</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Name</p>
<dl class="method">
<dt id="M2Crypto.X509.X509_Name.add_entry_by_txt">
<code class="descname">add_entry_by_txt</code><span class="sig-paren">(</span><em>field</em>, <em>type</em>, <em>entry</em>, <em>len</em>, <em>loc</em>, <em>set</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.add_entry_by_txt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.add_entry_by_txt" title="Permalink to this definition">¶</a></dt>
@@ -3841,7 +3910,7 @@ even python crashes!</td>
</tr>
</tbody>
</table>
-<p>The <code class="docutils literal"><span class="pre">loc</span></code> and <code class="docutils literal"><span class="pre">set</span></code> parameters determine where a new entry
+<p>The <code class="docutils literal notranslate"><span class="pre">loc</span></code> and <code class="docutils literal notranslate"><span class="pre">set</span></code> parameters determine where a new entry
should be added.
For almost all applications loc can be set to -1 and set to 0.
This adds a new entry to the end of name as a single valued
@@ -3926,7 +3995,7 @@ by this many spaces.</li>
<dl class="attribute">
<dt id="M2Crypto.X509.X509_Name.nid">
-<code class="descname">nid</code><em class="property"> = {'C': 14, 'serialNumber': 105, 'organizationName': 17, 'CN': 13, 'SP': 16, 'commonName': 13, 'L': 15, 'stateOrProvinceName': 16, 'ST': 16, 'emailAddress': 48, 'O': 17, 'localityName': 15, 'GN': 99, 'surname': 100, 'OU': 18, 'givenName': 99, 'Email': 48, 'organizationUnitName': 18, 'SN': 100}</em><a class="headerlink" href="#M2Crypto.X509.X509_Name.nid" title="Permalink to this definition">¶</a></dt>
+<code class="descname">nid</code><em class="property"> = {'C': 14, 'CN': 13, 'Email': 48, 'GN': 99, 'L': 15, 'O': 17, 'OU': 18, 'SN': 100, 'SP': 16, 'ST': 16, 'commonName': 13, 'emailAddress': 48, 'givenName': 99, 'localityName': 15, 'organizationName': 17, 'organizationUnitName': 18, 'serialNumber': 105, 'stateOrProvinceName': 16, 'surname': 100}</em><a class="headerlink" href="#M2Crypto.X509.X509_Name.nid" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
</dd></dl>
@@ -3934,7 +4003,8 @@ by this many spaces.</li>
<dl class="class">
<dt id="M2Crypto.X509.X509_Name_Entry">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Name_Entry</code><span class="sig-paren">(</span><em>x509_name_entry</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Name Entry</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Name Entry</p>
<dl class="method">
<dt id="M2Crypto.X509.X509_Name_Entry.create_by_txt">
<code class="descname">create_by_txt</code><span class="sig-paren">(</span><em>field</em>, <em>type</em>, <em>entry</em>, <em>len</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.create_by_txt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.create_by_txt" title="Permalink to this definition">¶</a></dt>
@@ -3992,7 +4062,8 @@ by this many spaces.</li>
<dl class="class">
<dt id="M2Crypto.X509.X509_Stack">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Stack</code><span class="sig-paren">(</span><em>stack=None</em>, <em>_pyfree=0</em>, <em>_pyfree_x509=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Stack" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Stack</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Stack</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
@@ -4053,7 +4124,8 @@ nothing to pop.</td>
<dl class="class">
<dt id="M2Crypto.X509.X509_Store">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Store</code><span class="sig-paren">(</span><em>store=None</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Store</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Store</p>
<dl class="method">
<dt id="M2Crypto.X509.X509_Store.add_cert">
<code class="descname">add_cert</code><span class="sig-paren">(</span><em>x509</em><span class="sig-paren">)</span><a class="headerlink" href="#M2Crypto.X509.X509_Store.add_cert" title="Permalink to this definition">¶</a></dt>
@@ -4131,7 +4203,8 @@ verify() call.</td>
<dl class="class">
<dt id="M2Crypto.X509.X509_Store_Context">
<em class="property">class </em><code class="descclassname">M2Crypto.X509.</code><code class="descname">X509_Store_Context</code><span class="sig-paren">(</span><em>x509_store_ctx</em>, <em>_pyfree=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context" title="Permalink to this definition">¶</a></dt>
-<dd><p>X509 Store Context</p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
+<p>X509 Store Context</p>
<dl class="method">
<dt id="M2Crypto.X509.X509_Store_Context.get1_chain">
<code class="descname">get1_chain</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context.get1_chain"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.get1_chain" title="Permalink to this definition">¶</a></dt>
@@ -4398,14 +4471,14 @@ and FORMAT_DER)</li>
</div>
<div class="section" id="module-M2Crypto.callback">
-<span id="callback-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">callback</span></code> Module<a class="headerlink" href="#module-M2Crypto.callback" title="Permalink to this headline">¶</a></h2>
+<span id="callback-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">callback</span></code> Module<a class="headerlink" href="#module-M2Crypto.callback" title="Permalink to this headline">¶</a></h2>
</div>
<div class="section" id="module-M2Crypto.ftpslib">
-<span id="ftpslib-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">ftpslib</span></code> Module<a class="headerlink" href="#module-M2Crypto.ftpslib" title="Permalink to this headline">¶</a></h2>
+<span id="ftpslib-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">ftpslib</span></code> Module<a class="headerlink" href="#module-M2Crypto.ftpslib" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.ftpslib.FTP_TLS">
<em class="property">class </em><code class="descclassname">M2Crypto.ftpslib.</code><code class="descname">FTP_TLS</code><span class="sig-paren">(</span><em>host=None</em>, <em>ssl_ctx=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">ftplib.FTP</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">ftplib.FTP</span></code></p>
<p>Python OO interface to client-side FTP/TLS.</p>
<dl class="method">
<dt id="M2Crypto.ftpslib.FTP_TLS.auth_ssl">
@@ -4441,21 +4514,23 @@ and FORMAT_DER)</li>
</div>
<div class="section" id="module-M2Crypto.httpslib">
-<span id="httpslib-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">httpslib</span></code> Module<a class="headerlink" href="#module-M2Crypto.httpslib" title="Permalink to this headline">¶</a></h2>
+<span id="httpslib-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">httpslib</span></code> Module<a class="headerlink" href="#module-M2Crypto.httpslib" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.httpslib.HTTPSConnection">
<em class="property">class </em><code class="descclassname">M2Crypto.httpslib.</code><code class="descname">HTTPSConnection</code><span class="sig-paren">(</span><em>host</em>, <em>port=None</em>, <em>strict=None</em>, <em>**ssl</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">httplib.HTTPConnection</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">http.client.HTTPConnection</span></code></p>
<p>This class allows communication via SSL using M2Crypto.</p>
<dl class="method">
<dt id="M2Crypto.httpslib.HTTPSConnection.close">
<code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.close" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Close the connection to the HTTP server.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.httpslib.HTTPSConnection.connect">
<code class="descname">connect</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.connect" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Connect to the host and port specified in __init__.</p>
+</dd></dl>
<dl class="attribute">
<dt id="M2Crypto.httpslib.HTTPSConnection.default_port">
@@ -4477,7 +4552,7 @@ and FORMAT_DER)</li>
<dl class="class">
<dt id="M2Crypto.httpslib.ProxyHTTPSConnection">
<em class="property">class </em><code class="descclassname">M2Crypto.httpslib.</code><code class="descname">ProxyHTTPSConnection</code><span class="sig-paren">(</span><em>host</em>, <em>port=None</em>, <em>strict=None</em>, <em>username=None</em>, <em>password=None</em>, <em>**ssl</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#M2Crypto.httpslib.HTTPSConnection" title="M2Crypto.httpslib.HTTPSConnection"><code class="xref py py-class docutils literal"><span class="pre">M2Crypto.httpslib.HTTPSConnection</span></code></a></p>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.httpslib.HTTPSConnection" title="M2Crypto.httpslib.HTTPSConnection"><code class="xref py py-class docutils literal notranslate"><span class="pre">M2Crypto.httpslib.HTTPSConnection</span></code></a></p>
<p>An HTTPS Connection that uses a proxy and the CONNECT request.</p>
<p>When the connection is initiated, CONNECT is first sent to the proxy (along
with authorization headers, if supplied). If successful, an SSL connection
@@ -4488,17 +4563,24 @@ through the proxy.</p>
<dl class="method">
<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.connect">
<code class="descname">connect</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.connect" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Connect to the host and port specified in __init__.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.endheaders">
<code class="descname">endheaders</code><span class="sig-paren">(</span><em>*args</em>, <em>**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.endheaders"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.endheaders" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Indicate that the last header line has been sent to the server.</p>
+<p>This method sends the request to the server. The optional message_body
+argument can be used to pass a message body associated with the
+request.</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.putheader">
<code class="descname">putheader</code><span class="sig-paren">(</span><em>header</em>, <em>value</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.putheader"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.putheader" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Send a request header line to the server.</p>
+<p>For example: h.putheader(‘Accept’, ‘text/html’)</p>
+</dd></dl>
<dl class="method">
<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.putrequest">
@@ -4511,13 +4593,13 @@ real host/port to be used to make CONNECT request to proxy</p>
</div>
<div class="section" id="module-M2Crypto.m2">
-<span id="m2-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">m2</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2" title="Permalink to this headline">¶</a></h2>
+<span id="m2-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">m2</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2" title="Permalink to this headline">¶</a></h2>
</div>
<div class="section" id="module-M2Crypto.m2crypto">
-<span id="m2crypto-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">m2crypto</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2crypto" title="Permalink to this headline">¶</a></h2>
+<span id="m2crypto-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">m2crypto</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2crypto" title="Permalink to this headline">¶</a></h2>
</div>
<div class="section" id="module-M2Crypto.m2urllib">
-<span id="m2urllib-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">m2urllib</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2urllib" title="Permalink to this headline">¶</a></h2>
+<span id="m2urllib-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">m2urllib</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2urllib" title="Permalink to this headline">¶</a></h2>
<dl class="function">
<dt id="M2Crypto.m2urllib.open_https">
<code class="descclassname">M2Crypto.m2urllib.</code><code class="descname">open_https</code><span class="sig-paren">(</span><em>self</em>, <em>url</em>, <em>data=None</em>, <em>ssl_context=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/m2urllib.html#open_https"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib.open_https" title="Permalink to this definition">¶</a></dt>
@@ -4542,11 +4624,11 @@ real host/port to be used to make CONNECT request to proxy</p>
</div>
<div class="section" id="module-M2Crypto.m2urllib2">
-<span id="m2urllib2-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">m2urllib2</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2urllib2" title="Permalink to this headline">¶</a></h2>
+<span id="m2urllib2-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">m2urllib2</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2urllib2" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.m2urllib2.HTTPSHandler">
<em class="property">class </em><code class="descclassname">M2Crypto.m2urllib2.</code><code class="descname">HTTPSHandler</code><span class="sig-paren">(</span><em>ssl_context=None</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/m2urllib2.html#HTTPSHandler"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib2.HTTPSHandler" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">urllib2.AbstractHTTPHandler</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">urllib.request.AbstractHTTPHandler</span></code></p>
<dl class="method">
<dt id="M2Crypto.m2urllib2.HTTPSHandler.https_open">
<code class="descname">https_open</code><span class="sig-paren">(</span><em>req</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/m2urllib2.html#HTTPSHandler.https_open"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib2.HTTPSHandler.https_open" title="Permalink to this definition">¶</a></dt>
@@ -4582,11 +4664,11 @@ default handlers, the default handlers will not be used.</p>
</div>
<div class="section" id="module-M2Crypto.m2xmlrpclib">
-<span id="m2xmlrpclib-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">m2xmlrpclib</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2xmlrpclib" title="Permalink to this headline">¶</a></h2>
+<span id="m2xmlrpclib-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">m2xmlrpclib</span></code> Module<a class="headerlink" href="#module-M2Crypto.m2xmlrpclib" title="Permalink to this headline">¶</a></h2>
<dl class="class">
<dt id="M2Crypto.m2xmlrpclib.SSL_Transport">
<em class="property">class </em><code class="descclassname">M2Crypto.m2xmlrpclib.</code><code class="descname">SSL_Transport</code><span class="sig-paren">(</span><em>ssl_context=None</em>, <em>*args</em>, <em>**kw</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/m2xmlrpclib.html#SSL_Transport"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">xmlrpclib.Transport</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">xmlrpc.client.Transport</span></code></p>
<dl class="method">
<dt id="M2Crypto.m2xmlrpclib.SSL_Transport.request">
<code class="descname">request</code><span class="sig-paren">(</span><em>host</em>, <em>handler</em>, <em>request_body</em>, <em>verbose=0</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/m2xmlrpclib.html#SSL_Transport.request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport.request" title="Permalink to this definition">¶</a></dt>
@@ -4594,14 +4676,14 @@ default handlers, the default handlers will not be used.</p>
<dl class="attribute">
<dt id="M2Crypto.m2xmlrpclib.SSL_Transport.user_agent">
-<code class="descname">user_agent</code><em class="property"> = 'M2Crypto_XMLRPC/0.28.0 - xmlrpclib.py/1.0.1 (by www.pythonware.com)'</em><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport.user_agent" title="Permalink to this definition">¶</a></dt>
+<code class="descname">user_agent</code><em class="property"> = 'M2Crypto_XMLRPC/0.33.0 - Python-xmlrpc/3.7'</em><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport.user_agent" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
</dd></dl>
</div>
<div class="section" id="module-M2Crypto.threading">
-<span id="threading-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">threading</span></code> Module<a class="headerlink" href="#module-M2Crypto.threading" title="Permalink to this headline">¶</a></h2>
+<span id="threading-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code> Module<a class="headerlink" href="#module-M2Crypto.threading" title="Permalink to this headline">¶</a></h2>
<dl class="function">
<dt id="M2Crypto.threading.cleanup">
<code class="descclassname">M2Crypto.threading.</code><code class="descname">cleanup</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/threading.html#cleanup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.threading.cleanup" title="Permalink to this definition">¶</a></dt>
@@ -4616,11 +4698,11 @@ default handlers, the default handlers will not be used.</p>
</div>
<div class="section" id="module-M2Crypto.util">
-<span id="util-module"></span><h2><code class="xref py py-mod docutils literal"><span class="pre">util</span></code> Module<a class="headerlink" href="#module-M2Crypto.util" title="Permalink to this headline">¶</a></h2>
+<span id="util-module"></span><h2><code class="xref py py-mod docutils literal notranslate"><span class="pre">util</span></code> Module<a class="headerlink" href="#module-M2Crypto.util" title="Permalink to this headline">¶</a></h2>
<dl class="exception">
<dt id="M2Crypto.util.UtilError">
<em class="property">exception </em><code class="descclassname">M2Crypto.util.</code><code class="descname">UtilError</code><a class="reference internal" href="_modules/M2Crypto/util.html#UtilError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.UtilError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></code></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">Exception</span></code></p>
</dd></dl>
<dl class="function">
@@ -4630,7 +4712,7 @@ default handlers, the default handlers will not be used.</p>
<dl class="function">
<dt id="M2Crypto.util.genparam_callback">
-<code class="descclassname">M2Crypto.util.</code><code class="descname">genparam_callback</code><span class="sig-paren">(</span><em>p</em>, <em>n</em>, <em>out=&lt;open file '&lt;stdout&gt;'</em>, <em>mode 'w'&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/util.html#genparam_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.genparam_callback" title="Permalink to this definition">¶</a></dt>
+<code class="descclassname">M2Crypto.util.</code><code class="descname">genparam_callback</code><span class="sig-paren">(</span><em>p</em>, <em>n</em>, <em>out=&lt;_io.TextIOWrapper name='&lt;stdout&gt;' mode='w' encoding='UTF-8'&gt;</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/util.html#genparam_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.genparam_callback" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
<dl class="function">
@@ -4659,16 +4741,6 @@ default handlers, the default handlers will not be used.</p>
<dd></dd></dl>
<dl class="function">
-<dt id="M2Crypto.util.py3bytes">
-<code class="descclassname">M2Crypto.util.</code><code class="descname">py3bytes</code><span class="sig-paren">(</span><em>x</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/util.html#py3bytes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.py3bytes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="function">
-<dt id="M2Crypto.util.py3str">
-<code class="descclassname">M2Crypto.util.</code><code class="descname">py3str</code><span class="sig-paren">(</span><em>x</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/util.html#py3str"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.py3str" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-<dl class="function">
<dt id="M2Crypto.util.quiet_genparam_callback">
<code class="descclassname">M2Crypto.util.</code><code class="descname">quiet_genparam_callback</code><span class="sig-paren">(</span><em>p</em>, <em>n</em>, <em>out</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/M2Crypto/util.html#quiet_genparam_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.quiet_genparam_callback" title="Permalink to this definition">¶</a></dt>
<dd></dd></dl>
@@ -4679,17 +4751,17 @@ default handlers, the default handlers will not be used.</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="M2Crypto.SSL.html">SSL Package</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#id1"><code class="docutils literal"><span class="pre">SSL</span></code> Package</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><code class="docutils literal"><span class="pre">Checker</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><code class="docutils literal"><span class="pre">Cipher</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><code class="docutils literal"><span class="pre">Connection</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><code class="docutils literal"><span class="pre">Context</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><code class="docutils literal"><span class="pre">SSLServer</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><code class="docutils literal"><span class="pre">Session</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><code class="docutils literal"><span class="pre">cb</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><code class="docutils literal"><span class="pre">timeout</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#id1"><code class="docutils literal notranslate"><span class="pre">SSL</span></code> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><code class="docutils literal notranslate"><span class="pre">Checker</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><code class="docutils literal notranslate"><span class="pre">Cipher</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><code class="docutils literal notranslate"><span class="pre">Connection</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><code class="docutils literal notranslate"><span class="pre">Context</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><code class="docutils literal notranslate"><span class="pre">SSLServer</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><code class="docutils literal notranslate"><span class="pre">Session</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal notranslate"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><code class="docutils literal notranslate"><span class="pre">cb</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal notranslate"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><code class="docutils literal notranslate"><span class="pre">timeout</span></code> Module</a></li>
</ul>
</li>
</ul>
@@ -4699,43 +4771,57 @@ default handlers, the default handlers will not be used.</p>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">M2Crypto Package</a><ul>
-<li><a class="reference internal" href="#id1"><code class="docutils literal"><span class="pre">M2Crypto</span></code> Package</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.ASN1"><code class="docutils literal"><span class="pre">ASN1</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.AuthCookie"><code class="docutils literal"><span class="pre">AuthCookie</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.BIO"><code class="docutils literal"><span class="pre">BIO</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.BN"><code class="docutils literal"><span class="pre">BN</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.DH"><code class="docutils literal"><span class="pre">DH</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.DSA"><code class="docutils literal"><span class="pre">DSA</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.EC"><code class="docutils literal"><span class="pre">EC</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.EVP"><code class="docutils literal"><span class="pre">EVP</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.Engine"><code class="docutils literal"><span class="pre">Engine</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.Err"><code class="docutils literal"><span class="pre">Err</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.RC4"><code class="docutils literal"><span class="pre">RC4</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.RSA"><code class="docutils literal"><span class="pre">RSA</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.Rand"><code class="docutils literal"><span class="pre">Rand</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.SMIME"><code class="docutils literal"><span class="pre">SMIME</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.X509"><code class="docutils literal"><span class="pre">X509</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.callback"><code class="docutils literal"><span class="pre">callback</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.ftpslib"><code class="docutils literal"><span class="pre">ftpslib</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.httpslib"><code class="docutils literal"><span class="pre">httpslib</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.m2"><code class="docutils literal"><span class="pre">m2</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.m2crypto"><code class="docutils literal"><span class="pre">m2crypto</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.m2urllib"><code class="docutils literal"><span class="pre">m2urllib</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.m2urllib2"><code class="docutils literal"><span class="pre">m2urllib2</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.m2xmlrpclib"><code class="docutils literal"><span class="pre">m2xmlrpclib</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.threading"><code class="docutils literal"><span class="pre">threading</span></code> Module</a></li>
-<li><a class="reference internal" href="#module-M2Crypto.util"><code class="docutils literal"><span class="pre">util</span></code> Module</a></li>
-<li><a class="reference internal" href="#subpackages">Subpackages</a></li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul class="current">
+<li class="toctree-l1 current"><a class="current reference internal" href="#">M2Crypto Package</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="#id1"><code class="docutils literal notranslate"><span class="pre">M2Crypto</span></code> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.ASN1"><code class="docutils literal notranslate"><span class="pre">ASN1</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.AuthCookie"><code class="docutils literal notranslate"><span class="pre">AuthCookie</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.BIO"><code class="docutils literal notranslate"><span class="pre">BIO</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.BN"><code class="docutils literal notranslate"><span class="pre">BN</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.DH"><code class="docutils literal notranslate"><span class="pre">DH</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.DSA"><code class="docutils literal notranslate"><span class="pre">DSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.EC"><code class="docutils literal notranslate"><span class="pre">EC</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.EVP"><code class="docutils literal notranslate"><span class="pre">EVP</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.Engine"><code class="docutils literal notranslate"><span class="pre">Engine</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.Err"><code class="docutils literal notranslate"><span class="pre">Err</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.RC4"><code class="docutils literal notranslate"><span class="pre">RC4</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.RSA"><code class="docutils literal notranslate"><span class="pre">RSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.Rand"><code class="docutils literal notranslate"><span class="pre">Rand</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.SMIME"><code class="docutils literal notranslate"><span class="pre">SMIME</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.X509"><code class="docutils literal notranslate"><span class="pre">X509</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.callback"><code class="docutils literal notranslate"><span class="pre">callback</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.ftpslib"><code class="docutils literal notranslate"><span class="pre">ftpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.httpslib"><code class="docutils literal notranslate"><span class="pre">httpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.m2"><code class="docutils literal notranslate"><span class="pre">m2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.m2crypto"><code class="docutils literal notranslate"><span class="pre">m2crypto</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.m2urllib"><code class="docutils literal notranslate"><span class="pre">m2urllib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.m2urllib2"><code class="docutils literal notranslate"><span class="pre">m2urllib2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.m2xmlrpclib"><code class="docutils literal notranslate"><span class="pre">m2xmlrpclib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.threading"><code class="docutils literal notranslate"><span class="pre">threading</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#module-M2Crypto.util"><code class="docutils literal notranslate"><span class="pre">util</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#subpackages">Subpackages</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="M2Crypto.SSL.html">SSL Package</a></li>
</ul>
</li>
</ul>
+</li>
+</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -4745,23 +4831,26 @@ default handlers, the default handlers will not be used.</p>
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/M2Crypto.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -4770,8 +4859,8 @@ default handlers, the default handlers will not be used.</p>
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/M2Crypto.rst.txt"
diff --git a/doc/html/ZServerSSL-HOWTO.html b/doc/html/ZServerSSL-HOWTO.html
index 61bc6e0..67023d0 100644
--- a/doc/html/ZServerSSL-HOWTO.html
+++ b/doc/html/ZServerSSL-HOWTO.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>1.   ZServerSSL-HOWTO &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="zserverssl-howto">
@@ -87,50 +81,50 @@ in Un*x fashion.</p>
<div class="section" id="preparation">
<h2><a class="toc-backref" href="#id5">1.2.&nbsp;&nbsp;&nbsp;Preparation</a><a class="headerlink" href="#preparation" title="Permalink to this headline">¶</a></h2>
<ol class="arabic simple">
-<li>Download M2Crypto 0.11, contained in the file <code class="docutils literal"><span class="pre">m2crypto-0.11.zip</span></code>.</li>
-<li>Unpack <code class="docutils literal"><span class="pre">m2crypto-0.11.zip</span></code>. This will create a directory
-<code class="docutils literal"><span class="pre">m2crypto-0.11</span></code>. Henceforth, we refer to this directory as <code class="docutils literal"><span class="pre">$M2</span></code>.</li>
-<li>Install M2Crypto per the instructions in <code class="docutils literal"><span class="pre">$M2/INSTALL</span></code>.</li>
+<li>Download M2Crypto 0.11, contained in the file <code class="docutils literal notranslate"><span class="pre">m2crypto-0.11.zip</span></code>.</li>
+<li>Unpack <code class="docutils literal notranslate"><span class="pre">m2crypto-0.11.zip</span></code>. This will create a directory
+<code class="docutils literal notranslate"><span class="pre">m2crypto-0.11</span></code>. Henceforth, we refer to this directory as <code class="docutils literal notranslate"><span class="pre">$M2</span></code>.</li>
+<li>Install M2Crypto per the instructions in <code class="docutils literal notranslate"><span class="pre">$M2/INSTALL</span></code>.</li>
</ol>
-<p>The ZServerSSL distribution is in <code class="docutils literal"><span class="pre">$M2/demo/Zope</span></code>. We shall refer to
-this directory as <code class="docutils literal"><span class="pre">$ZSSL</span></code>.</p>
+<p>The ZServerSSL distribution is in <code class="docutils literal notranslate"><span class="pre">$M2/demo/Zope</span></code>. We shall refer to
+this directory as <code class="docutils literal notranslate"><span class="pre">$ZSSL</span></code>.</p>
</div>
<div class="section" id="installation">
<h2><a class="toc-backref" href="#id6">1.3.&nbsp;&nbsp;&nbsp;Installation</a><a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h2>
-<p>Below, we refer to your Zope top-level directory as <code class="docutils literal"><span class="pre">$ZOPE</span></code>.</p>
+<p>Below, we refer to your Zope top-level directory as <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>.</p>
<ol class="arabic">
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/z2s.py</span></code> into <code class="docutils literal"><span class="pre">$ZOPE</span></code>.</p>
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/z2s.py</span></code> into <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>.</p>
</li>
-<li><p class="first">Depending on your operating system, modify <code class="docutils literal"><span class="pre">$ZOPE/start</span></code> or
-<code class="docutils literal"><span class="pre">$ZOPE/start.bat</span></code> to invoke <code class="docutils literal"><span class="pre">$ZOPE/z2s.py</span></code>, instead of
-<code class="docutils literal"><span class="pre">$ZOPE/z2.py</span></code>. The files <code class="docutils literal"><span class="pre">$ZSSL/starts</span></code> and <code class="docutils literal"><span class="pre">$ZSSL/starts.bat</span></code>
+<li><p class="first">Depending on your operating system, modify <code class="docutils literal notranslate"><span class="pre">$ZOPE/start</span></code> or
+<code class="docutils literal notranslate"><span class="pre">$ZOPE/start.bat</span></code> to invoke <code class="docutils literal notranslate"><span class="pre">$ZOPE/z2s.py</span></code>, instead of
+<code class="docutils literal notranslate"><span class="pre">$ZOPE/z2.py</span></code>. The files <code class="docutils literal notranslate"><span class="pre">$ZSSL/starts</span></code> and <code class="docutils literal notranslate"><span class="pre">$ZSSL/starts.bat</span></code>
serve as examples.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/dh1024.pem</span></code> into <code class="docutils literal"><span class="pre">$ZOPE</span></code>. This file contains
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/dh1024.pem</span></code> into <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>. This file contains
Diffie-Hellman parameters for use by the SSL protocol.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/randpool.dat</span></code> into <code class="docutils literal"><span class="pre">$ZOPE</span></code>. This file contains seed
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/randpool.dat</span></code> into <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>. This file contains seed
material for the OpenSSL PRNG. Alternatively, create
-<code class="docutils literal"><span class="pre">$ZOPE/randpool.dat</span></code> thusly:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span>$ dd if=/dev/urandom of=randpool.dat bs=1024 count=1
+<code class="docutils literal notranslate"><span class="pre">$ZOPE/randpool.dat</span></code> thusly:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ dd if=/dev/urandom of=randpool.dat bs=1024 count=1
</pre></div>
</div>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/ca.pem</span></code> to <code class="docutils literal"><span class="pre">$ZOPE</span></code>. This file contains an
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/ca.pem</span></code> to <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>. This file contains an
example Certification Authority (CA) certificate. For
information on operating your own CA, see <a class="reference internal" href="howto.ca.html#howto-ca"><span class="std std-ref">HOWTO: Creating your own CA with OpenSSL</span></a> or
one of numerous similar documents available on the web.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/server.pem</span></code> to <code class="docutils literal"><span class="pre">$ZOPE</span></code>. This file contains an RSA key
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/server.pem</span></code> to <code class="docutils literal notranslate"><span class="pre">$ZOPE</span></code>. This file contains an RSA key
pair and its X.509v3 certificate issued by the above CA. You may also
create your own key/certificate bundle.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/ZServer/HTTPS_Server.py</span></code> to <code class="docutils literal"><span class="pre">$ZOPE/ZServer</span></code>.</p>
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/ZServer/HTTPS_Server.py</span></code> to <code class="docutils literal notranslate"><span class="pre">$ZOPE/ZServer</span></code>.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/ZServer/__init__.py</span></code> to <code class="docutils literal"><span class="pre">$ZOPE/ZServer</span></code>. This
-overwrites the existing <code class="docutils literal"><span class="pre">$ZOPE/ZServer/__init__.py</span></code>. Alternatively,
-apply the following patch to <code class="docutils literal"><span class="pre">$ZOPE/ZServer/__init__.py</span></code>:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">---</span> <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span><span class="o">.</span><span class="n">org</span> <span class="n">Sat</span> <span class="n">Jun</span> <span class="mi">21</span> <span class="mi">23</span><span class="p">:</span><span class="mi">20</span><span class="p">:</span><span class="mi">41</span> <span class="mi">2003</span>
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/ZServer/__init__.py</span></code> to <code class="docutils literal notranslate"><span class="pre">$ZOPE/ZServer</span></code>. This
+overwrites the existing <code class="docutils literal notranslate"><span class="pre">$ZOPE/ZServer/__init__.py</span></code>. Alternatively,
+apply the following patch to <code class="docutils literal notranslate"><span class="pre">$ZOPE/ZServer/__init__.py</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">---</span> <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span><span class="o">.</span><span class="n">org</span> <span class="n">Sat</span> <span class="n">Jun</span> <span class="mi">21</span> <span class="mi">23</span><span class="p">:</span><span class="mi">20</span><span class="p">:</span><span class="mi">41</span> <span class="mi">2003</span>
<span class="o">+++</span> <span class="fm">__init__</span><span class="o">.</span><span class="n">py</span> <span class="n">Tue</span> <span class="n">Jan</span> <span class="mi">7</span> <span class="mi">23</span><span class="p">:</span><span class="mi">30</span><span class="p">:</span><span class="mi">53</span> <span class="mi">2003</span>
<span class="o">@@</span> <span class="o">-</span><span class="mi">84</span><span class="p">,</span><span class="mi">6</span> <span class="o">+</span><span class="mi">84</span><span class="p">,</span><span class="mi">7</span> <span class="o">@@</span>
<span class="kn">import</span> <span class="nn">asyncore</span>
@@ -143,13 +137,13 @@ apply the following patch to <code class="docutils literal"><span class="pre">$Z
</pre></div>
</div>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">$ZSSL/ZServer/medusa/https_server.py</span></code> to
-<code class="docutils literal"><span class="pre">$ZOPE/ZServer/medusa</span></code>.</p>
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">$ZSSL/ZServer/medusa/https_server.py</span></code> to
+<code class="docutils literal notranslate"><span class="pre">$ZOPE/ZServer/medusa</span></code>.</p>
</li>
<li><p class="first">Stop Zope, if it is running.</p>
</li>
<li><p class="first">Start Zope with ZServerSSL thusly:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">starts</span> <span class="o">-</span><span class="n">X</span> <span class="o">-</span><span class="n">f</span> <span class="mi">9021</span> <span class="o">-</span><span class="n">w</span> <span class="mi">9080</span> <span class="o">-</span><span class="n">W</span> <span class="mi">9081</span> <span class="o">-</span><span class="n">y</span> <span class="mi">9443</span> <span class="o">-</span><span class="n">Y</span> <span class="mi">9444</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">starts</span> <span class="o">-</span><span class="n">X</span> <span class="o">-</span><span class="n">f</span> <span class="mi">9021</span> <span class="o">-</span><span class="n">w</span> <span class="mi">9080</span> <span class="o">-</span><span class="n">W</span> <span class="mi">9081</span> <span class="o">-</span><span class="n">y</span> <span class="mi">9443</span> <span class="o">-</span><span class="n">Y</span> <span class="mi">9444</span>
</pre></div>
</div>
<p>This starts the following:</p>
@@ -165,7 +159,7 @@ apply the following patch to <code class="docutils literal"><span class="pre">$Z
</div>
<div class="section" id="testing">
<h2><a class="toc-backref" href="#id7">1.4.&nbsp;&nbsp;&nbsp;Testing</a><a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2>
-<p>Below, we assume your Zope server is running on <code class="docutils literal"><span class="pre">localhost</span></code>.</p>
+<p>Below, we assume your Zope server is running on <code class="docutils literal notranslate"><span class="pre">localhost</span></code>.</p>
</div>
<div class="section" id="https">
<h2><a class="toc-backref" href="#id8">1.5.&nbsp;&nbsp;&nbsp;HTTPS</a><a class="headerlink" href="#https" title="Permalink to this headline">¶</a></h2>
@@ -180,7 +174,7 @@ Zope’s management functionality.</li>
<div class="section" id="webdav-over-https">
<h2><a class="toc-backref" href="#id9">1.6.&nbsp;&nbsp;&nbsp;WebDAV-over-HTTPS</a><a class="headerlink" href="#webdav-over-https" title="Permalink to this headline">¶</a></h2>
<p>This testing is done with Cadaver 0.21.0 on FreeBSD.:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span>$ cadaver https://localhost:9443/
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ cadaver https://localhost:9443/
WARNING: Untrusted server certificate presented:
Issued to: M2Crypto, SG
Issued by: M2Crypto, SG
@@ -220,9 +214,9 @@ $
<ol class="arabic simple">
<li>Open the Mozilla Composer window.</li>
<li>Click “File”, “Open Web Location”. A dialog box appears.</li>
-<li>Enter <code class="docutils literal"><span class="pre">https://localhost:9444/index_html</span></code> for the URL.</li>
+<li>Enter <code class="docutils literal notranslate"><span class="pre">https://localhost:9444/index_html</span></code> for the URL.</li>
<li>Select “Open in new Composer window.”</li>
-<li>Click “Open”. A new Composer window will open with <code class="docutils literal"><span class="pre">index_html</span></code>
+<li>Click “Open”. A new Composer window will open with <code class="docutils literal notranslate"><span class="pre">index_html</span></code>
loaded.</li>
</ol>
</div>
@@ -232,7 +226,7 @@ loaded.</li>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id12">1.9.&nbsp;&nbsp;&nbsp;HTTPS</a><a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">m2urllib</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">m2urllib</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">url</span> <span class="o">=</span> <span class="n">m2urllib</span><span class="o">.</span><span class="n">FancyURLopener</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">url</span><span class="o">.</span><span class="n">addheader</span><span class="p">(</span><span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;close&#39;</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">u</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;https://127.0.0.1:9443/&#39;</span><span class="p">)</span>
@@ -251,7 +245,7 @@ loaded.</li>
<span class="gp">...</span>
</pre></div>
</div>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">head</span><span class="o">&gt;</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">head</span><span class="o">&gt;</span>
<span class="o">&lt;</span><span class="n">base</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;https://127.0.0.1:9443/&quot;</span> <span class="o">/&gt;</span>
<span class="o">&lt;</span><span class="n">title</span><span class="o">&gt;</span><span class="n">Zope</span><span class="o">&lt;/</span><span class="n">title</span><span class="o">&gt;&lt;/</span><span class="n">head</span><span class="o">&gt;&lt;</span><span class="n">body</span> <span class="n">bgcolor</span><span class="o">=</span><span class="s2">&quot;#FFFFFF&quot;</span><span class="o">&gt;</span>
@@ -269,14 +263,14 @@ loaded.</li>
<span class="o">&lt;</span><span class="n">hr</span><span class="o">&gt;&lt;</span><span class="n">a</span> <span class="n">href</span><span class="o">=</span><span class="s2">&quot;http://www.zope.org/Credits&quot;</span> <span class="n">target</span><span class="o">=</span><span class="s2">&quot;_top&quot;</span><span class="o">&gt;&lt;</span><span class="n">img</span> <span class="n">src</span><span class="o">=</span><span class="s2">&quot;https://127.0.0.1:9443/p_/ZopeButton&quot;</span> <span class="n">width</span><span class="o">=</span><span class="s2">&quot;115&quot;</span> <span class="n">height</span><span class="o">=</span><span class="s2">&quot;50&quot;</span> <span class="n">border</span><span class="o">=</span><span class="s2">&quot;0&quot;</span> <span class="n">alt</span><span class="o">=</span><span class="s2">&quot;Powered by Zope&quot;</span> <span class="o">/&gt;&lt;/</span><span class="n">a</span><span class="o">&gt;&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</pre></div>
</div>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">u</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">u</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="go">&gt;&gt;&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="xmlrpc-over-https">
<h2><a class="toc-backref" href="#id13">1.10.&nbsp;&nbsp;&nbsp;XMLRPC-over-HTTPS</a><a class="headerlink" href="#xmlrpc-over-https" title="Permalink to this headline">¶</a></h2>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto.m2xmlrpclib</span> <span class="k">import</span> <span class="n">Server</span><span class="p">,</span> <span class="n">SSL_Transport</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto.m2xmlrpclib</span> <span class="k">import</span> <span class="n">Server</span><span class="p">,</span> <span class="n">SSL_Transport</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">zs</span> <span class="o">=</span> <span class="n">Server</span><span class="p">(</span><span class="s1">&#39;https://127.0.0.1:9443/&#39;</span><span class="p">,</span> <span class="n">SSL_Transport</span><span class="p">())</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">zs</span><span class="o">.</span><span class="n">propertyMap</span><span class="p">())</span>
<span class="go">[{&#39;type&#39;: &#39;string&#39;, &#39;id&#39;: &#39;title&#39;, &#39;mode&#39;: &#39;w&#39;}]</span>
@@ -292,27 +286,25 @@ loaded.</li>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO</a><ul>
-<li><a class="reference internal" href="#introduction">1.1.&nbsp;&nbsp;&nbsp;Introduction</a></li>
-<li><a class="reference internal" href="#preparation">1.2.&nbsp;&nbsp;&nbsp;Preparation</a></li>
-<li><a class="reference internal" href="#installation">1.3.&nbsp;&nbsp;&nbsp;Installation</a></li>
-<li><a class="reference internal" href="#testing">1.4.&nbsp;&nbsp;&nbsp;Testing</a></li>
-<li><a class="reference internal" href="#https">1.5.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
-<li><a class="reference internal" href="#webdav-over-https">1.6.&nbsp;&nbsp;&nbsp;WebDAV-over-HTTPS</a></li>
-<li><a class="reference internal" href="#webdav-source-over-https">1.7.&nbsp;&nbsp;&nbsp;WebDAV-Source-over-HTTPS</a></li>
-<li><a class="reference internal" href="#python-with-m2crypto">1.8.&nbsp;&nbsp;&nbsp;Python with M2Crypto</a></li>
-<li><a class="reference internal" href="#id2">1.9.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
-<li><a class="reference internal" href="#xmlrpc-over-https">1.10.&nbsp;&nbsp;&nbsp;XMLRPC-over-HTTPS</a></li>
-<li><a class="reference internal" href="#conclusion">1.11.&nbsp;&nbsp;&nbsp;Conclusion</a></li>
-</ul>
-</li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -320,23 +312,26 @@ loaded.</li>
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/ZServerSSL-HOWTO.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -345,8 +340,8 @@ loaded.</li>
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/ZServerSSL-HOWTO.rst.txt"
diff --git a/doc/html/_modules/M2Crypto/ASN1.html b/doc/html/_modules/M2Crypto/ASN1.html
index a506287..bac4c1b 100644
--- a/doc/html/_modules/M2Crypto/ASN1.html
+++ b/doc/html/_modules/M2Crypto/ASN1.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.ASN1 &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.ASN1</h1><div class="highlight"><pre>
@@ -53,8 +47,8 @@
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
<span class="n">MBSTRING_FLAG</span> <span class="o">=</span> <span class="mh">0x1000</span>
@@ -62,7 +56,7 @@
<span class="n">MBSTRING_BMP</span> <span class="o">=</span> <span class="n">MBSTRING_FLAG</span> <span class="o">|</span> <span class="mi">2</span>
-<div class="viewcode-block" id="ASN1_Integer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Integer">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Integer</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="ASN1_Integer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Integer">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Integer</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_asn1_integer_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_free</span>
@@ -89,7 +83,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1int</span><span class="p">)</span></div>
-<div class="viewcode-block" id="ASN1_String"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_String">[docs]</a><span class="k">class</span> <span class="nc">ASN1_String</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="ASN1_String"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_String">[docs]</a><span class="k">class</span> <span class="nc">ASN1_String</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_asn1_string_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_string_free</span>
@@ -106,7 +100,7 @@
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="fm">__bytes__</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="fm">__bytes__</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; None</span>
@@ -127,10 +121,10 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">asn1_string_print_ex</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
-<div class="viewcode-block" id="ASN1_Object"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Object">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Object</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="ASN1_Object"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Object">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Object</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_asn1_object_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_object_free</span>
@@ -208,7 +202,7 @@
<span class="k">return</span> <span class="n">tt</span><span class="o">.</span><span class="n">tm_isdst</span> <span class="o">&gt;</span> <span class="mi">0</span></div>
-<div class="viewcode-block" id="ASN1_TIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME">[docs]</a><span class="k">class</span> <span class="nc">ASN1_TIME</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="ASN1_TIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME">[docs]</a><span class="k">class</span> <span class="nc">ASN1_TIME</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">_ssl_months</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Jan&quot;</span><span class="p">,</span> <span class="s2">&quot;Feb&quot;</span><span class="p">,</span> <span class="s2">&quot;Mar&quot;</span><span class="p">,</span> <span class="s2">&quot;Apr&quot;</span><span class="p">,</span> <span class="s2">&quot;May&quot;</span><span class="p">,</span> <span class="s2">&quot;Jun&quot;</span><span class="p">,</span> <span class="s2">&quot;Jul&quot;</span><span class="p">,</span> <span class="s2">&quot;Aug&quot;</span><span class="p">,</span>
<span class="s2">&quot;Sep&quot;</span><span class="p">,</span> <span class="s2">&quot;Oct&quot;</span><span class="p">,</span> <span class="s2">&quot;Nov&quot;</span><span class="p">,</span> <span class="s2">&quot;Dec&quot;</span><span class="p">]</span>
<span class="n">m2_asn1_time_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_free</span>
@@ -238,7 +232,7 @@
<span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
<span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">),</span> \
@@ -295,10 +289,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -309,14 +319,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -325,8 +345,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/AuthCookie.html b/doc/html/_modules/M2Crypto/AuthCookie.html
index 47f127c..3b2d629 100644
--- a/doc/html/_modules/M2Crypto/AuthCookie.html
+++ b/doc/html/_modules/M2Crypto/AuthCookie.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.AuthCookie &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.AuthCookie</h1><div class="highlight"><pre>
@@ -49,10 +43,10 @@
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">six</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_cookies</span> <span class="k">import</span> <span class="n">SimpleCookie</span> <span class="c1"># pylint: disable=no-name-in-module,import-error</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">re</span> <span class="k">as</span> <span class="n">type_re</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
<span class="n">_MIX_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;exp=</span><span class="si">%f</span><span class="s1">&amp;data=</span><span class="si">%s</span><span class="s1">&amp;digest=&#39;</span>
@@ -87,7 +81,7 @@
<span class="n">_TOKEN</span> <span class="o">=</span> <span class="s1">&#39;_M2AUTH_&#39;</span> <span class="c1"># type: str</span>
-<div class="viewcode-block" id="AuthCookieJar"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar">[docs]</a><span class="k">class</span> <span class="nc">AuthCookieJar</span><span class="p">:</span>
+<div class="viewcode-block" id="AuthCookieJar"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar">[docs]</a><span class="k">class</span> <span class="nc">AuthCookieJar</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">_keylen</span> <span class="o">=</span> <span class="mi">20</span> <span class="c1"># type: int</span>
@@ -97,7 +91,7 @@
<span class="k">def</span> <span class="nf">_hmac</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="c1"># type: (bytes, str) -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">bin_to_hex</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">m2</span><span class="o">.</span><span class="n">sha1</span><span class="p">()))</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">bin_to_hex</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">m2</span><span class="o">.</span><span class="n">sha1</span><span class="p">()))</span>
<div class="viewcode-block" id="AuthCookieJar.makeCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.makeCookie">[docs]</a> <span class="k">def</span> <span class="nf">makeCookie</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
<span class="c1"># type: (float, str) -&gt; AuthCookie</span>
@@ -129,11 +123,11 @@
<span class="n">c</span> <span class="o">=</span> <span class="n">SimpleCookie</span><span class="p">()</span>
<span class="n">c</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">cookie_str</span><span class="p">)</span>
<span class="k">if</span> <span class="n">_TOKEN</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">c</span><span class="p">:</span>
- <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;_TOKEN not in c (keys = </span><span class="si">%s</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="nb">dir</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;_TOKEN not in c (keys = </span><span class="si">%s</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="nb">dir</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="n">undough</span> <span class="o">=</span> <span class="n">unmix3</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">_TOKEN</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">undough</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;undough is None&#39;</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;undough is None&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="mi">0</span>
<span class="n">exp</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">mac</span> <span class="o">=</span> <span class="n">undough</span>
<span class="n">c2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeCookie</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
@@ -146,7 +140,7 @@
<span class="k">return</span> <span class="p">(</span><span class="ow">not</span> <span class="n">c2</span><span class="o">.</span><span class="n">isExpired</span><span class="p">())</span> <span class="ow">and</span> <span class="p">(</span><span class="n">c2</span><span class="o">.</span><span class="n">_mac</span> <span class="o">==</span> <span class="n">mac</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="AuthCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie">[docs]</a><span class="k">class</span> <span class="nc">AuthCookie</span><span class="p">:</span>
+<div class="viewcode-block" id="AuthCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie">[docs]</a><span class="k">class</span> <span class="nc">AuthCookie</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">dough</span><span class="p">,</span> <span class="n">mac</span><span class="p">):</span>
<span class="c1"># type: (float, str, str, str) -&gt; None</span>
@@ -211,10 +205,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -225,14 +235,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -241,8 +261,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/BIO.html b/doc/html/_modules/M2Crypto/BIO.html
index a252b48..212c05d 100644
--- a/doc/html/_modules/M2Crypto/BIO.html
+++ b/doc/html/_modules/M2Crypto/BIO.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.BIO &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.BIO</h1><div class="highlight"><pre>
@@ -47,14 +41,14 @@
<span class="kn">import</span> <span class="nn">logging</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;BIO&#39;</span><span class="p">)</span>
-<div class="viewcode-block" id="BIOError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIOError">[docs]</a><span class="k">class</span> <span class="nc">BIOError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+<div class="viewcode-block" id="BIOError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIOError">[docs]</a><span class="k">class</span> <span class="nc">BIOError</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
<span class="k">pass</span></div>
@@ -117,7 +111,7 @@
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot read&#39;</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_gets</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span> <span class="k">if</span> <span class="n">buf</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">buf</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span></div>
<div class="viewcode-block" id="BIO.readlines"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.readlines">[docs]</a> <span class="k">def</span> <span class="nf">readlines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sizehint</span><span class="o">=</span><span class="s1">&#39;ignored&#39;</span><span class="p">):</span>
<span class="c1"># type: (Union[AnyStr, int]) -&gt; Iterable[bytes]</span>
@@ -128,7 +122,7 @@
<span class="n">buf</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_gets</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
<span class="k">if</span> <span class="n">buf</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">break</span>
- <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">buf</span><span class="p">))</span>
+ <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">buf</span><span class="p">))</span>
<span class="k">return</span> <span class="n">lines</span></div>
<div class="viewcode-block" id="BIO.writeable"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.writeable">[docs]</a> <span class="k">def</span> <span class="nf">writeable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -316,7 +310,12 @@
<div class="viewcode-block" id="openfile"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.openfile">[docs]</a><span class="k">def</span> <span class="nf">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;rb&#39;</span><span class="p">):</span>
<span class="c1"># type: (AnyStr, AnyStr) -&gt; File</span>
- <span class="k">return</span> <span class="n">File</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="p">))</span></div>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">IOError</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">BIOError</span><span class="p">(</span><span class="n">ex</span><span class="o">.</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">File</span><span class="p">(</span><span class="n">f</span><span class="p">)</span></div>
<div class="viewcode-block" id="IOBuffer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.IOBuffer">[docs]</a><span class="k">class</span> <span class="nc">IOBuffer</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
@@ -427,10 +426,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -441,14 +456,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -457,8 +482,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/BN.html b/doc/html/_modules/M2Crypto/BN.html
index 5a6c2f4..b8287fb 100644
--- a/doc/html/_modules/M2Crypto/BN.html
+++ b/doc/html/_modules/M2Crypto/BN.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.BN &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.BN</h1><div class="highlight"><pre>
@@ -100,10 +94,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -114,14 +124,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -130,8 +150,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/DH.html b/doc/html/_modules/M2Crypto/DH.html
index 2f94b2e..0e6d33a 100644
--- a/doc/html/_modules/M2Crypto/DH.html
+++ b/doc/html/_modules/M2Crypto/DH.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.DH &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.DH</h1><div class="highlight"><pre>
@@ -57,7 +51,7 @@
<span class="n">m2</span><span class="o">.</span><span class="n">dh_init</span><span class="p">(</span><span class="n">DHError</span><span class="p">)</span>
-<div class="viewcode-block" id="DH"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH">[docs]</a><span class="k">class</span> <span class="nc">DH</span><span class="p">:</span>
+<div class="viewcode-block" id="DH"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH">[docs]</a><span class="k">class</span> <span class="nc">DH</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Object interface to the Diffie-Hellman key exchange protocol.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -77,7 +71,7 @@
<span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; int</span>
<span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
- <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">dh_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="c1"># type: (str) -&gt; bytes</span>
@@ -155,10 +149,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -169,14 +179,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -185,8 +205,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/DSA.html b/doc/html/_modules/M2Crypto/DSA.html
index 902b028..6d97c52 100644
--- a/doc/html/_modules/M2Crypto/DSA.html
+++ b/doc/html/_modules/M2Crypto/DSA.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.DSA &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.DSA</h1><div class="highlight"><pre>
@@ -61,7 +55,7 @@
<span class="n">m2</span><span class="o">.</span><span class="n">dsa_init</span><span class="p">(</span><span class="n">DSAError</span><span class="p">)</span>
-<div class="viewcode-block" id="DSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA">[docs]</a><span class="k">class</span> <span class="nc">DSA</span><span class="p">:</span>
+<div class="viewcode-block" id="DSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA">[docs]</a><span class="k">class</span> <span class="nc">DSA</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This class is a context supporting DSA key and parameter</span>
@@ -298,7 +292,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_check_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="DSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA_pub">[docs]</a><span class="k">class</span> <span class="nc">DSA_pub</span><span class="p">(</span><span class="n">DSA</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="DSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA_pub">[docs]</a><span class="k">class</span> <span class="nc">DSA_pub</span><span class="p">(</span><span class="n">DSA</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This class is a DSA context that only supports a public key</span>
@@ -342,8 +336,6 @@
<span class="sd"> :return: instance of DSA.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_generate_parameters</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">dsa</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem generating DSA parameters&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -396,8 +388,6 @@
<span class="sd"> :return: instance of DSA.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_params</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">dsa</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA parameters&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -434,8 +424,6 @@
<span class="sd"> :return: instance of DSA.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">dsa</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA key pair&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -492,16 +480,30 @@
<span class="sd"> :return: instance of DSA_pub.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dsapub</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_pub_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">dsapub</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA public key&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">DSA_pub</span><span class="p">(</span><span class="n">dsapub</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -512,14 +514,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -528,8 +540,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/EC.html b/doc/html/_modules/M2Crypto/EC.html
index c252714..8b62996 100644
--- a/doc/html/_modules/M2Crypto/EC.html
+++ b/doc/html/_modules/M2Crypto/EC.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.EC &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.EC</h1><div class="highlight"><pre>
@@ -169,7 +163,7 @@
<span class="c1"># NID_ipsec4 = m2.NID_ipsec4</span>
-<div class="viewcode-block" id="EC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC">[docs]</a><span class="k">class</span> <span class="nc">EC</span><span class="p">:</span>
+<div class="viewcode-block" id="EC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC">[docs]</a><span class="k">class</span> <span class="nc">EC</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Object interface to a EC key pair.</span>
@@ -333,7 +327,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_check_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="EC_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC_pub">[docs]</a><span class="k">class</span> <span class="nc">EC_pub</span><span class="p">(</span><span class="n">EC</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="EC_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC_pub">[docs]</a><span class="k">class</span> <span class="nc">EC_pub</span><span class="p">(</span><span class="n">EC</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Object interface to an EC public key.</span>
@@ -501,10 +495,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -515,14 +525,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -531,8 +551,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/EVP.html b/doc/html/_modules/M2Crypto/EVP.html
index 61dd3f9..4aebc66 100644
--- a/doc/html/_modules/M2Crypto/EVP.html
+++ b/doc/html/_modules/M2Crypto/EVP.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.EVP &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.EVP</h1><div class="highlight"><pre>
@@ -49,12 +43,14 @@
<span class="sd">Author: Heikki Toivonen</span>
<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">RSA</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Callable</span> <span class="c1"># noqa</span>
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;EVP&#39;</span><span class="p">)</span>
-<div class="viewcode-block" id="EVPError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.EVPError">[docs]</a><span class="k">class</span> <span class="nc">EVPError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+<div class="viewcode-block" id="EVPError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.EVPError">[docs]</a><span class="k">class</span> <span class="nc">EVPError</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
<span class="k">pass</span></div>
<span class="n">m2</span><span class="o">.</span><span class="n">evp_init</span><span class="p">(</span><span class="n">EVPError</span><span class="p">)</span>
@@ -74,7 +70,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs5_pbkdf2_hmac_sha1</span><span class="p">(</span><span class="n">password</span><span class="p">,</span> <span class="n">salt</span><span class="p">,</span> <span class="nb">iter</span><span class="p">,</span> <span class="n">keylen</span><span class="p">)</span></div>
-<div class="viewcode-block" id="MessageDigest"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.MessageDigest">[docs]</a><span class="k">class</span> <span class="nc">MessageDigest</span><span class="p">:</span>
+<div class="viewcode-block" id="MessageDigest"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.MessageDigest">[docs]</a><span class="k">class</span> <span class="nc">MessageDigest</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Message Digest</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -87,8 +83,6 @@
<span class="c1"># if the digest algorithm isn&#39;t found as an attribute of the m2</span>
<span class="c1"># module, try to look up the digest using get_digestbyname()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">get_digestbyname</span><span class="p">(</span><span class="n">algo</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">md</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">md_ctx_new</span><span class="p">()</span>
@@ -115,7 +109,7 @@
<span class="n">digest</span> <span class="o">=</span> <span class="n">final</span></div>
-<div class="viewcode-block" id="HMAC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC">[docs]</a><span class="k">class</span> <span class="nc">HMAC</span><span class="p">:</span>
+<div class="viewcode-block" id="HMAC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC">[docs]</a><span class="k">class</span> <span class="nc">HMAC</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_hmac_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac_ctx_free</span>
@@ -156,7 +150,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">md</span><span class="p">())</span></div>
-<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_cipher_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_ctx_free</span>
@@ -198,7 +192,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_set_padding</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="PKey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey">[docs]</a><span class="k">class</span> <span class="nc">PKey</span><span class="p">:</span>
+<div class="viewcode-block" id="PKey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey">[docs]</a><span class="k">class</span> <span class="nc">PKey</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Public Key</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -328,8 +322,6 @@
<span class="sd"> instance is holding.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rsa_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_get1_rsa</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">rsa_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;PKey instance is not holding a RSA key&quot;</span><span class="p">)</span>
<span class="n">rsa</span> <span class="o">=</span> <span class="n">RSA</span><span class="o">.</span><span class="n">RSA_pub</span><span class="p">(</span><span class="n">rsa_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rsa</span></div>
@@ -434,13 +426,9 @@
<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
- <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
- <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">EVPError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
<span class="k">return</span> <span class="n">PKey</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -458,8 +446,6 @@
<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">EVPError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKey</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -517,10 +503,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -531,14 +533,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -547,8 +559,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/Engine.html b/doc/html/_modules/M2Crypto/Engine.html
index 1b74291..4d8474c 100644
--- a/doc/html/_modules/M2Crypto/Engine.html
+++ b/doc/html/_modules/M2Crypto/Engine.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.Engine &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,17 +22,20 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.Engine</h1><div class="highlight"><pre>
<span></span><span class="c1"># vim: sts=4 sw=4 et</span>
+<span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">absolute_import</span>
+
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">M2Crypto wrapper for OpenSSL ENGINE API.</span>
@@ -58,7 +54,7 @@
<span class="n">m2</span><span class="o">.</span><span class="n">engine_init_error</span><span class="p">(</span><span class="n">EngineError</span><span class="p">)</span>
-<div class="viewcode-block" id="Engine"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine">[docs]</a><span class="k">class</span> <span class="nc">Engine</span><span class="p">:</span>
+<div class="viewcode-block" id="Engine"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine">[docs]</a><span class="k">class</span> <span class="nc">Engine</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Wrapper for ENGINE object.&quot;&quot;&quot;</span>
<span class="n">m2_engine_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_free</span>
@@ -93,8 +89,11 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_finish</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span></div>
<div class="viewcode-block" id="Engine.ctrl_cmd_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.ctrl_cmd_string">[docs]</a> <span class="k">def</span> <span class="nf">ctrl_cmd_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
- <span class="c1"># type: (bytes, Optional[bytes], int) -&gt; int</span>
+ <span class="c1"># type: (AnyStr, Optional[AnyStr], int) -&gt; None</span>
<span class="sd">&quot;&quot;&quot;Call ENGINE_ctrl_cmd_string&quot;&quot;&quot;</span>
+ <span class="n">cmd</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_str</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">arg</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_str</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_ctrl_cmd_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">optional</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">EngineError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span></div>
@@ -160,10 +159,10 @@
<span class="n">sopath</span> <span class="o">=</span> <span class="n">sopath</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
<span class="n">m2</span><span class="o">.</span><span class="n">engine_load_dynamic</span><span class="p">()</span>
<span class="n">e</span> <span class="o">=</span> <span class="n">Engine</span><span class="p">(</span><span class="s1">&#39;dynamic&#39;</span><span class="p">)</span>
- <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;SO_PATH&#39;</span><span class="p">,</span> <span class="n">sopath</span><span class="p">)</span>
- <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;ID&#39;</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
- <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;LIST_ADD&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">)</span>
- <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="sa">b</span><span class="s1">&#39;LOAD&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="s1">&#39;SO_PATH&#39;</span><span class="p">,</span> <span class="n">sopath</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="s1">&#39;ID&#39;</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="s1">&#39;LIST_ADD&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="s1">&#39;LOAD&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">e</span></div>
@@ -187,10 +186,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -201,14 +216,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -217,8 +242,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/Err.html b/doc/html/_modules/M2Crypto/Err.html
index 2e776ae..1688939 100644
--- a/doc/html/_modules/M2Crypto/Err.html
+++ b/doc/html/_modules/M2Crypto/Err.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.Err &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.Err</h1><div class="highlight"><pre>
@@ -45,8 +39,8 @@
<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">six</span> <span class="c1"># noqa</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">six</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
@@ -56,7 +50,7 @@
<span class="n">m2</span><span class="o">.</span><span class="n">err_print_errors</span><span class="p">(</span><span class="n">err</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
<span class="n">err_msg</span> <span class="o">=</span> <span class="n">err</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err_msg</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span></div>
<div class="viewcode-block" id="get_error_code"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_code">[docs]</a><span class="k">def</span> <span class="nf">get_error_code</span><span class="p">():</span>
@@ -71,27 +65,27 @@
<div class="viewcode-block" id="get_error_lib"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_lib">[docs]</a><span class="k">def</span> <span class="nf">get_error_lib</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_lib_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_lib_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
<div class="viewcode-block" id="get_error_func"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_func">[docs]</a><span class="k">def</span> <span class="nf">get_error_func</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_func_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_func_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
<div class="viewcode-block" id="get_error_reason"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_reason">[docs]</a><span class="k">def</span> <span class="nf">get_error_reason</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
<div class="viewcode-block" id="get_error_message"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_message">[docs]</a><span class="k">def</span> <span class="nf">get_error_message</span><span class="p">():</span>
<span class="c1"># type: () -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">get_error_reason</span><span class="p">(</span><span class="n">get_error_code</span><span class="p">()))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">get_error_reason</span><span class="p">(</span><span class="n">get_error_code</span><span class="p">()))</span></div>
<div class="viewcode-block" id="get_x509_verify_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_x509_verify_error">[docs]</a><span class="k">def</span> <span class="nf">get_x509_verify_error</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_verify_error</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_verify_error</span><span class="p">(</span><span class="n">err</span><span class="p">))</span></div>
<div class="viewcode-block" id="SSLError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.SSLError">[docs]</a><span class="k">class</span> <span class="nc">SSLError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
@@ -115,10 +109,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -129,14 +139,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -145,8 +165,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/RC4.html b/doc/html/_modules/M2Crypto/RC4.html
index 9c2e976..95456f5 100644
--- a/doc/html/_modules/M2Crypto/RC4.html
+++ b/doc/html/_modules/M2Crypto/RC4.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.RC4 &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.RC4</h1><div class="highlight"><pre>
@@ -48,7 +42,7 @@
<span class="kn">from</span> <span class="nn">M2Crypto.m2</span> <span class="k">import</span> <span class="n">rc4_free</span><span class="p">,</span> <span class="n">rc4_new</span><span class="p">,</span> <span class="n">rc4_set_key</span><span class="p">,</span> <span class="n">rc4_update</span>
-<div class="viewcode-block" id="RC4"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4">[docs]</a><span class="k">class</span> <span class="nc">RC4</span><span class="p">:</span>
+<div class="viewcode-block" id="RC4"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4">[docs]</a><span class="k">class</span> <span class="nc">RC4</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Object interface to the stream cipher RC4.&quot;&quot;&quot;</span>
<span class="n">rc4_free</span> <span class="o">=</span> <span class="n">rc4_free</span>
@@ -78,10 +72,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -92,14 +102,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -108,8 +128,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/RSA.html b/doc/html/_modules/M2Crypto/RSA.html
index f8509c8..172316b 100644
--- a/doc/html/_modules/M2Crypto/RSA.html
+++ b/doc/html/_modules/M2Crypto/RSA.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.RSA &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.RSA</h1><div class="highlight"><pre>
@@ -63,7 +57,7 @@
<span class="n">pkcs1_oaep_padding</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs1_oaep_padding</span>
-<div class="viewcode-block" id="RSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA">[docs]</a><span class="k">class</span> <span class="nc">RSA</span><span class="p">:</span>
+<div class="viewcode-block" id="RSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA">[docs]</a><span class="k">class</span> <span class="nc">RSA</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> RSA Key Pair.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -86,7 +80,7 @@
<span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; int</span>
- <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span>
+ <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">rsa_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="c1"># type: (str) -&gt; bytes</span>
@@ -221,6 +215,9 @@
<div class="viewcode-block" id="RSA.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; int</span>
<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Validate RSA keys.</span>
+
+<span class="sd"> It checks that p and q are in fact prime, and that n = p*q.</span>
<span class="sd"> :return: returns 1 if rsa is a valid RSA key, and 0 otherwise.</span>
<span class="sd"> -1 is returned if an error occurs while checking the key.</span>
@@ -322,7 +319,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">signature</span><span class="p">,</span> <span class="n">digest_type</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="RSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub">[docs]</a><span class="k">class</span> <span class="nc">RSA_pub</span><span class="p">(</span><span class="n">RSA</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="RSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub">[docs]</a><span class="k">class</span> <span class="nc">RSA_pub</span><span class="p">(</span><span class="n">RSA</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Object interface to an RSA public key.</span>
@@ -505,10 +502,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -519,14 +532,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -535,8 +558,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/Rand.html b/doc/html/_modules/M2Crypto/Rand.html
index 2915acd..b2fa075 100644
--- a/doc/html/_modules/M2Crypto/Rand.html
+++ b/doc/html/_modules/M2Crypto/Rand.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.Rand &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.Rand</h1><div class="highlight"><pre>
@@ -48,15 +42,21 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">absolute_import</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Tuple</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;rand_seed&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_add&#39;</span><span class="p">,</span> <span class="s1">&#39;load_file&#39;</span><span class="p">,</span> <span class="s1">&#39;save_file&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_bytes&#39;</span><span class="p">,</span>
<span class="s1">&#39;rand_pseudo_bytes&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_file_name&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_status&#39;</span><span class="p">]</span>
+<span class="k">class</span> <span class="nc">RandError</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+<span class="n">m2</span><span class="o">.</span><span class="n">rand_init</span><span class="p">(</span><span class="n">RandError</span><span class="p">)</span>
+
+
<div class="viewcode-block" id="rand_add"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.rand_add">[docs]</a><span class="k">def</span> <span class="nf">rand_add</span><span class="p">(</span><span class="n">blob</span><span class="p">,</span> <span class="n">entropy</span><span class="p">):</span>
<span class="c1"># type: (bytes, float) -&gt; None</span>
<span class="sd">&quot;&quot;&quot;</span>
@@ -99,7 +99,7 @@
<div class="viewcode-block" id="rand_file_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.rand_file_name">[docs]</a><span class="k">def</span> <span class="nf">rand_file_name</span><span class="p">():</span>
- <span class="c1"># type: () -&gt; AnyStr</span>
+ <span class="c1"># type: () -&gt; str</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generate a default path for the random seed file.</span>
@@ -108,11 +108,11 @@
<span class="sd"> is set, $HOME/.rnd otherwise. If $HOME is not set either,</span>
<span class="sd"> an error occurs.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">rand_file_name</span><span class="p">())</span> <span class="c1"># pylint: disable=no-member</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">rand_file_name</span><span class="p">())</span> <span class="c1"># pylint: disable=no-member</span></div>
<div class="viewcode-block" id="load_file"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.load_file">[docs]</a><span class="k">def</span> <span class="nf">load_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">max_bytes</span><span class="p">):</span>
- <span class="c1"># type: (bytes, int) -&gt; int</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; int</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Read a number of bytes from file filename and adds them to the PRNG.</span>
@@ -123,7 +123,7 @@
<span class="sd"> :param max_bytes:</span>
<span class="sd"> :return: the number of bytes read.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_load_file</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">max_bytes</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span></div>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_load_file</span><span class="p">(</span><span class="n">six</span><span class="o">.</span><span class="n">ensure_str</span><span class="p">(</span><span class="n">filename</span><span class="p">),</span> <span class="n">max_bytes</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span></div>
<div class="viewcode-block" id="save_file"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.save_file">[docs]</a><span class="k">def</span> <span class="nf">save_file</span><span class="p">(</span><span class="n">filename</span><span class="p">):</span>
@@ -152,13 +152,7 @@
<span class="sd"> :param num: number of bytes to be returned</span>
<span class="sd"> :return: random bytes</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">out</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_bytes</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span>
- <span class="k">if</span> <span class="n">out</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Not enough randomness.&#39;</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">out</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Not supported by the current RAND method.&#39;</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">out</span></div>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_bytes</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span></div>
<div class="viewcode-block" id="rand_pseudo_bytes"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.rand_pseudo_bytes">[docs]</a><span class="k">def</span> <span class="nf">rand_pseudo_bytes</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
@@ -185,18 +179,30 @@
<span class="s1">&#39;deprecated. Use Rand.rand_bytes instead.&#39;</span><span class="p">,</span>
<span class="ne">DeprecationWarning</span><span class="p">)</span>
- <span class="n">out</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_pseudo_bytes</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span>
- <span class="k">if</span> <span class="n">out</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Not enough randomness.&#39;</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">out</span></div>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_pseudo_bytes</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="c1"># pylint: disable=no-member</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -207,14 +213,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -223,8 +239,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SMIME.html b/doc/html/_modules/M2Crypto/SMIME.html
index 2b0bb6f..dbd0bb3 100644
--- a/doc/html/_modules/M2Crypto/SMIME.html
+++ b/doc/html/_modules/M2Crypto/SMIME.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SMIME &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SMIME</h1><div class="highlight"><pre>
@@ -65,13 +59,13 @@
<span class="n">PKCS7_DATA</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_DATA</span> <span class="c1"># type: int</span>
-<div class="viewcode-block" id="PKCS7_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7_Error">[docs]</a><span class="k">class</span> <span class="nc">PKCS7_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="PKCS7_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7_Error">[docs]</a><span class="k">class</span> <span class="nc">PKCS7_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span></div>
<span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_init</span><span class="p">(</span><span class="n">PKCS7_Error</span><span class="p">)</span>
-<div class="viewcode-block" id="PKCS7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7">[docs]</a><span class="k">class</span> <span class="nc">PKCS7</span><span class="p">:</span>
+<div class="viewcode-block" id="PKCS7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7">[docs]</a><span class="k">class</span> <span class="nc">PKCS7</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_pkcs7_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_free</span>
@@ -120,65 +114,41 @@
<div class="viewcode-block" id="load_pkcs7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
<span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
- <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
-
- <span class="k">try</span><span class="p">:</span>
- <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="load_pkcs7_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_der">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_der</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
<span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
- <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
-
- <span class="k">try</span><span class="p">:</span>
- <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio_der</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio_der</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="load_pkcs7_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">):</span>
<span class="c1"># type: (BIO.BIO) -&gt; PKCS7</span>
<span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="load_pkcs7_bio_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio_der">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_bio_der</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">):</span>
<span class="c1"># type: (BIO.BIO) -&gt; PKCS7</span>
<span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio_der</span><span class="p">(</span><span class="n">p7_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="smime_load_pkcs7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.smime_load_pkcs7">[docs]</a><span class="k">def</span> <span class="nf">smime_load_pkcs7</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
<span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
<span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">p7_ptr</span><span class="p">,</span> <span class="n">bio_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_read_pkcs7</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">if</span> <span class="n">bio_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
@@ -196,7 +166,7 @@
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIO</span><span class="p">(</span><span class="n">bio_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
-<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Object interface to EVP_CIPHER without all the frills of</span>
<span class="sd"> M2Crypto.EVP.Cipher.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -212,14 +182,14 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span></div>
-<div class="viewcode-block" id="SMIME_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME_Error">[docs]</a><span class="k">class</span> <span class="nc">SMIME_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="SMIME_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME_Error">[docs]</a><span class="k">class</span> <span class="nc">SMIME_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span></div>
<span class="n">m2</span><span class="o">.</span><span class="n">smime_init</span><span class="p">(</span><span class="n">SMIME_Error</span><span class="p">)</span>
<span class="c1"># FIXME class has no __init__ method</span>
-<div class="viewcode-block" id="SMIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME">[docs]</a><span class="k">class</span> <span class="nc">SMIME</span><span class="p">:</span>
+<div class="viewcode-block" id="SMIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME">[docs]</a><span class="k">class</span> <span class="nc">SMIME</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<div class="viewcode-block" id="SMIME.load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.load_key">[docs]</a> <span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyfile</span><span class="p">,</span> <span class="n">certfile</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
<span class="c1"># type: (AnyStr, Optional[AnyStr], Callable) -&gt; None</span>
@@ -274,10 +244,10 @@
<span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no cipher: use set_cipher()&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509_stack&#39;</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no recipient certs: use set_x509_stack()&#39;</span><span class="p">)</span>
+
<span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="SMIME.decrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.decrypt">[docs]</a> <span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
@@ -288,8 +258,6 @@
<span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no certificate: load_key() used incorrectly?&#39;</span><span class="p">)</span>
<span class="n">blob</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_decrypt</span><span class="p">(</span><span class="n">pkcs7</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">blob</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">blob</span></div>
<div class="viewcode-block" id="SMIME.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_bio</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
@@ -306,14 +274,10 @@
<span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_sign1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_sign0</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
<div class="viewcode-block" id="SMIME.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">data_bio</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
@@ -331,8 +295,6 @@
<span class="n">blob</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_verify1</span><span class="p">(</span><span class="n">p7</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x509_store</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
<span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">blob</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">blob</span></div>
<div class="viewcode-block" id="SMIME.write"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out_bio</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">data_bio</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
@@ -365,10 +327,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -379,14 +357,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -395,8 +383,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL.html b/doc/html/_modules/M2Crypto/SSL.html
index a7db7e9..ff0aa7a 100644
--- a/doc/html/_modules/M2Crypto/SSL.html
+++ b/doc/html/_modules/M2Crypto/SSL.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL</h1><div class="highlight"><pre>
@@ -45,7 +39,7 @@
<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
-<span class="kn">import</span> <span class="nn">socket</span>
+<span class="kn">import</span> <span class="nn">socket</span><span class="o">,</span> <span class="nn">os</span>
<span class="c1"># M2Crypto</span>
<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">_m2crypto</span> <span class="k">as</span> <span class="n">m2</span>
@@ -64,10 +58,11 @@
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Cipher</span> <span class="k">import</span> <span class="n">Cipher</span><span class="p">,</span> <span class="n">Cipher_Stack</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Connection</span> <span class="k">import</span> <span class="n">Connection</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="k">import</span> <span class="n">Context</span>
-<span class="kn">from</span> <span class="nn">M2Crypto.SSL.SSLServer</span> <span class="k">import</span> <span class="p">(</span><span class="n">ForkingSSLServer</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">,</span>
- <span class="n">ThreadingSSLServer</span><span class="p">)</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.SSLServer</span> <span class="k">import</span> <span class="n">SSLServer</span><span class="p">,</span> <span class="n">ThreadingSSLServer</span>
+<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;nt&#39;</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">M2Crypto.SSL.SSLServer</span> <span class="k">import</span> <span class="n">ForkingSSLServer</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.ssl_dispatcher</span> <span class="k">import</span> <span class="n">ssl_dispatcher</span>
-<span class="kn">from</span> <span class="nn">M2Crypto.SSL.timeout</span> <span class="k">import</span> <span class="n">timeout</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.timeout</span> <span class="k">import</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">struct_to_timeout</span><span class="p">,</span> <span class="n">struct_size</span>
<span class="n">verify_none</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_NONE</span> <span class="c1"># type: int</span>
<span class="n">verify_peer</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_PEER</span> <span class="c1"># type: int</span>
@@ -82,10 +77,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -96,14 +107,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -112,8 +133,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/Checker.html b/doc/html/_modules/M2Crypto/SSL/Checker.html
index 93b884c..dc1aea8 100644
--- a/doc/html/_modules/M2Crypto/SSL/Checker.html
+++ b/doc/html/_modules/M2Crypto/SSL/Checker.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.Checker &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.Checker</h1><div class="highlight"><pre>
@@ -54,7 +48,7 @@
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">socket</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
@@ -100,10 +94,10 @@
<span class="c1"># type: () -&gt; str</span>
<span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;Peer certificate </span><span class="si">%s</span><span class="s1"> does not match host, expected </span><span class="si">%s</span><span class="s1">, got </span><span class="si">%s</span><span class="s1">&#39;</span> \
<span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expectedHost</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">actualHost</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">s</span><span class="p">)</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">s</span><span class="p">)</span></div>
-<div class="viewcode-block" id="Checker"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.Checker">[docs]</a><span class="k">class</span> <span class="nc">Checker</span><span class="p">:</span>
+<div class="viewcode-block" id="Checker"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.Checker">[docs]</a><span class="k">class</span> <span class="nc">Checker</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">numericIpMatch</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;^[0-9]+(\.[0-9]+)*$&#39;</span><span class="p">)</span>
@@ -111,7 +105,7 @@
<span class="c1"># type: (Optional[str], Optional[bytes], str) -&gt; None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
<span class="k">if</span> <span class="n">peerCertHash</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">peerCertHash</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">peerCertHash</span><span class="p">)</span>
+ <span class="n">peerCertHash</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">peerCertHash</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">=</span> <span class="n">peerCertHash</span>
<span class="bp">self</span><span class="o">.</span><span class="n">digest</span> <span class="o">=</span> <span class="n">peerCertDigest</span> <span class="c1"># type: str</span>
@@ -142,7 +136,7 @@
<span class="n">expected_len</span><span class="p">,</span>
<span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)))</span>
- <span class="n">expected_fingerprint</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span>
+ <span class="n">expected_fingerprint</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span>
<span class="n">observed_fingerprint</span> <span class="o">=</span> <span class="n">peerCert</span><span class="o">.</span><span class="n">get_fingerprint</span><span class="p">(</span><span class="n">md</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">digest</span><span class="p">)</span>
<span class="k">if</span> <span class="n">observed_fingerprint</span> <span class="o">!=</span> <span class="n">expected_fingerprint</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">WrongCertificate</span><span class="p">(</span>
@@ -339,10 +333,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -355,14 +365,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -371,8 +391,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/Cipher.html b/doc/html/_modules/M2Crypto/SSL/Cipher.html
index 1f8ca81..d9a39b4 100644
--- a/doc/html/_modules/M2Crypto/SSL/Cipher.html
+++ b/doc/html/_modules/M2Crypto/SSL/Cipher.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.Cipher &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.Cipher</h1><div class="highlight"><pre>
@@ -45,12 +39,12 @@
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Cipher&#39;</span><span class="p">,</span> <span class="s1">&#39;Cipher_Stack&#39;</span><span class="p">]</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Iterable</span> <span class="c1"># noqa</span>
-<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="p">):</span>
<span class="c1"># type: (str) -&gt; None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">cipher</span>
@@ -73,10 +67,10 @@
<div class="viewcode-block" id="Cipher.name"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher.name">[docs]</a> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; str</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_cipher_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">))</span></div></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_cipher_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">))</span></div></div>
-<div class="viewcode-block" id="Cipher_Stack"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher_Stack">[docs]</a><span class="k">class</span> <span class="nc">Cipher_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="Cipher_Stack"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher_Stack">[docs]</a><span class="k">class</span> <span class="nc">Cipher_Stack</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack</span><span class="p">):</span>
<span class="c1"># type: (bytes) -&gt; None</span>
<span class="sd">&quot;&quot;&quot;</span>
@@ -97,15 +91,31 @@
<span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; Iterable</span>
- <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)):</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">six</span><span class="o">.</span><span class="n">moves</span><span class="o">.</span><span class="n">range</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)):</span>
<span class="k">yield</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -118,14 +128,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -134,8 +154,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/Connection.html b/doc/html/_modules/M2Crypto/SSL/Connection.html
index 68462e0..fcc8c69 100644
--- a/doc/html/_modules/M2Crypto/SSL/Connection.html
+++ b/doc/html/_modules/M2Crypto/SSL/Connection.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.Connection &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.Connection</h1><div class="highlight"><pre>
@@ -54,12 +48,12 @@
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">socket</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="k">import</span> <span class="n">Checker</span><span class="p">,</span> <span class="n">Context</span><span class="p">,</span> <span class="n">timeout</span> <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="k">import</span> <span class="n">SSLError</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Cipher</span> <span class="k">import</span> <span class="n">Cipher</span><span class="p">,</span> <span class="n">Cipher_Stack</span>
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Session</span> <span class="k">import</span> <span class="n">Session</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Connection&#39;</span><span class="p">,</span>
@@ -74,7 +68,7 @@
<span class="k">return</span> <span class="mi">1</span>
-<div class="viewcode-block" id="Connection"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection">[docs]</a><span class="k">class</span> <span class="nc">Connection</span><span class="p">:</span>
+<div class="viewcode-block" id="Connection"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection">[docs]</a><span class="k">class</span> <span class="nc">Connection</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;An SSL connection.&quot;&quot;&quot;</span>
<span class="n">clientPostConnectionCheck</span> <span class="o">=</span> <span class="n">Checker</span><span class="o">.</span><span class="n">Checker</span><span class="p">()</span>
@@ -82,6 +76,7 @@
<span class="n">m2_bio_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span>
<span class="n">m2_ssl_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_free</span>
+ <span class="n">m2_bio_noclose</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">sock</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">family</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">):</span>
<span class="c1"># type: (Context, socket.socket, int) -&gt; None</span>
@@ -110,16 +105,18 @@
<span class="bp">self</span><span class="o">.</span><span class="n">set_post_connection_check_callback</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">post_connection_check</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="kc">None</span>
+
<span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># Notice that M2Crypto doesn&#39;t automatically shuts down the</span>
+ <span class="c1"># connection here. You have to call self.close() in your</span>
+ <span class="c1"># program, M2Crypto won&#39;t do it automatically for you.</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;sslbio&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sslbio</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;sockbio&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sockbio</span><span class="p">)</span>
- <span class="c1"># in __del__ method we have to check whether m2.bio_noclose</span>
- <span class="c1"># exists at all.</span>
- <span class="k">if</span> <span class="n">m2</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span> <span class="ow">and</span> \
- <span class="bp">self</span><span class="o">.</span><span class="n">ssl_close_flag</span> <span class="o">==</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span> <span class="ow">and</span> \
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl_close_flag</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_noclose</span> <span class="ow">and</span> \
<span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ssl&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">m2_ssl_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
@@ -346,7 +343,8 @@
<span class="n">check</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;postConnectionCheck&#39;</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clientPostConnectionCheck</span><span class="p">)</span>
<span class="k">if</span> <span class="n">check</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_peer_cert</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_peer_cert</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="k">raise</span> <span class="n">Checker</span><span class="o">.</span><span class="n">SSLVerificationError</span><span class="p">(</span>
<span class="s1">&#39;post connection check failed&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ret</span></div>
@@ -396,16 +394,21 @@
<span class="k">pass</span>
<div class="viewcode-block" id="Connection.recv_into"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.recv_into">[docs]</a> <span class="k">def</span> <span class="nf">recv_into</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buff</span><span class="p">,</span> <span class="n">nbytes</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
- <span class="c1"># type: (bytearray, int) -&gt; int</span>
+ <span class="c1"># type: (Union[bytearray, memoryview], int) -&gt; int</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A version of recv() that stores its data into a buffer rather</span>
<span class="sd"> than creating a new string. Receive up to buffersize bytes from</span>
<span class="sd"> the socket. If buffersize is not specified (or 0), receive up</span>
<span class="sd"> to the size available in the given buffer.</span>
-<span class="sd"> @param buffer: a buffer for the received bytes</span>
-<span class="sd"> @param nbytes: maximum number of bytes to read</span>
-<span class="sd"> @return: number of bytes added</span>
+<span class="sd"> If buff is bytearray, it will have after return length of the</span>
+<span class="sd"> actually returned number of bytes. If buff is memoryview, then</span>
+<span class="sd"> the size of buff won&#39;t change (it cannot), but all bytes after</span>
+<span class="sd"> the number of returned bytes will be NULL.</span>
+
+<span class="sd"> :param buffer: a buffer for the received bytes</span>
+<span class="sd"> :param nbytes: maximum number of bytes to read</span>
+<span class="sd"> :return: number of bytes read</span>
<span class="sd"> See recv() for documentation about the flags.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -413,11 +416,19 @@
<span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;size &lt;= 0&#39;</span><span class="p">)</span>
+
+ <span class="c1"># buff_bytes are actual bytes returned</span>
<span class="n">buff_bytes</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span><span class="p">)</span>
- <span class="n">buff</span><span class="p">[:]</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span>
- <span class="n">buff</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">buff_bytes</span><span class="p">)</span>
+ <span class="n">buflen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">buff_bytes</span><span class="p">)</span>
- <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">buff</span><span class="p">)</span></div>
+ <span class="c1"># memoryview type has been added in 2.7</span>
+ <span class="k">if</span> <span class="n">py27plus</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">buff</span><span class="p">,</span> <span class="nb">memoryview</span><span class="p">):</span>
+ <span class="n">buff</span><span class="p">[:</span><span class="n">buflen</span><span class="p">]</span> <span class="o">=</span> <span class="n">buff_bytes</span>
+ <span class="n">buff</span><span class="p">[</span><span class="n">buflen</span><span class="p">:]</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">buff</span><span class="p">)</span> <span class="o">-</span> <span class="n">buflen</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">buff</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">buff_bytes</span>
+
+ <span class="k">return</span> <span class="n">buflen</span></div>
<div class="viewcode-block" id="Connection.read"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.read">[docs]</a> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; bytes</span>
@@ -598,7 +609,7 @@
<div class="viewcode-block" id="Connection.get_cipher_list"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_cipher_list">[docs]</a> <span class="k">def</span> <span class="nf">get_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="c1"># type: (int) -&gt; str</span>
<span class="sd">&quot;&quot;&quot;Return the cipher suites for this connection as a string object.&quot;&quot;&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">idx</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">idx</span><span class="p">))</span></div>
<div class="viewcode-block" id="Connection.set_cipher_list"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_cipher_list">[docs]</a> <span class="k">def</span> <span class="nf">set_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher_list</span><span class="p">):</span>
<span class="c1"># type: (str) -&gt; int</span>
@@ -661,11 +672,20 @@
<span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_RCVTIMEO</span><span class="p">,</span>
<span class="n">timeout</span><span class="o">.</span><span class="n">struct_size</span><span class="p">()))</span></div>
+ <span class="nd">@staticmethod</span>
+ <span class="k">def</span> <span class="nf">_hexdump</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">binary_type</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s2">&quot;:&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">{0:02x}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY2</span> <span class="k">else</span> <span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">s</span><span class="p">)</span>
+
<div class="viewcode-block" id="Connection.get_socket_write_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_socket_write_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_socket_write_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; timeout</span>
- <span class="k">return</span> <span class="n">timeout</span><span class="o">.</span><span class="n">struct_to_timeout</span><span class="p">(</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span>
- <span class="n">timeout</span><span class="o">.</span><span class="n">struct_size</span><span class="p">()))</span></div>
+ <span class="n">binstr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span> <span class="n">timeout</span><span class="o">.</span><span class="n">struct_size</span><span class="p">())</span>
+ <span class="n">timeo</span> <span class="o">=</span> <span class="n">timeout</span><span class="o">.</span><span class="n">struct_to_timeout</span><span class="p">(</span><span class="n">binstr</span><span class="p">)</span>
+ <span class="c1">#print(&quot;Debug: get_socket_write_timeout: &quot;</span>
+ <span class="c1"># &quot;get sockopt value: %s -&gt; returned timeout(sec=%r, microsec=%r)&quot; %</span>
+ <span class="c1"># (self._hexdump(binstr), timeo.sec, timeo.microsec))</span>
+ <span class="k">return</span> <span class="n">timeo</span></div>
<div class="viewcode-block" id="Connection.set_socket_read_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_read_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_socket_read_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeo</span><span class="p">):</span>
<span class="c1"># type: (timeout) -&gt; None</span>
@@ -676,13 +696,17 @@
<div class="viewcode-block" id="Connection.set_socket_write_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_write_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_socket_write_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeo</span><span class="p">):</span>
<span class="c1"># type: (timeout) -&gt; None</span>
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeo</span><span class="p">,</span> <span class="n">timeout</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="n">binstr</span> <span class="o">=</span> <span class="n">timeo</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
+ <span class="c1">#print(&quot;Debug: set_socket_write_timeout: &quot;</span>
+ <span class="c1"># &quot;input timeout(sec=%r, microsec=%r) -&gt; set sockopt value: %s&quot; %</span>
+ <span class="c1"># (timeo.sec, timeo.microsec, self._hexdump(binstr)))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span>
- <span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span> <span class="n">timeo</span><span class="o">.</span><span class="n">pack</span><span class="p">())</span></div>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span> <span class="n">binstr</span><span class="p">)</span></div>
<div class="viewcode-block" id="Connection.get_version"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_version">[docs]</a> <span class="k">def</span> <span class="nf">get_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; str</span>
- <span class="s2">&quot;Return the TLS/SSL protocol version for this connection.&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">))</span></div>
+ <span class="sd">&quot;&quot;&quot;Return the TLS/SSL protocol version for this connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">))</span></div>
<div class="viewcode-block" id="Connection.set_post_connection_check_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_post_connection_check_callback">[docs]</a> <span class="k">def</span> <span class="nf">set_post_connection_check_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">postConnectionCheck</span><span class="p">):</span> <span class="c1"># noqa</span>
<span class="c1"># type: (Callable) -&gt; None</span>
@@ -693,14 +717,35 @@
<span class="sd">&quot;&quot;&quot;Set the requested hostname for the SNI (Server Name Indication)</span>
<span class="sd"> extension.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_tlsext_host_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div></div>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_tlsext_host_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
+
+<div class="viewcode-block" id="Connection.set1_host"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set1_host">[docs]</a> <span class="k">def</span> <span class="nf">set1_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set the requested hostname to check in the server certificate.&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">name</span></div></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -713,14 +758,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -729,8 +784,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/Context.html b/doc/html/_modules/M2Crypto/SSL/Context.html
index d15f92c..f61a146 100644
--- a/doc/html/_modules/M2Crypto/SSL/Context.html
+++ b/doc/html/_modules/M2Crypto/SSL/Context.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.Context &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.Context</h1><div class="highlight"><pre>
@@ -55,7 +49,7 @@
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;ctxmap&#39;</span><span class="p">,</span> <span class="s1">&#39;Context&#39;</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">]</span>
-<span class="k">class</span> <span class="nc">_ctxmap</span><span class="p">:</span> <span class="c1"># noqa</span>
+<span class="k">class</span> <span class="nc">_ctxmap</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">singleton</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># type: Optional[_ctxmap]</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
@@ -86,7 +80,7 @@
<span class="nb">map</span> <span class="o">=</span> <span class="n">ctxmap</span>
-<div class="viewcode-block" id="Context"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context">[docs]</a><span class="k">class</span> <span class="nc">Context</span><span class="p">:</span>
+<div class="viewcode-block" id="Context"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context">[docs]</a><span class="k">class</span> <span class="nc">Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;&#39;Context&#39; for SSL connections.&quot;&quot;&quot;</span>
@@ -488,10 +482,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -504,14 +514,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -520,8 +540,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/SSLServer.html b/doc/html/_modules/M2Crypto/SSL/SSLServer.html
index 301630f..3abb777 100644
--- a/doc/html/_modules/M2Crypto/SSL/SSLServer.html
+++ b/doc/html/_modules/M2Crypto/SSL/SSLServer.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.SSLServer &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.SSLServer</h1><div class="highlight"><pre>
@@ -52,8 +46,11 @@
<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="k">import</span> <span class="n">Context</span> <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">six</span> <span class="c1"># noqa</span>
<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">util</span> <span class="c1"># noqa</span>
-<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.socketserver</span> <span class="k">import</span> <span class="p">(</span><span class="n">BaseServer</span><span class="p">,</span> <span class="n">ForkingMixIn</span><span class="p">,</span>
- <span class="n">TCPServer</span><span class="p">,</span> <span class="n">ThreadingMixIn</span><span class="p">)</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.socketserver</span> <span class="k">import</span> <span class="p">(</span><span class="n">BaseServer</span><span class="p">,</span> <span class="n">TCPServer</span><span class="p">,</span>
+ <span class="n">ThreadingMixIn</span><span class="p">)</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;nt&#39;</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">M2Crypto.six.moves.socketserver</span> <span class="k">import</span> <span class="n">ForkingMixIn</span>
<span class="kn">from</span> <span class="nn">socket</span> <span class="k">import</span> <span class="n">socket</span> <span class="c1"># noqa</span>
<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Union</span> <span class="c1"># noqa</span>
@@ -95,19 +92,36 @@
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">40</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="ForkingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ForkingSSLServer">[docs]</a><span class="k">class</span> <span class="nc">ForkingSSLServer</span><span class="p">(</span><span class="n">ForkingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
+<div class="viewcode-block" id="ThreadingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ThreadingSSLServer">[docs]</a><span class="k">class</span> <span class="nc">ThreadingSSLServer</span><span class="p">(</span><span class="n">ThreadingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
<span class="k">pass</span></div>
-<div class="viewcode-block" id="ThreadingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ThreadingSSLServer">[docs]</a><span class="k">class</span> <span class="nc">ThreadingSSLServer</span><span class="p">(</span><span class="n">ThreadingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
- <span class="k">pass</span></div>
+<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;nt&#39;</span><span class="p">:</span>
+<div class="viewcode-block" id="ForkingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ForkingSSLServer">[docs]</a> <span class="k">class</span> <span class="nc">ForkingSSLServer</span><span class="p">(</span><span class="n">ForkingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
+ <span class="k">pass</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -120,14 +134,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -136,8 +160,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/Session.html b/doc/html/_modules/M2Crypto/SSL/Session.html
index 0673387..d22a29c 100644
--- a/doc/html/_modules/M2Crypto/SSL/Session.html
+++ b/doc/html/_modules/M2Crypto/SSL/Session.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.Session &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.Session</h1><div class="highlight"><pre>
@@ -51,7 +45,7 @@
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span> <span class="c1"># noqa</span>
-<div class="viewcode-block" id="Session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session">[docs]</a><span class="k">class</span> <span class="nc">Session</span><span class="p">:</span>
+<div class="viewcode-block" id="Session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session">[docs]</a><span class="k">class</span> <span class="nc">Session</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">m2_ssl_session_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_free</span>
@@ -107,16 +101,31 @@
<span class="c1"># type: (AnyStr) -&gt; Session</span>
<span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">pemfile</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_read_pem</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">SSLError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
<span class="k">return</span> <span class="n">Session</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -129,14 +138,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -145,8 +164,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html b/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html
index 56561fb..88c32e0 100644
--- a/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html
+++ b/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.TwistedProtocolWrapper &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.TwistedProtocolWrapper</h1><div class="highlight"><pre>
@@ -159,7 +153,7 @@
<span class="k">return</span> <span class="n">reactor</span><span class="o">.</span><span class="n">listenTCP</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">wrappingFactory</span><span class="p">,</span> <span class="n">backlog</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span></div>
-<span class="k">class</span> <span class="nc">_BioProxy</span><span class="p">:</span>
+<span class="k">class</span> <span class="nc">_BioProxy</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The purpose of this class is to eliminate the __del__ method from</span>
<span class="sd"> TLSProtocolWrapper, and thus letting it be garbage collected.</span>
@@ -178,7 +172,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
-<span class="k">class</span> <span class="nc">_SSLProxy</span><span class="p">:</span>
+<span class="k">class</span> <span class="nc">_SSLProxy</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The purpose of this class is to eliminate the __del__ method from</span>
<span class="sd"> TLSProtocolWrapper, and thus letting it be garbage collected.</span>
@@ -208,7 +202,7 @@
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">,</span> <span class="n">startPassThrough</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span>
<span class="n">contextFactory</span><span class="p">,</span> <span class="n">postConnectionCheck</span><span class="p">):</span>
- <span class="c1"># type: policies.WrappingFactory, object, int, int, object, Checker</span>
+ <span class="c1"># type: (policies.WrappingFactory, object, int, int, object, Checker) -&gt; None</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> :param factory:</span>
<span class="sd"> :param wrappedProtocol:</span>
@@ -473,9 +467,9 @@
<span class="k">def</span> <span class="nf">_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="sa">b</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">clientHello</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="c1"># type: (bytes, int) -&gt; bytes</span>
<span class="sd">&quot;&quot;&quot;</span>
-<span class="sd"> @param data:</span>
-<span class="sd"> @param clientHello:</span>
-<span class="sd"> @return:</span>
+<span class="sd"> :param data:</span>
+<span class="sd"> :param clientHello:</span>
+<span class="sd"> :return:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">encryptedData</span> <span class="o">=</span> <span class="sa">b</span><span class="s1">&#39;&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">+=</span> <span class="n">data</span>
@@ -533,10 +527,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -549,14 +559,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -565,8 +585,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/cb.html b/doc/html/_modules/M2Crypto/SSL/cb.html
index 6d113d3..0e7c20f 100644
--- a/doc/html/_modules/M2Crypto/SSL/cb.html
+++ b/doc/html/_modules/M2Crypto/SSL/cb.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.cb &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.cb</h1><div class="highlight"><pre>
@@ -138,10 +132,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -154,14 +164,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -170,8 +190,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html b/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html
index e8dfd8d..a6b964d 100644
--- a/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html
+++ b/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.ssl_dispatcher &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.ssl_dispatcher</h1><div class="highlight"><pre>
@@ -57,7 +51,7 @@
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;ssl_dispatcher&#39;</span><span class="p">]</span>
-<div class="viewcode-block" id="ssl_dispatcher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">[docs]</a><span class="k">class</span> <span class="nc">ssl_dispatcher</span><span class="p">(</span><span class="n">asyncore</span><span class="o">.</span><span class="n">dispatcher</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="ssl_dispatcher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">[docs]</a><span class="k">class</span> <span class="nc">ssl_dispatcher</span><span class="p">(</span><span class="n">asyncore</span><span class="o">.</span><span class="n">dispatcher</span><span class="p">):</span>
<div class="viewcode-block" id="ssl_dispatcher.create_socket"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.create_socket">[docs]</a> <span class="k">def</span> <span class="nf">create_socket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl_context</span><span class="p">):</span>
<span class="c1"># type: (Context) -&gt; None</span>
@@ -85,10 +79,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -101,14 +111,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -117,8 +137,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/SSL/timeout.html b/doc/html/_modules/M2Crypto/SSL/timeout.html
index 73ed18a..d7fb07f 100644
--- a/doc/html/_modules/M2Crypto/SSL/timeout.html
+++ b/doc/html/_modules/M2Crypto/SSL/timeout.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.SSL.timeout &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.SSL.timeout</h1><div class="highlight"><pre>
@@ -48,12 +42,13 @@
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;DEFAULT_TIMEOUT&#39;</span><span class="p">,</span> <span class="s1">&#39;timeout&#39;</span><span class="p">,</span> <span class="s1">&#39;struct_to_timeout&#39;</span><span class="p">,</span> <span class="s1">&#39;struct_size&#39;</span><span class="p">]</span>
+<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">struct</span>
<span class="n">DEFAULT_TIMEOUT</span> <span class="o">=</span> <span class="mi">600</span> <span class="c1"># type: int</span>
-<div class="viewcode-block" id="timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout">[docs]</a><span class="k">class</span> <span class="nc">timeout</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout">[docs]</a><span class="k">class</span> <span class="nc">timeout</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sec</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">,</span> <span class="n">microsec</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="c1"># type: (int, int) -&gt; None</span>
@@ -61,25 +56,56 @@
<span class="bp">self</span><span class="o">.</span><span class="n">microsec</span> <span class="o">=</span> <span class="n">microsec</span>
<div class="viewcode-block" id="timeout.pack"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">microsec</span><span class="p">)</span></div></div>
+ <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span><span class="p">:</span>
+ <span class="n">millisec</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sec</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">+</span> <span class="nb">round</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">microsec</span><span class="p">)</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">))</span>
+ <span class="n">binstr</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;l&#39;</span><span class="p">,</span> <span class="n">millisec</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">binstr</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">microsec</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">binstr</span></div></div>
<div class="viewcode-block" id="struct_to_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_to_timeout">[docs]</a><span class="k">def</span> <span class="nf">struct_to_timeout</span><span class="p">(</span><span class="n">binstr</span><span class="p">):</span>
<span class="c1"># type: (bytes) -&gt; timeout</span>
- <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ms</span><span class="p">)</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="n">binstr</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">timeout</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ms</span><span class="p">)</span></div>
+ <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span><span class="p">:</span>
+ <span class="n">millisec</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;l&#39;</span><span class="p">,</span> <span class="n">binstr</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="c1"># On py3, int/int performs exact division and returns float. We want</span>
+ <span class="c1"># the whole number portion of the exact division result:</span>
+ <span class="n">sec</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">millisec</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">)</span>
+ <span class="n">microsec</span> <span class="o">=</span> <span class="p">(</span><span class="n">millisec</span> <span class="o">%</span> <span class="mi">1000</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="p">(</span><span class="n">sec</span><span class="p">,</span> <span class="n">microsec</span><span class="p">)</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="n">binstr</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">timeout</span><span class="p">(</span><span class="n">sec</span><span class="p">,</span> <span class="n">microsec</span><span class="p">)</span></div>
<div class="viewcode-block" id="struct_size"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_size">[docs]</a><span class="k">def</span> <span class="nf">struct_size</span><span class="p">():</span>
<span class="c1"># type: () -&gt; int</span>
- <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">)</span></div>
+ <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s1">&#39;win32&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="s1">&#39;l&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">)</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../../index.html">Documentation overview</a><ul>
@@ -92,14 +118,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -108,8 +144,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/X509.html b/doc/html/_modules/M2Crypto/X509.html
index 53e6fa5..b546394 100644
--- a/doc/html/_modules/M2Crypto/X509.html
+++ b/doc/html/_modules/M2Crypto/X509.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.X509 &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.X509</h1><div class="highlight"><pre>
@@ -53,8 +47,8 @@
<span class="kn">import</span> <span class="nn">binascii</span>
<span class="kn">import</span> <span class="nn">logging</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">ASN1</span><span class="p">,</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">ASN1</span><span class="p">,</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
<span class="n">FORMAT_DER</span> <span class="o">=</span> <span class="mi">0</span>
@@ -63,7 +57,7 @@
<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
-<div class="viewcode-block" id="X509Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509Error">[docs]</a><span class="k">class</span> <span class="nc">X509Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+<div class="viewcode-block" id="X509Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509Error">[docs]</a><span class="k">class</span> <span class="nc">X509Error</span><span class="p">(</span><span class="ne">ValueError</span><span class="p">):</span>
<span class="k">pass</span></div>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_init</span><span class="p">(</span><span class="n">X509Error</span><span class="p">)</span>
@@ -85,9 +79,6 @@
<span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;0123456789abcdefABCDEF:&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value must be precomputed hash&#39;</span><span class="p">)</span>
<span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509v3_set_nconf</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">ctx</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">MemoryError</span><span class="p">(</span>
- <span class="s1">&#39;Not enough memory when creating a new X509 extension&#39;</span><span class="p">)</span>
<span class="n">x509_ext_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509v3_ext_conf</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">x509_ext_ptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span>
@@ -98,7 +89,7 @@
<span class="k">return</span> <span class="n">x509_ext</span></div>
-<div class="viewcode-block" id="X509_Extension"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Extension"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Extension</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -146,7 +137,7 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the extension name, for example &#39;subjectAltName&#39;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">))</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">))</span></div>
<div class="viewcode-block" id="X509_Extension.get_value"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension.get_value">[docs]</a> <span class="k">def</span> <span class="nf">get_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flag</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="c1"># type: (int, int) -&gt; str</span>
@@ -158,10 +149,10 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_ext_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">,</span> <span class="n">flag</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
-<div class="viewcode-block" id="X509_Extension_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Extension_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension_Stack</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Extension Stack</span>
@@ -239,7 +230,7 @@
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span></div></div>
-<div class="viewcode-block" id="X509_Name_Entry"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry">[docs]</a><span class="k">class</span> <span class="nc">X509_Name_Entry</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Name_Entry"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry">[docs]</a><span class="k">class</span> <span class="nc">X509_Name_Entry</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Name Entry</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -300,7 +291,7 @@
<span class="n">field</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="X509_Name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name">[docs]</a><span class="k">class</span> <span class="nc">X509_Name</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name">[docs]</a><span class="k">class</span> <span class="nc">X509_Name</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Name</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -358,7 +349,7 @@
<span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
<span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_name_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">[</span><span class="n">attr</span><span class="p">]))</span>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_name_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">[</span><span class="n">attr</span><span class="p">]))</span>
<span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span>
@@ -374,7 +365,7 @@
<span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
<span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_set_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">[</span><span class="n">attr</span><span class="p">],</span>
- <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+ <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
@@ -427,8 +418,8 @@
<span class="sd"> :return: 1 for success of 0 if an error occurred.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_add_entry_by_txt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span>
- <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">field</span><span class="p">),</span> <span class="nb">type</span><span class="p">,</span>
- <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="nb">set</span><span class="p">)</span></div>
+ <span class="n">six</span><span class="o">.</span><span class="n">ensure_str</span><span class="p">(</span><span class="n">field</span><span class="p">),</span> <span class="nb">type</span><span class="p">,</span>
+ <span class="n">six</span><span class="o">.</span><span class="n">ensure_str</span><span class="p">(</span><span class="n">entry</span><span class="p">),</span> <span class="nb">len</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="nb">set</span><span class="p">)</span></div>
<div class="viewcode-block" id="X509_Name.entry_count"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.entry_count">[docs]</a> <span class="k">def</span> <span class="nf">entry_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; int</span>
@@ -469,7 +460,7 @@
<span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_name_print_ex</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
<div class="viewcode-block" id="X509_Name.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; bytes</span>
@@ -484,7 +475,7 @@
<span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="X509"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509">[docs]</a><span class="k">class</span> <span class="nc">X509</span><span class="p">:</span>
+<div class="viewcode-block" id="X509"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509">[docs]</a><span class="k">class</span> <span class="nc">X509</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X.509 Certificate</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -521,7 +512,7 @@
<span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
<div class="viewcode-block" id="X509.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; bytes</span>
@@ -733,7 +724,7 @@
<span class="n">m2x509_extension_get_name</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_name</span>
<span class="n">x509</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span>
- <span class="n">name</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_ext_count</span><span class="p">(</span><span class="n">x509</span><span class="p">)):</span>
<span class="n">ext_ptr</span> <span class="o">=</span> <span class="n">m2x509_get_ext</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
<span class="k">if</span> <span class="n">m2x509_extension_get_name</span><span class="p">(</span><span class="n">ext_ptr</span><span class="p">)</span> <span class="o">==</span> <span class="n">name</span><span class="p">:</span>
@@ -827,7 +818,7 @@
<span class="n">md</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">MessageDigest</span><span class="p">(</span><span class="n">md</span><span class="p">)</span>
<span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">der</span><span class="p">)</span>
<span class="n">digest</span> <span class="o">=</span> <span class="n">md</span><span class="o">.</span><span class="n">final</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">digest</span><span class="p">)</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span></div></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">digest</span><span class="p">)</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="load_cert"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_cert">[docs]</a><span class="k">def</span> <span class="nf">load_cert</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
@@ -890,7 +881,7 @@
<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">load_cert_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span></div>
@@ -904,13 +895,13 @@
<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
<span class="k">return</span> <span class="n">X509</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></div>
-<div class="viewcode-block" id="X509_Store_Context"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context">[docs]</a><span class="k">class</span> <span class="nc">X509_Store_Context</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Store_Context"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context">[docs]</a><span class="k">class</span> <span class="nc">X509_Store_Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Store Context</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -974,7 +965,7 @@
<span class="k">return</span> <span class="n">X509_Stack</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_get1_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div></div>
-<div class="viewcode-block" id="X509_Store"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store">[docs]</a><span class="k">class</span> <span class="nc">X509_Store</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Store"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store">[docs]</a><span class="k">class</span> <span class="nc">X509_Store</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Store</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -1048,7 +1039,7 @@
<span class="n">add_cert</span> <span class="o">=</span> <span class="n">add_x509</span></div>
-<div class="viewcode-block" id="X509_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="X509_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Stack</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Stack</span>
@@ -1141,12 +1132,12 @@
<span class="sd"> :return: X509_Stack</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">der_string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">der_string</span><span class="p">)</span>
+ <span class="n">der_string</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">der_string</span><span class="p">)</span>
<span class="n">stack_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">make_stack_from_der_sequence</span><span class="p">(</span><span class="n">der_string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">X509_Stack</span><span class="p">(</span><span class="n">stack_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
-<div class="viewcode-block" id="Request"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request">[docs]</a><span class="k">class</span> <span class="nc">Request</span><span class="p">:</span>
+<div class="viewcode-block" id="Request"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request">[docs]</a><span class="k">class</span> <span class="nc">Request</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Certificate Request.</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -1172,7 +1163,7 @@
<span class="c1"># type: () -&gt; str</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_req_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div>
<div class="viewcode-block" id="Request.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; bytes</span>
@@ -1325,8 +1316,6 @@
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Unknown filetype. Must be either FORMAT_PEM or FORMAT_DER&quot;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
@@ -1349,8 +1338,7 @@
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Unknown format. Must be either FORMAT_DER or FORMAT_PEM&quot;</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
<span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span></div>
@@ -1367,7 +1355,7 @@
<span class="sd"> :return: M2Crypto.X509.Request object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">load_request_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="nb">format</span><span class="p">)</span></div>
@@ -1380,12 +1368,12 @@
<span class="sd"> :param string: String containing a certificate request in DER format.</span>
<span class="sd"> :return: M2Crypto.X509.Request object.</span>
<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">load_request_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">FORMAT_DER</span><span class="p">)</span></div>
-<div class="viewcode-block" id="CRL"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.CRL">[docs]</a><span class="k">class</span> <span class="nc">CRL</span><span class="p">:</span>
+<div class="viewcode-block" id="CRL"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.CRL">[docs]</a><span class="k">class</span> <span class="nc">CRL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> X509 Certificate Revocation List</span>
<span class="sd"> &quot;&quot;&quot;</span>
@@ -1420,7 +1408,7 @@
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
<span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">crl</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span></div></div>
<div class="viewcode-block" id="load_crl"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_crl">[docs]</a><span class="k">def</span> <span class="nf">load_crl</span><span class="p">(</span><span class="n">file</span><span class="p">):</span>
@@ -1435,16 +1423,30 @@
<span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_read_pem</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
<span class="k">return</span> <span class="n">CRL</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -1455,14 +1457,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -1471,8 +1483,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/ftpslib.html b/doc/html/_modules/M2Crypto/ftpslib.html
index 4a4e4f0..b0db673 100644
--- a/doc/html/_modules/M2Crypto/ftpslib.html
+++ b/doc/html/_modules/M2Crypto/ftpslib.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.ftpslib &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.ftpslib</h1><div class="highlight"><pre>
@@ -82,7 +76,7 @@
<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">SSL</span>
-<div class="viewcode-block" id="FTP_TLS"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS">[docs]</a><span class="k">class</span> <span class="nc">FTP_TLS</span><span class="p">(</span><span class="n">FTP</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="FTP_TLS"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS">[docs]</a><span class="k">class</span> <span class="nc">FTP_TLS</span><span class="p">(</span><span class="n">FTP</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Python OO interface to client-side FTP/TLS.&quot;&quot;&quot;</span>
@@ -133,10 +127,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -147,14 +157,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -163,8 +183,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/httpslib.html b/doc/html/_modules/M2Crypto/httpslib.html
index d9b35d3..93c1cc5 100644
--- a/doc/html/_modules/M2Crypto/httpslib.html
+++ b/doc/html/_modules/M2Crypto/httpslib.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.httpslib &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.httpslib</h1><div class="highlight"><pre>
@@ -50,12 +44,12 @@
<span class="kn">import</span> <span class="nn">base64</span>
<span class="kn">import</span> <span class="nn">socket</span>
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.urllib_parse</span> <span class="k">import</span> <span class="n">urlsplit</span><span class="p">,</span> <span class="n">urlunsplit</span>
<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_client</span> <span class="k">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
<span class="c1"># This is not imported with just &#39;*&#39;</span>
<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_client</span> <span class="k">import</span> <span class="n">HTTPS_PORT</span>
-<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
@@ -236,7 +230,7 @@
<span class="bp">self</span><span class="o">.</span><span class="n">_real_host</span> <span class="o">=</span> <span class="n">host</span> <span class="c1"># type: str</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_real_port</span> <span class="o">=</span> <span class="n">port</span> <span class="c1"># type: int</span>
- <span class="n">rest</span> <span class="o">=</span> <span class="n">urlunsplit</span><span class="p">((</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">fragment</span><span class="p">))</span>
+ <span class="n">rest</span> <span class="o">=</span> <span class="n">urlunsplit</span><span class="p">((</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">fragment</span><span class="p">))</span>
<span class="n">HTTPSConnection</span><span class="o">.</span><span class="n">putrequest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">skip_host</span><span class="p">,</span>
<span class="n">skip_accept_encoding</span><span class="p">)</span></div>
@@ -287,7 +281,7 @@
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_AUTH_HEADER</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span><span class="p">)</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_start_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; None</span>
@@ -307,14 +301,30 @@
<span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
<span class="n">enc_userpass</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodestring</span><span class="p">(</span><span class="n">userpass</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="s2">&quot;Basic </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">enc_userpass</span><span class="p">)</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_binary</span><span class="p">(</span><span class="s2">&quot;Basic </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">enc_userpass</span><span class="p">)</span></div>
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -325,14 +335,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -341,8 +361,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/m2crypto.html b/doc/html/_modules/M2Crypto/m2crypto.html
deleted file mode 100644
index 8454683..0000000
--- a/doc/html/_modules/M2Crypto/m2crypto.html
+++ /dev/null
@@ -1,172 +0,0 @@
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-
- <title>M2Crypto.m2crypto &mdash; M2Crypto documentation</title>
-
- <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
- <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
-
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true
- };
- </script>
- <script type="text/javascript" src="../../_static/jquery.js"></script>
- <script type="text/javascript" src="../../_static/underscore.js"></script>
- <script type="text/javascript" src="../../_static/doctools.js"></script>
- <link rel="top" title="M2Crypto documentation" href="../../index.html" />
- <link rel="up" title="Module code" href="../index.html" />
- </head>
- <body>
- <div class="related">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="../../genindex.html" title="General Index"
- accesskey="I">index</a></li>
- <li class="right" >
- <a href="../../py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
- <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
- </ul>
- </div>
-
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body">
-
- <h1>Source code for M2Crypto.m2crypto</h1><div class="highlight"><pre>
-<span class="c"># This file was automatically generated by SWIG (http://www.swig.org).</span>
-<span class="c"># Version 2.0.10</span>
-<span class="c">#</span>
-<span class="c"># Do not make changes to this file unless you know what you are doing--modify</span>
-<span class="c"># the SWIG interface file instead.</span>
-
-
-
-<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">version_info</span>
-<span class="k">if</span> <span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">0</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">swig_import_helper</span><span class="p">():</span>
- <span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">dirname</span>
- <span class="kn">import</span> <span class="nn">imp</span>
- <span class="n">fp</span> <span class="o">=</span> <span class="bp">None</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">fp</span><span class="p">,</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">description</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">find_module</span><span class="p">(</span><span class="s">&#39;_m2crypto&#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)])</span>
- <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">_m2crypto</span>
- <span class="k">return</span> <span class="n">_m2crypto</span>
- <span class="k">if</span> <span class="n">fp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">_mod</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="s">&#39;_m2crypto&#39;</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
- <span class="k">finally</span><span class="p">:</span>
- <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">_mod</span>
- <span class="n">_m2crypto</span> <span class="o">=</span> <span class="n">swig_import_helper</span><span class="p">()</span>
- <span class="k">del</span> <span class="n">swig_import_helper</span>
-<span class="k">else</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">_m2crypto</span>
-<span class="k">del</span> <span class="n">version_info</span>
-<span class="kn">from</span> <span class="nn">_m2crypto</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="k">try</span><span class="p">:</span>
- <span class="n">_swig_property</span> <span class="o">=</span> <span class="nb">property</span>
-<span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
- <span class="k">pass</span> <span class="c"># Python &lt; 2.2 doesn&#39;t have &#39;property&#39;.</span>
-<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">,</span><span class="n">static</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;this&quot;</span><span class="p">):</span>
- <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span> <span class="o">==</span> <span class="s">&#39;SwigPyObject&#39;</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
- <span class="k">return</span>
- <span class="n">method</span> <span class="o">=</span> <span class="n">class_type</span><span class="o">.</span><span class="n">__swig_setmethods__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="bp">None</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">method</span><span class="p">:</span> <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">value</span><span class="p">)</span>
- <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">static</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s">&quot;You cannot add attributes to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">_swig_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">_swig_setattr_nondynamic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">_swig_getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">):</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">()</span>
- <span class="n">method</span> <span class="o">=</span> <span class="n">class_type</span><span class="o">.</span><span class="n">__swig_getmethods__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="bp">None</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">method</span><span class="p">:</span> <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
- <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">_swig_repr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span> <span class="n">strthis</span> <span class="o">=</span> <span class="s">&quot;proxy of &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">__repr__</span><span class="p">()</span>
- <span class="k">except</span><span class="p">:</span> <span class="n">strthis</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
- <span class="k">return</span> <span class="s">&quot;&lt;</span><span class="si">%s</span><span class="s">.</span><span class="si">%s</span><span class="s">; </span><span class="si">%s</span><span class="s"> &gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">strthis</span><span class="p">,)</span>
-
-<span class="k">try</span><span class="p">:</span>
- <span class="n">_object</span> <span class="o">=</span> <span class="nb">object</span>
- <span class="n">_newclass</span> <span class="o">=</span> <span class="mi">1</span>
-<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
- <span class="k">class</span> <span class="nc">_object</span> <span class="p">:</span> <span class="k">pass</span>
- <span class="n">_newclass</span> <span class="o">=</span> <span class="mi">0</span>
-
-
-<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic_method</span><span class="p">(</span><span class="nb">set</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">set_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">):</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
- <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s">&quot;this&quot;</span><span class="p">):</span>
- <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s">&quot;You cannot add attributes to </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">set_attr</span>
-</pre></div>
-
- </div>
- </div>
- </div>
- <div class="sphinxsidebar">
- <div class="sphinxsidebarwrapper">
-<div id="searchbox" style="display: none">
- <h3>Quick search</h3>
- <form class="search" action="../../search.html" method="get">
- <input type="text" name="q" />
- <input type="submit" value="Go" />
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
- <p class="searchtip" style="font-size: 90%">
- Enter search terms or a module, class or function name.
- </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="related">
- <h3>Navigation</h3>
- <ul>
- <li class="right" style="margin-right: 10px">
- <a href="../../genindex.html" title="General Index"
- >index</a></li>
- <li class="right" >
- <a href="../../py-modindex.html" title="Python Module Index"
- >modules</a> |</li>
- <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
- <li><a href="../index.html" >Module code</a> &raquo;</li>
- </ul>
- </div>
- <div class="footer">
- &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
- Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
- </div>
- </body>
-</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/m2urllib.html b/doc/html/_modules/M2Crypto/m2urllib.html
index 6c3ee9f..bb1f8cb 100644
--- a/doc/html/_modules/M2Crypto/m2urllib.html
+++ b/doc/html/_modules/M2Crypto/m2urllib.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.m2urllib &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.m2urllib</h1><div class="highlight"><pre>
@@ -68,7 +62,7 @@
<div class="viewcode-block" id="open_https"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2urllib.open_https">[docs]</a><span class="k">def</span> <span class="nf">open_https</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="c1"># type: (AnyStr, Optional[bytes], Optional[SSL.Context]) -&gt; addinfourl</span>
+ <span class="c1"># type: (URLOpener, AnyStr, Optional[bytes], Optional[SSL.Context]) -&gt; addinfourl</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Open URL over the SSL connection.</span>
@@ -129,8 +123,9 @@
<span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;http error&#39;</span><span class="p">,</span> <span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">user_passwd</span><span class="p">:</span>
- <span class="k">with</span> <span class="n">warnings</span><span class="o">.</span><span class="n">catch_warnings</span><span class="p">():</span>
- <span class="n">warnings</span><span class="o">.</span><span class="n">simplefilter</span><span class="p">(</span><span class="s2">&quot;ignore&quot;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodebytes</span><span class="p">(</span><span class="n">user_passwd</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
<span class="n">auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodestring</span><span class="p">(</span><span class="n">user_passwd</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">auth</span> <span class="o">=</span> <span class="kc">None</span>
@@ -162,10 +157,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -176,14 +187,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -192,8 +213,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/m2urllib2.html b/doc/html/_modules/M2Crypto/m2urllib2.html
index f2897c8..23bf5f2 100644
--- a/doc/html/_modules/M2Crypto/m2urllib2.html
+++ b/doc/html/_modules/M2Crypto/m2urllib2.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.m2urllib2 &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.m2urllib2</h1><div class="highlight"><pre>
@@ -172,7 +166,7 @@
<span class="n">r</span><span class="o">.</span><span class="n">_decref_socketios</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="kc">None</span>
<span class="n">r</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">ssl</span>
<span class="n">r</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span>
- <span class="n">r</span><span class="o">.</span><span class="n">recv_into</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">b</span><span class="p">:</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="o">.</span><span class="n">recv_into</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
+ <span class="n">r</span><span class="o">.</span><span class="n">recv_into</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">readinto</span>
<span class="n">fp</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketIO</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
<span class="n">resp</span> <span class="o">=</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())</span>
@@ -228,10 +222,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -242,14 +252,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -258,8 +278,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/m2xmlrpclib.html b/doc/html/_modules/M2Crypto/m2xmlrpclib.html
index 2bb0a87..fb3834f 100644
--- a/doc/html/_modules/M2Crypto/m2xmlrpclib.html
+++ b/doc/html/_modules/M2Crypto/m2xmlrpclib.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.m2xmlrpclib &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.m2xmlrpclib</h1><div class="highlight"><pre>
@@ -63,7 +57,7 @@
<span class="n">__version__</span> <span class="o">=</span> <span class="n">M2Crypto</span><span class="o">.</span><span class="n">__version__</span>
-<div class="viewcode-block" id="SSL_Transport"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport">[docs]</a><span class="k">class</span> <span class="nc">SSL_Transport</span><span class="p">(</span><span class="n">Transport</span><span class="p">):</span> <span class="c1"># noqa</span>
+<div class="viewcode-block" id="SSL_Transport"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport">[docs]</a><span class="k">class</span> <span class="nc">SSL_Transport</span><span class="p">(</span><span class="n">Transport</span><span class="p">):</span>
<span class="n">user_agent</span> <span class="o">=</span> <span class="s2">&quot;M2Crypto_XMLRPC/</span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">__version__</span><span class="p">,</span>
<span class="n">Transport</span><span class="o">.</span><span class="n">user_agent</span><span class="p">)</span>
@@ -121,10 +115,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -135,14 +145,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -151,8 +171,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/threading.html b/doc/html/_modules/M2Crypto/threading.html
index 113c6e1..7074d6c 100644
--- a/doc/html/_modules/M2Crypto/threading.html
+++ b/doc/html/_modules/M2Crypto/threading.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.threading &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.threading</h1><div class="highlight"><pre>
@@ -67,10 +61,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -81,14 +91,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -97,8 +117,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/M2Crypto/util.html b/doc/html/_modules/M2Crypto/util.html
index 8303b88..3cd7461 100644
--- a/doc/html/_modules/M2Crypto/util.html
+++ b/doc/html/_modules/M2Crypto/util.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>M2Crypto.util &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>Source code for M2Crypto.util</h1><div class="highlight"><pre>
@@ -43,6 +37,9 @@
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> M2Crypto utility routines.</span>
+<span class="sd"> NOTHING IN THIS MODULE IS GUARANTEED TO BE STABLE, USED ONLY FOR</span>
+<span class="sd"> INTERNAL PURPOSES OF M2CRYPTO.</span>
+
<span class="sd"> Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
<span class="sd"> Portions created by Open Source Applications Foundation (OSAF) are</span>
@@ -53,12 +50,9 @@
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">sys</span>
-<span class="c1"># This means &quot;Python 2.7 or higher&quot; so it is True for py3k as well</span>
-<span class="n">py27plus</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="c1"># type: bool</span>
-
-<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">py27plus</span><span class="p">,</span> <span class="n">six</span>
<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="k">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
<span class="c1"># see https://github.com/python/typeshed/issues/222</span>
<span class="n">AddrType</span> <span class="o">=</span> <span class="n">Union</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="nb">str</span><span class="p">]</span>
@@ -85,57 +79,9 @@
<span class="k">return</span> <span class="n">data</span> <span class="o">+</span> <span class="nb">chr</span><span class="p">(</span><span class="n">pad</span><span class="p">)</span> <span class="o">*</span> <span class="n">pad</span></div>
-<span class="c1"># before the introduction of py3{bytes,str}, python2 code</span>
-<span class="c1"># was just using args as-is</span>
-<span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY2</span><span class="p">:</span>
- <span class="k">def</span> <span class="nf">py3bytes</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
- <span class="c1"># type: (AnyStr) -&gt; Optional[bytes,bytearray]</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">unicode</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytearray</span><span class="p">,</span> <span class="nb">str</span><span class="p">)):</span>
- <span class="k">return</span> <span class="n">x</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
- <span class="s1">&#39;No string argument provided (type of x is </span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span>
- <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
-
- <span class="k">def</span> <span class="nf">py3str</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
- <span class="c1"># type: (Optional[str,bytearray]) -&gt; str</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">):</span>
- <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">unicode</span><span class="p">)):</span>
- <span class="k">return</span> <span class="n">x</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
- <span class="s1">&#39;No string argument provided (type of x is </span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span>
- <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
-<span class="k">else</span><span class="p">:</span>
-<div class="viewcode-block" id="py3bytes"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.py3bytes">[docs]</a> <span class="k">def</span> <span class="nf">py3bytes</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
- <span class="c1"># type: (AnyStr) -&gt; Optional[bytes,bytearray]</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
- <span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
- <span class="k">return</span> <span class="n">x</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
- <span class="s1">&#39;No string argument provided (type of x is </span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span>
- <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">))</span></div>
-
-<div class="viewcode-block" id="py3str"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.py3str">[docs]</a> <span class="k">def</span> <span class="nf">py3str</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
- <span class="c1"># type: (Optional[AnyStr,bytearray]) -&gt; str</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
- <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">x</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
- <span class="s1">&#39;No string argument provided (type of x is </span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span>
- <span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">))</span></div>
-
-
<div class="viewcode-block" id="bin_to_hex"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.bin_to_hex">[docs]</a><span class="k">def</span> <span class="nf">bin_to_hex</span><span class="p">(</span><span class="n">b</span><span class="p">):</span>
<span class="c1"># type: (bytes) -&gt; str</span>
- <span class="k">return</span> <span class="n">py3str</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">b2a_base64</span><span class="p">(</span><span class="n">b</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
+ <span class="k">return</span> <span class="n">six</span><span class="o">.</span><span class="n">ensure_text</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">b2a_base64</span><span class="p">(</span><span class="n">b</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span></div>
<div class="viewcode-block" id="octx_to_num"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.octx_to_num">[docs]</a><span class="k">def</span> <span class="nf">octx_to_num</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
@@ -179,10 +125,26 @@
</pre></div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../../index.html">Documentation overview</a><ul>
@@ -193,14 +155,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -209,8 +181,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/index.html b/doc/html/_modules/index.html
index 83a3756..56bc7ef 100644
--- a/doc/html/_modules/index.html
+++ b/doc/html/_modules/index.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Overview: module code &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
+ <script type="text/javascript" src="../_static/language_data.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1>All modules for which code is available</h1>
@@ -73,14 +67,30 @@
<li><a href="M2Crypto/m2xmlrpclib.html">M2Crypto.m2xmlrpclib</a></li>
<li><a href="M2Crypto/threading.html">M2Crypto.threading</a></li>
<li><a href="M2Crypto/util.html">M2Crypto.util</a></li>
-<li><a href="urllib2.html">urllib2</a></li>
+<li><a href="urllib/request.html">urllib.request</a></li>
</ul>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
@@ -89,14 +99,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -105,8 +125,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/_modules/urllib/request.html b/doc/html/_modules/urllib/request.html
new file mode 100644
index 0000000..ee22b9d
--- /dev/null
+++ b/doc/html/_modules/urllib/request.html
@@ -0,0 +1,2841 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>urllib.request &#8212; M2Crypto documentation</title>
+ <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+ <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
+ <script type="text/javascript" src="../../_static/jquery.js"></script>
+ <script type="text/javascript" src="../../_static/underscore.js"></script>
+ <script type="text/javascript" src="../../_static/doctools.js"></script>
+ <script type="text/javascript" src="../../_static/language_data.js"></script>
+ <link rel="index" title="Index" href="../../genindex.html" />
+ <link rel="search" title="Search" href="../../search.html" />
+
+ <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
+
+
+ <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
+
+ </head><body>
+
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+
+
+ <div class="body" role="main">
+
+ <h1>Source code for urllib.request</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;An extensible library for opening URLs using a variety of protocols</span>
+
+<span class="sd">The simplest way to use this module is to call the urlopen function,</span>
+<span class="sd">which accepts a string containing a URL or a Request object (described</span>
+<span class="sd">below). It opens the URL and returns the results as file-like</span>
+<span class="sd">object; the returned object has some extra methods described below.</span>
+
+<span class="sd">The OpenerDirector manages a collection of Handler objects that do</span>
+<span class="sd">all the actual work. Each Handler implements a particular protocol or</span>
+<span class="sd">option. The OpenerDirector is a composite object that invokes the</span>
+<span class="sd">Handlers needed to open the requested URL. For example, the</span>
+<span class="sd">HTTPHandler performs HTTP GET and POST requests and deals with</span>
+<span class="sd">non-error returns. The HTTPRedirectHandler automatically deals with</span>
+<span class="sd">HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler</span>
+<span class="sd">deals with digest authentication.</span>
+
+<span class="sd">urlopen(url, data=None) -- Basic usage is the same as original</span>
+<span class="sd">urllib. pass the url and optionally data to post to an HTTP URL, and</span>
+<span class="sd">get a file-like object back. One difference is that you can also pass</span>
+<span class="sd">a Request instance instead of URL. Raises a URLError (subclass of</span>
+<span class="sd">OSError); for HTTP errors, raises an HTTPError, which can also be</span>
+<span class="sd">treated as a valid response.</span>
+
+<span class="sd">build_opener -- Function that creates a new OpenerDirector instance.</span>
+<span class="sd">Will install the default handlers. Accepts one or more Handlers as</span>
+<span class="sd">arguments, either instances or Handler classes that it will</span>
+<span class="sd">instantiate. If one of the argument is a subclass of the default</span>
+<span class="sd">handler, the argument will be installed instead of the default.</span>
+
+<span class="sd">install_opener -- Installs a new opener as the default opener.</span>
+
+<span class="sd">objects of interest:</span>
+
+<span class="sd">OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages</span>
+<span class="sd">the Handler classes, while dealing with requests and responses.</span>
+
+<span class="sd">Request -- An object that encapsulates the state of a request. The</span>
+<span class="sd">state can be as simple as the URL. It can also include extra HTTP</span>
+<span class="sd">headers, e.g. a User-Agent.</span>
+
+<span class="sd">BaseHandler --</span>
+
+<span class="sd">internals:</span>
+<span class="sd">BaseHandler and parent</span>
+<span class="sd">_call_chain conventions</span>
+
+<span class="sd">Example usage:</span>
+
+<span class="sd">import urllib.request</span>
+
+<span class="sd"># set up authentication info</span>
+<span class="sd">authinfo = urllib.request.HTTPBasicAuthHandler()</span>
+<span class="sd">authinfo.add_password(realm=&#39;PDQ Application&#39;,</span>
+<span class="sd"> uri=&#39;https://mahler:8092/site-updates.py&#39;,</span>
+<span class="sd"> user=&#39;klem&#39;,</span>
+<span class="sd"> passwd=&#39;geheim$parole&#39;)</span>
+
+<span class="sd">proxy_support = urllib.request.ProxyHandler({&quot;http&quot; : &quot;http://ahad-haam:3128&quot;})</span>
+
+<span class="sd"># build a new opener that adds authentication and caching FTP handlers</span>
+<span class="sd">opener = urllib.request.build_opener(proxy_support, authinfo,</span>
+<span class="sd"> urllib.request.CacheFTPHandler)</span>
+
+<span class="sd"># install it</span>
+<span class="sd">urllib.request.install_opener(opener)</span>
+
+<span class="sd">f = urllib.request.urlopen(&#39;http://www.python.org/&#39;)</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="c1"># XXX issues:</span>
+<span class="c1"># If an authentication error handler that tries to perform</span>
+<span class="c1"># authentication for some reason but fails, how should the error be</span>
+<span class="c1"># signalled? The client needs to know the HTTP error code. But if</span>
+<span class="c1"># the handler knows that the problem was, e.g., that it didn&#39;t know</span>
+<span class="c1"># that hash algo that requested in the challenge, it would be good to</span>
+<span class="c1"># pass that information along to the client, too.</span>
+<span class="c1"># ftp errors aren&#39;t handled cleanly</span>
+<span class="c1"># check digest against correct (i.e. non-apache) implementation</span>
+
+<span class="c1"># Possible extensions:</span>
+<span class="c1"># complex proxies XXX not sure what exactly was meant by this</span>
+<span class="c1"># abstract factory for opener</span>
+
+<span class="kn">import</span> <span class="nn">base64</span>
+<span class="kn">import</span> <span class="nn">bisect</span>
+<span class="kn">import</span> <span class="nn">email</span>
+<span class="kn">import</span> <span class="nn">hashlib</span>
+<span class="kn">import</span> <span class="nn">http.client</span>
+<span class="kn">import</span> <span class="nn">io</span>
+<span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">posixpath</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+<span class="kn">import</span> <span class="nn">string</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">time</span>
+<span class="kn">import</span> <span class="nn">tempfile</span>
+<span class="kn">import</span> <span class="nn">contextlib</span>
+<span class="kn">import</span> <span class="nn">warnings</span>
+
+
+<span class="kn">from</span> <span class="nn">urllib.error</span> <span class="k">import</span> <span class="n">URLError</span><span class="p">,</span> <span class="n">HTTPError</span><span class="p">,</span> <span class="n">ContentTooShortError</span>
+<span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="k">import</span> <span class="p">(</span>
+ <span class="n">urlparse</span><span class="p">,</span> <span class="n">urlsplit</span><span class="p">,</span> <span class="n">urljoin</span><span class="p">,</span> <span class="n">unwrap</span><span class="p">,</span> <span class="n">quote</span><span class="p">,</span> <span class="n">unquote</span><span class="p">,</span>
+ <span class="n">splittype</span><span class="p">,</span> <span class="n">splithost</span><span class="p">,</span> <span class="n">splitport</span><span class="p">,</span> <span class="n">splituser</span><span class="p">,</span> <span class="n">splitpasswd</span><span class="p">,</span>
+ <span class="n">splitattr</span><span class="p">,</span> <span class="n">splitquery</span><span class="p">,</span> <span class="n">splitvalue</span><span class="p">,</span> <span class="n">splittag</span><span class="p">,</span> <span class="n">to_bytes</span><span class="p">,</span>
+ <span class="n">unquote_to_bytes</span><span class="p">,</span> <span class="n">urlunparse</span><span class="p">)</span>
+<span class="kn">from</span> <span class="nn">urllib.response</span> <span class="k">import</span> <span class="n">addinfourl</span><span class="p">,</span> <span class="n">addclosehook</span>
+
+<span class="c1"># check for SSL</span>
+<span class="k">try</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">ssl</span>
+<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="n">_have_ssl</span> <span class="o">=</span> <span class="kc">False</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="n">_have_ssl</span> <span class="o">=</span> <span class="kc">True</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="c1"># Classes</span>
+ <span class="s1">&#39;Request&#39;</span><span class="p">,</span> <span class="s1">&#39;OpenerDirector&#39;</span><span class="p">,</span> <span class="s1">&#39;BaseHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTPDefaultErrorHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HTTPRedirectHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTPCookieProcessor&#39;</span><span class="p">,</span> <span class="s1">&#39;ProxyHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HTTPPasswordMgr&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTPPasswordMgrWithDefaultRealm&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HTTPPasswordMgrWithPriorAuth&#39;</span><span class="p">,</span> <span class="s1">&#39;AbstractBasicAuthHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HTTPBasicAuthHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;ProxyBasicAuthHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;AbstractDigestAuthHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;HTTPDigestAuthHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;ProxyDigestAuthHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTPHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;FileHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;FTPHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;CacheFTPHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;DataHandler&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;UnknownHandler&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTPErrorProcessor&#39;</span><span class="p">,</span>
+ <span class="c1"># Functions</span>
+ <span class="s1">&#39;urlopen&#39;</span><span class="p">,</span> <span class="s1">&#39;install_opener&#39;</span><span class="p">,</span> <span class="s1">&#39;build_opener&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;pathname2url&#39;</span><span class="p">,</span> <span class="s1">&#39;url2pathname&#39;</span><span class="p">,</span> <span class="s1">&#39;getproxies&#39;</span><span class="p">,</span>
+ <span class="c1"># Legacy interface</span>
+ <span class="s1">&#39;urlretrieve&#39;</span><span class="p">,</span> <span class="s1">&#39;urlcleanup&#39;</span><span class="p">,</span> <span class="s1">&#39;URLopener&#39;</span><span class="p">,</span> <span class="s1">&#39;FancyURLopener&#39;</span><span class="p">,</span>
+<span class="p">]</span>
+
+<span class="c1"># used in User-Agent header sent</span>
+<span class="n">__version__</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%d</span><span class="s1">.</span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
+
+<span class="n">_opener</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="k">def</span> <span class="nf">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">_GLOBAL_DEFAULT_TIMEOUT</span><span class="p">,</span>
+ <span class="o">*</span><span class="p">,</span> <span class="n">cafile</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">capath</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">cadefault</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&#39;&#39;&#39;Open the URL url, which can be either a string or a Request object.</span>
+
+<span class="sd"> *data* must be an object specifying additional data to be sent to</span>
+<span class="sd"> the server, or None if no such data is needed. See Request for</span>
+<span class="sd"> details.</span>
+
+<span class="sd"> urllib.request module uses HTTP/1.1 and includes a &quot;Connection:close&quot;</span>
+<span class="sd"> header in its HTTP requests.</span>
+
+<span class="sd"> The optional *timeout* parameter specifies a timeout in seconds for</span>
+<span class="sd"> blocking operations like the connection attempt (if not specified, the</span>
+<span class="sd"> global default timeout setting will be used). This only works for HTTP,</span>
+<span class="sd"> HTTPS and FTP connections.</span>
+
+<span class="sd"> If *context* is specified, it must be a ssl.SSLContext instance describing</span>
+<span class="sd"> the various SSL options. See HTTPSConnection for more details.</span>
+
+<span class="sd"> The optional *cafile* and *capath* parameters specify a set of trusted CA</span>
+<span class="sd"> certificates for HTTPS requests. cafile should point to a single file</span>
+<span class="sd"> containing a bundle of CA certificates, whereas capath should point to a</span>
+<span class="sd"> directory of hashed certificate files. More information can be found in</span>
+<span class="sd"> ssl.SSLContext.load_verify_locations().</span>
+
+<span class="sd"> The *cadefault* parameter is ignored.</span>
+
+<span class="sd"> This function always returns an object which can work as a context</span>
+<span class="sd"> manager and has methods such as</span>
+
+<span class="sd"> * geturl() - return the URL of the resource retrieved, commonly used to</span>
+<span class="sd"> determine if a redirect was followed</span>
+
+<span class="sd"> * info() - return the meta-information of the page, such as headers, in the</span>
+<span class="sd"> form of an email.message_from_string() instance (see Quick Reference to</span>
+<span class="sd"> HTTP Headers)</span>
+
+<span class="sd"> * getcode() - return the HTTP status code of the response. Raises URLError</span>
+<span class="sd"> on errors.</span>
+
+<span class="sd"> For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse</span>
+<span class="sd"> object slightly modified. In addition to the three new methods above, the</span>
+<span class="sd"> msg attribute contains the same information as the reason attribute ---</span>
+<span class="sd"> the reason phrase returned by the server --- instead of the response</span>
+<span class="sd"> headers as it is specified in the documentation for HTTPResponse.</span>
+
+<span class="sd"> For FTP, file, and data URLs and requests explicitly handled by legacy</span>
+<span class="sd"> URLopener and FancyURLopener classes, this function returns a</span>
+<span class="sd"> urllib.response.addinfourl object.</span>
+
+<span class="sd"> Note that None may be returned if no handler handles the request (though</span>
+<span class="sd"> the default installed global OpenerDirector uses UnknownHandler to ensure</span>
+<span class="sd"> this never happens).</span>
+
+<span class="sd"> In addition, if proxy settings are detected (for example, when a *_proxy</span>
+<span class="sd"> environment variable like http_proxy is set), ProxyHandler is default</span>
+<span class="sd"> installed and makes sure the requests are handled through the proxy.</span>
+
+<span class="sd"> &#39;&#39;&#39;</span>
+ <span class="k">global</span> <span class="n">_opener</span>
+ <span class="k">if</span> <span class="n">cafile</span> <span class="ow">or</span> <span class="n">capath</span> <span class="ow">or</span> <span class="n">cadefault</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;cafile, capath and cadefault are deprecated, use a &quot;</span>
+ <span class="s2">&quot;custom context instead.&quot;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">context</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;You can&#39;t pass both context and any of cafile, capath, and &quot;</span>
+ <span class="s2">&quot;cadefault&quot;</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">_have_ssl</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;SSL support not available&#39;</span><span class="p">)</span>
+ <span class="n">context</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">create_default_context</span><span class="p">(</span><span class="n">ssl</span><span class="o">.</span><span class="n">Purpose</span><span class="o">.</span><span class="n">SERVER_AUTH</span><span class="p">,</span>
+ <span class="n">cafile</span><span class="o">=</span><span class="n">cafile</span><span class="p">,</span>
+ <span class="n">capath</span><span class="o">=</span><span class="n">capath</span><span class="p">)</span>
+ <span class="n">https_handler</span> <span class="o">=</span> <span class="n">HTTPSHandler</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span>
+ <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">(</span><span class="n">https_handler</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">context</span><span class="p">:</span>
+ <span class="n">https_handler</span> <span class="o">=</span> <span class="n">HTTPSHandler</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span>
+ <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">(</span><span class="n">https_handler</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">_opener</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">_opener</span> <span class="o">=</span> <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">opener</span> <span class="o">=</span> <span class="n">_opener</span>
+ <span class="k">return</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">):</span>
+ <span class="k">global</span> <span class="n">_opener</span>
+ <span class="n">_opener</span> <span class="o">=</span> <span class="n">opener</span>
+
+<span class="n">_url_tempfiles</span> <span class="o">=</span> <span class="p">[]</span>
+<span class="k">def</span> <span class="nf">urlretrieve</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">reporthook</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Retrieve a URL into a temporary location on disk.</span>
+
+<span class="sd"> Requires a URL argument. If a filename is passed, it is used as</span>
+<span class="sd"> the temporary file location. The reporthook argument should be</span>
+<span class="sd"> a callable that accepts a block number, a read size, and the</span>
+<span class="sd"> total file size of the URL target. The data argument should be</span>
+<span class="sd"> valid URL encoded data.</span>
+
+<span class="sd"> If a filename is passed and the URL points to a local resource,</span>
+<span class="sd"> the result is a copy from local file to new file.</span>
+
+<span class="sd"> Returns a tuple containing the path to the newly created</span>
+<span class="sd"> data file as well as the resulting HTTPMessage object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">url_type</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+
+ <span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">closing</span><span class="p">(</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">))</span> <span class="k">as</span> <span class="n">fp</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
+
+ <span class="c1"># Just return the local path and the &quot;headers&quot; for file://</span>
+ <span class="c1"># URLs. No sense in performing a copy unless requested.</span>
+ <span class="k">if</span> <span class="n">url_type</span> <span class="o">==</span> <span class="s2">&quot;file&quot;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">filename</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normpath</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="n">headers</span>
+
+ <span class="c1"># Handle temporary file setup.</span>
+ <span class="k">if</span> <span class="n">filename</span><span class="p">:</span>
+ <span class="n">tfp</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">tfp</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">NamedTemporaryFile</span><span class="p">(</span><span class="n">delete</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+ <span class="n">filename</span> <span class="o">=</span> <span class="n">tfp</span><span class="o">.</span><span class="n">name</span>
+ <span class="n">_url_tempfiles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+
+ <span class="k">with</span> <span class="n">tfp</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">filename</span><span class="p">,</span> <span class="n">headers</span>
+ <span class="n">bs</span> <span class="o">=</span> <span class="mi">1024</span><span class="o">*</span><span class="mi">8</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
+ <span class="n">read</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="n">blocknum</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">if</span> <span class="s2">&quot;content-length&quot;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Content-Length&quot;</span><span class="p">])</span>
+
+ <span class="k">if</span> <span class="n">reporthook</span><span class="p">:</span>
+ <span class="n">reporthook</span><span class="p">(</span><span class="n">blocknum</span><span class="p">,</span> <span class="n">bs</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+
+ <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
+ <span class="n">block</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">bs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">block</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="n">read</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
+ <span class="n">tfp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
+ <span class="n">blocknum</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">reporthook</span><span class="p">:</span>
+ <span class="n">reporthook</span><span class="p">(</span><span class="n">blocknum</span><span class="p">,</span> <span class="n">bs</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">size</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">read</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">ContentTooShortError</span><span class="p">(</span>
+ <span class="s2">&quot;retrieval incomplete: got only </span><span class="si">%i</span><span class="s2"> out of </span><span class="si">%i</span><span class="s2"> bytes&quot;</span>
+ <span class="o">%</span> <span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">size</span><span class="p">),</span> <span class="n">result</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result</span>
+
+<span class="k">def</span> <span class="nf">urlcleanup</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Clean up temporary files from urlretrieve calls.&quot;&quot;&quot;</span>
+ <span class="k">for</span> <span class="n">temp_file</span> <span class="ow">in</span> <span class="n">_url_tempfiles</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="n">temp_file</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="k">del</span> <span class="n">_url_tempfiles</span><span class="p">[:]</span>
+ <span class="k">global</span> <span class="n">_opener</span>
+ <span class="k">if</span> <span class="n">_opener</span><span class="p">:</span>
+ <span class="n">_opener</span> <span class="o">=</span> <span class="kc">None</span>
+
+<span class="c1"># copied from cookielib.py</span>
+<span class="n">_cut_port_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;:\d+$&quot;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">ASCII</span><span class="p">)</span>
+<span class="k">def</span> <span class="nf">request_host</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return request-host, as defined by RFC 2965.</span>
+
+<span class="sd"> Variation from RFC: returned value is lowercased, for convenient</span>
+<span class="sd"> comparison.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">full_url</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">host</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s2">&quot;Host&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+
+ <span class="c1"># remove port, if present</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">_cut_port_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">host</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+
+<span class="k">class</span> <span class="nc">Request</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{},</span>
+ <span class="n">origin_req_host</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unverifiable</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+ <span class="n">method</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">full_url</span> <span class="o">=</span> <span class="n">url</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">origin_req_host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">origin_req_host</span> <span class="o">=</span> <span class="n">request_host</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">origin_req_host</span> <span class="o">=</span> <span class="n">origin_req_host</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">unverifiable</span> <span class="o">=</span> <span class="n">unverifiable</span>
+ <span class="k">if</span> <span class="n">method</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">method</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">full_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fragment</span><span class="p">:</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">{}</span><span class="s1">#</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fragment</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span>
+
+ <span class="nd">@full_url</span><span class="o">.</span><span class="n">setter</span>
+ <span class="k">def</span> <span class="nf">full_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="c1"># unwrap(&#39;&lt;URL:type://host/path&gt;&#39;) --&gt; &#39;type://host/path&#39;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span> <span class="o">=</span> <span class="n">unwrap</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">fragment</span> <span class="o">=</span> <span class="n">splittag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_parse</span><span class="p">()</span>
+
+ <span class="nd">@full_url</span><span class="o">.</span><span class="n">deleter</span>
+ <span class="k">def</span> <span class="nf">full_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fragment</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">selector</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="nd">@property</span>
+ <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span>
+
+ <span class="nd">@data</span><span class="o">.</span><span class="n">setter</span>
+ <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="c1"># issue 16464</span>
+ <span class="c1"># if we change data we need to remove content-length header</span>
+ <span class="c1"># (cause it&#39;s most probably calculated for previous value)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s2">&quot;Content-length&quot;</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">remove_header</span><span class="p">(</span><span class="s2">&quot;Content-length&quot;</span><span class="p">)</span>
+
+ <span class="nd">@data</span><span class="o">.</span><span class="n">deleter</span>
+ <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">_parse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_full_url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;unknown url type: </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">full_url</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return a string indicating the HTTP request method.&quot;&quot;&quot;</span>
+ <span class="n">default_method</span> <span class="o">=</span> <span class="s2">&quot;POST&quot;</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="s2">&quot;GET&quot;</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;method&#39;</span><span class="p">,</span> <span class="n">default_method</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_full_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">full_url</span>
+
+ <span class="k">def</span> <span class="nf">set_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s1">&#39;https&#39;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="o">=</span> <span class="nb">type</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">selector</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">full_url</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
+
+ <span class="k">def</span> <span class="nf">has_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">selector</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">full_url</span>
+
+ <span class="k">def</span> <span class="nf">add_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
+ <span class="c1"># useful for something like authentication</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()]</span> <span class="o">=</span> <span class="n">val</span>
+
+ <span class="k">def</span> <span class="nf">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
+ <span class="c1"># will not be added to a redirected request</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()]</span> <span class="o">=</span> <span class="n">val</span>
+
+ <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header_name</span><span class="p">):</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">header_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="ow">or</span>
+ <span class="n">header_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header_name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
+ <span class="n">header_name</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">header_name</span><span class="p">,</span> <span class="n">default</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">remove_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header_name</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">header_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">header_name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">header_items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">hdrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
+ <span class="n">hdrs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">hdrs</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
+
+<span class="k">class</span> <span class="nc">OpenerDirector</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">client_version</span> <span class="o">=</span> <span class="s2">&quot;Python-urllib/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">__version__</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;User-agent&#39;</span><span class="p">,</span> <span class="n">client_version</span><span class="p">)]</span>
+ <span class="c1"># self.handlers is retained only for backward compatibility</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handlers</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="c1"># manage the individual handlers</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">add_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="s2">&quot;add_parent&quot;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;expected BaseHandler instance, got </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="nb">type</span><span class="p">(</span><span class="n">handler</span><span class="p">))</span>
+
+ <span class="n">added</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">for</span> <span class="n">meth</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">handler</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">meth</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;redirect_request&quot;</span><span class="p">,</span> <span class="s2">&quot;do_open&quot;</span><span class="p">,</span> <span class="s2">&quot;proxy_open&quot;</span><span class="p">]:</span>
+ <span class="c1"># oops, coincidental match</span>
+ <span class="k">continue</span>
+
+ <span class="n">i</span> <span class="o">=</span> <span class="n">meth</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)</span>
+ <span class="n">protocol</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span>
+ <span class="n">condition</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
+
+ <span class="k">if</span> <span class="n">condition</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;error&quot;</span><span class="p">):</span>
+ <span class="n">j</span> <span class="o">=</span> <span class="n">condition</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">kind</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">kind</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="p">[</span><span class="n">protocol</span><span class="p">]</span> <span class="o">=</span> <span class="n">lookup</span>
+ <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;open&quot;</span><span class="p">:</span>
+ <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
+ <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span>
+ <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;response&quot;</span><span class="p">:</span>
+ <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
+ <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span>
+ <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;request&quot;</span><span class="p">:</span>
+ <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
+ <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">handlers</span> <span class="o">=</span> <span class="n">lookup</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">kind</span><span class="p">,</span> <span class="p">[])</span>
+ <span class="k">if</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="n">bisect</span><span class="o">.</span><span class="n">insort</span><span class="p">(</span><span class="n">handlers</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
+ <span class="n">added</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="k">if</span> <span class="n">added</span><span class="p">:</span>
+ <span class="n">bisect</span><span class="o">.</span><span class="n">insort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handlers</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
+ <span class="n">handler</span><span class="o">.</span><span class="n">add_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># Only exists for backwards compatibility.</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">chain</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="c1"># Handlers raise an exception if no one else should try to handle</span>
+ <span class="c1"># the request, or return None if they can&#39;t but another handler</span>
+ <span class="c1"># could. Otherwise, they return the response.</span>
+ <span class="n">handlers</span> <span class="o">=</span> <span class="n">chain</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">kind</span><span class="p">,</span> <span class="p">())</span>
+ <span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">_GLOBAL_DEFAULT_TIMEOUT</span><span class="p">):</span>
+ <span class="c1"># accept a URL or a Request object</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">req</span> <span class="o">=</span> <span class="n">Request</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">req</span> <span class="o">=</span> <span class="n">fullurl</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
+
+ <span class="n">req</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span>
+ <span class="n">protocol</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">type</span>
+
+ <span class="c1"># pre-process request</span>
+ <span class="n">meth_name</span> <span class="o">=</span> <span class="n">protocol</span><span class="o">+</span><span class="s2">&quot;_request&quot;</span>
+ <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
+ <span class="n">req</span> <span class="o">=</span> <span class="n">meth</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
+
+ <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="c1"># post-process response</span>
+ <span class="n">meth_name</span> <span class="o">=</span> <span class="n">protocol</span><span class="o">+</span><span class="s2">&quot;_response&quot;</span>
+ <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">[]):</span>
+ <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">meth</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">response</span>
+
+ <span class="k">def</span> <span class="nf">_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;default_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="n">protocol</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">type</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">protocol</span> <span class="o">+</span>
+ <span class="s1">&#39;_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="s1">&#39;unknown&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;unknown_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proto</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">proto</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="s1">&#39;https&#39;</span><span class="p">):</span>
+ <span class="c1"># XXX http[s] protocols are special-cased</span>
+ <span class="nb">dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span> <span class="c1"># https is not different than http</span>
+ <span class="n">proto</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># YUCK!</span>
+ <span class="n">meth_name</span> <span class="o">=</span> <span class="s1">&#39;http_error_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">proto</span>
+ <span class="n">http_err</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="n">orig_args</span> <span class="o">=</span> <span class="n">args</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="nb">dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span>
+ <span class="n">meth_name</span> <span class="o">=</span> <span class="n">proto</span> <span class="o">+</span> <span class="s1">&#39;_error&#39;</span>
+ <span class="n">http_err</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">proto</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span> <span class="o">+</span> <span class="n">args</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="k">if</span> <span class="n">http_err</span><span class="p">:</span>
+ <span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="s1">&#39;http_error_default&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">orig_args</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
+
+<span class="c1"># XXX probably also want an abstract factory that knows when it makes</span>
+<span class="c1"># sense to skip a superclass in favor of a subclass and when it might</span>
+<span class="c1"># make sense to include both</span>
+
+<span class="k">def</span> <span class="nf">build_opener</span><span class="p">(</span><span class="o">*</span><span class="n">handlers</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Create an opener object from a list of handlers.</span>
+
+<span class="sd"> The opener will use several default handlers, including support</span>
+<span class="sd"> for HTTP, FTP and when applicable HTTPS.</span>
+
+<span class="sd"> If any of the handlers passed as arguments are subclasses of the</span>
+<span class="sd"> default handlers, the default handlers will not be used.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">opener</span> <span class="o">=</span> <span class="n">OpenerDirector</span><span class="p">()</span>
+ <span class="n">default_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">ProxyHandler</span><span class="p">,</span> <span class="n">UnknownHandler</span><span class="p">,</span> <span class="n">HTTPHandler</span><span class="p">,</span>
+ <span class="n">HTTPDefaultErrorHandler</span><span class="p">,</span> <span class="n">HTTPRedirectHandler</span><span class="p">,</span>
+ <span class="n">FTPHandler</span><span class="p">,</span> <span class="n">FileHandler</span><span class="p">,</span> <span class="n">HTTPErrorProcessor</span><span class="p">,</span>
+ <span class="n">DataHandler</span><span class="p">]</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="p">,</span> <span class="s2">&quot;HTTPSConnection&quot;</span><span class="p">):</span>
+ <span class="n">default_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">HTTPSHandler</span><span class="p">)</span>
+ <span class="n">skip</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
+ <span class="n">skip</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
+ <span class="n">skip</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">skip</span><span class="p">:</span>
+ <span class="n">default_classes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
+ <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">klass</span><span class="p">())</span>
+
+ <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">h</span><span class="p">()</span>
+ <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">opener</span>
+
+<span class="k">class</span> <span class="nc">BaseHandler</span><span class="p">:</span>
+ <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">500</span>
+
+ <span class="k">def</span> <span class="nf">add_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># Only exists for backwards compatibility</span>
+ <span class="k">pass</span>
+
+ <span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;handler_order&quot;</span><span class="p">):</span>
+ <span class="c1"># Try to preserve the old behavior of having custom classes</span>
+ <span class="c1"># inserted after default ones (works only for custom user</span>
+ <span class="c1"># classes which are not aware of handler_order).</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler_order</span> <span class="o">&lt;</span> <span class="n">other</span><span class="o">.</span><span class="n">handler_order</span>
+
+
+<span class="k">class</span> <span class="nc">HTTPErrorProcessor</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Process HTTP error responses.&quot;&quot;&quot;</span>
+ <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">1000</span> <span class="c1"># after all other processing</span>
+
+ <span class="k">def</span> <span class="nf">http_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
+ <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
+
+ <span class="c1"># According to RFC 2616, &quot;2xx&quot; code indicates that the client&#39;s</span>
+ <span class="c1"># request was successfully received, understood, and accepted.</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">200</span> <span class="o">&lt;=</span> <span class="n">code</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="p">):</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
+ <span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">response</span>
+
+ <span class="n">https_response</span> <span class="o">=</span> <span class="n">http_response</span>
+
+<span class="k">class</span> <span class="nc">HTTPDefaultErrorHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">HTTPRedirectHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="c1"># maximum number of redirections to any single URL</span>
+ <span class="c1"># this is needed because of the state that cookies introduce</span>
+ <span class="n">max_repeats</span> <span class="o">=</span> <span class="mi">4</span>
+ <span class="c1"># maximum total number of redirections (regardless of URL) before</span>
+ <span class="c1"># assuming we&#39;re in a loop</span>
+ <span class="n">max_redirections</span> <span class="o">=</span> <span class="mi">10</span>
+
+ <span class="k">def</span> <span class="nf">redirect_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">newurl</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return a Request or None in response to a redirect.</span>
+
+<span class="sd"> This is called by the http_error_30x methods when a</span>
+<span class="sd"> redirection response is received. If a redirection should</span>
+<span class="sd"> take place, return a new Request to allow http_error_30x to</span>
+<span class="sd"> perform the redirect. Otherwise, raise HTTPError if no-one</span>
+<span class="sd"> else should try to handle this url. Return None if you can&#39;t</span>
+<span class="sd"> but another Handler might.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">()</span>
+ <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="p">(</span><span class="n">code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">301</span><span class="p">,</span> <span class="mi">302</span><span class="p">,</span> <span class="mi">303</span><span class="p">,</span> <span class="mi">307</span><span class="p">)</span> <span class="ow">and</span> <span class="n">m</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="s2">&quot;HEAD&quot;</span><span class="p">)</span>
+ <span class="ow">or</span> <span class="n">code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">301</span><span class="p">,</span> <span class="mi">302</span><span class="p">,</span> <span class="mi">303</span><span class="p">)</span> <span class="ow">and</span> <span class="n">m</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
+
+ <span class="c1"># Strictly (according to RFC 2616), 301 or 302 in response to</span>
+ <span class="c1"># a POST MUST NOT cause a redirection without confirmation</span>
+ <span class="c1"># from the user (of urllib.request, in this case). In practice,</span>
+ <span class="c1"># essentially all clients do redirect in this case, so we do</span>
+ <span class="c1"># the same.</span>
+
+ <span class="c1"># Be conciliant with URIs containing a space. This is mainly</span>
+ <span class="c1"># redundant with the more complete encoding done in http_error_302(),</span>
+ <span class="c1"># but it is kept for compatibility with other callers.</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">newurl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;%20&#39;</span><span class="p">)</span>
+
+ <span class="n">CONTENT_HEADERS</span> <span class="o">=</span> <span class="p">(</span><span class="s2">&quot;content-length&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span><span class="p">)</span>
+ <span class="n">newheaders</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">k</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">CONTENT_HEADERS</span><span class="p">}</span>
+ <span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span>
+ <span class="n">headers</span><span class="o">=</span><span class="n">newheaders</span><span class="p">,</span>
+ <span class="n">origin_req_host</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">origin_req_host</span><span class="p">,</span>
+ <span class="n">unverifiable</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+
+ <span class="c1"># Implementation note: To avoid the server sending us into an</span>
+ <span class="c1"># infinite loop, the request object needs to track what URLs we</span>
+ <span class="c1"># have already seen. Do this by adding a handler-specific</span>
+ <span class="c1"># attribute to the Request object.</span>
+ <span class="k">def</span> <span class="nf">http_error_302</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="c1"># Some servers (incorrectly) return multiple Location headers</span>
+ <span class="c1"># (so probably same goes for URI). Use first header.</span>
+ <span class="k">if</span> <span class="s2">&quot;location&quot;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;location&quot;</span><span class="p">]</span>
+ <span class="k">elif</span> <span class="s2">&quot;uri&quot;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;uri&quot;</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="c1"># fix a possible malformed URL</span>
+ <span class="n">urlparts</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+
+ <span class="c1"># For security reasons we don&#39;t allow redirection to anything other</span>
+ <span class="c1"># than http, https or ftp.</span>
+
+ <span class="k">if</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">scheme</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="s1">&#39;https&#39;</span><span class="p">,</span> <span class="s1">&#39;ftp&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span>
+ <span class="n">newurl</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span>
+ <span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> - Redirection to url &#39;</span><span class="si">%s</span><span class="s2">&#39; is not allowed&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">newurl</span><span class="p">),</span>
+ <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">netloc</span><span class="p">:</span>
+ <span class="n">urlparts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">urlparts</span><span class="p">)</span>
+ <span class="n">urlparts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">urlunparse</span><span class="p">(</span><span class="n">urlparts</span><span class="p">)</span>
+
+ <span class="c1"># http.client.parse_headers() decodes as ISO-8859-1. Recover the</span>
+ <span class="c1"># original bytes and percent-encode non-ASCII bytes, and any special</span>
+ <span class="c1"># characters such as the space.</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">quote</span><span class="p">(</span>
+ <span class="n">newurl</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;iso-8859-1&quot;</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="n">string</span><span class="o">.</span><span class="n">punctuation</span><span class="p">)</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">urljoin</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="n">newurl</span><span class="p">)</span>
+
+ <span class="c1"># XXX Probably want to forget about the state of the current</span>
+ <span class="c1"># request, although that might interact poorly with other</span>
+ <span class="c1"># handlers that also use handler-specific request attributes</span>
+ <span class="n">new</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">redirect_request</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">newurl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">new</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span>
+
+ <span class="c1"># loop detection</span>
+ <span class="c1"># .redirect_dict has a key url if url was previously visited.</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="s1">&#39;redirect_dict&#39;</span><span class="p">):</span>
+ <span class="n">visited</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">redirect_dict</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">visited</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_repeats</span> <span class="ow">or</span>
+ <span class="nb">len</span><span class="p">(</span><span class="n">visited</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_redirections</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">inf_msg</span> <span class="o">+</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">visited</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">visited</span><span class="p">[</span><span class="n">newurl</span><span class="p">]</span> <span class="o">=</span> <span class="n">visited</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+
+ <span class="c1"># Don&#39;t close the fp until we are sure that we won&#39;t use it</span>
+ <span class="c1"># with HTTPError.</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">new</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+
+ <span class="n">http_error_301</span> <span class="o">=</span> <span class="n">http_error_303</span> <span class="o">=</span> <span class="n">http_error_307</span> <span class="o">=</span> <span class="n">http_error_302</span>
+
+ <span class="n">inf_msg</span> <span class="o">=</span> <span class="s2">&quot;The HTTP server returned a redirect error that would &quot;</span> \
+ <span class="s2">&quot;lead to an infinite loop.</span><span class="se">\n</span><span class="s2">&quot;</span> \
+ <span class="s2">&quot;The last 30x error message was:</span><span class="se">\n</span><span class="s2">&quot;</span>
+
+
+<span class="k">def</span> <span class="nf">_parse_proxy</span><span class="p">(</span><span class="n">proxy</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return (scheme, user, password, host/port) given a URL or an authority.</span>
+
+<span class="sd"> If a URL is supplied, it must have an authority (host:port) component.</span>
+<span class="sd"> According to RFC 3986, having an authority component means the URL must</span>
+<span class="sd"> have two slashes after the scheme.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">r_scheme</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
+ <span class="c1"># authority</span>
+ <span class="n">scheme</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="n">proxy</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># URL</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;//&quot;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;proxy URL with no authority: </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">proxy</span><span class="p">)</span>
+ <span class="c1"># We have an authority, so for RFC 3986-compliant URLs (by ss 3.</span>
+ <span class="c1"># and 3.3.), path is empty or starts with &#39;/&#39;</span>
+ <span class="n">end</span> <span class="o">=</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">end</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
+ <span class="n">end</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="n">r_scheme</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="n">end</span><span class="p">]</span>
+ <span class="n">userinfo</span><span class="p">,</span> <span class="n">hostport</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">authority</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">userinfo</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">splitpasswd</span><span class="p">(</span><span class="n">userinfo</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="n">password</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">return</span> <span class="n">scheme</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">hostport</span>
+
+<span class="k">class</span> <span class="nc">ProxyHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="c1"># Proxies must be in front</span>
+ <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">100</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxies</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">proxies</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies</span><span class="p">()</span>
+ <span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">proxies</span><span class="p">,</span> <span class="s1">&#39;keys&#39;</span><span class="p">),</span> <span class="s2">&quot;proxies must be a mapping&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span> <span class="o">=</span> <span class="n">proxies</span>
+ <span class="k">for</span> <span class="nb">type</span><span class="p">,</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">proxies</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">_open&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">,</span>
+ <span class="k">lambda</span> <span class="n">r</span><span class="p">,</span> <span class="n">proxy</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span> <span class="n">meth</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">proxy_open</span><span class="p">:</span>
+ <span class="n">meth</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="nb">type</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">proxy_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="n">orig_type</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">type</span>
+ <span class="n">proxy_type</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">hostport</span> <span class="o">=</span> <span class="n">_parse_proxy</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">proxy_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">proxy_type</span> <span class="o">=</span> <span class="n">orig_type</span>
+
+ <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="ow">and</span> <span class="n">proxy_bypass</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">host</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">user</span> <span class="ow">and</span> <span class="n">password</span><span class="p">:</span>
+ <span class="n">user_pass</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">:</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">unquote</span><span class="p">(</span><span class="n">user</span><span class="p">),</span>
+ <span class="n">unquote</span><span class="p">(</span><span class="n">password</span><span class="p">))</span>
+ <span class="n">creds</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">user_pass</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s1">&#39;Proxy-authorization&#39;</span><span class="p">,</span> <span class="s1">&#39;Basic &#39;</span> <span class="o">+</span> <span class="n">creds</span><span class="p">)</span>
+ <span class="n">hostport</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">hostport</span><span class="p">)</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">set_proxy</span><span class="p">(</span><span class="n">hostport</span><span class="p">,</span> <span class="n">proxy_type</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">orig_type</span> <span class="o">==</span> <span class="n">proxy_type</span> <span class="ow">or</span> <span class="n">orig_type</span> <span class="o">==</span> <span class="s1">&#39;https&#39;</span><span class="p">:</span>
+ <span class="c1"># let other handlers take care of it</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># need to start over, because the other handlers don&#39;t</span>
+ <span class="c1"># grok the proxy&#39;s URL type</span>
+ <span class="c1"># e.g. if we have a constructor arg proxies like so:</span>
+ <span class="c1"># {&#39;http&#39;: &#39;ftp://proxy.example.com&#39;}, we may end up turning</span>
+ <span class="c1"># a request for http://acme.example.com/a into one for</span>
+ <span class="c1"># ftp://proxy.example.com/a</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">HTTPPasswordMgr</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="p">{}</span>
+
+ <span class="k">def</span> <span class="nf">add_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">):</span>
+ <span class="c1"># uri could be a single URI or a sequence</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">uri</span> <span class="o">=</span> <span class="p">[</span><span class="n">uri</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">realm</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">[</span><span class="n">realm</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
+ <span class="n">reduced_uri</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span> <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">uri</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">[</span><span class="n">realm</span><span class="p">][</span><span class="n">reduced_uri</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">authuri</span><span class="p">):</span>
+ <span class="n">domains</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="p">{})</span>
+ <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
+ <span class="n">reduced_authuri</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">authuri</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">uris</span><span class="p">,</span> <span class="n">authinfo</span> <span class="ow">in</span> <span class="n">domains</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">for</span> <span class="n">uri</span> <span class="ow">in</span> <span class="n">uris</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_suburi</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">reduced_authuri</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">authinfo</span>
+ <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">reduce_uri</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">default_port</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Accept authority or URI and extract only the authority and path.&quot;&quot;&quot;</span>
+ <span class="c1"># note HTTP URLs do not have a userinfo component</span>
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
+ <span class="c1"># URI</span>
+ <span class="n">scheme</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;/&#39;</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># host or host:port</span>
+ <span class="n">scheme</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="n">uri</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">authority</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">default_port</span> <span class="ow">and</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">scheme</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">dport</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;http&quot;</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span>
+ <span class="s2">&quot;https&quot;</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
+ <span class="p">}</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">scheme</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">dport</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">dport</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">authority</span><span class="p">,</span> <span class="n">path</span>
+
+ <span class="k">def</span> <span class="nf">is_suburi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Check if test is below base in a URI tree</span>
+
+<span class="sd"> Both args must be URIs in reduced form.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">base</span> <span class="o">==</span> <span class="n">test</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">if</span> <span class="n">base</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">test</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="kc">False</span>
+ <span class="n">common</span> <span class="o">=</span> <span class="n">posixpath</span><span class="o">.</span><span class="n">commonprefix</span><span class="p">((</span><span class="n">base</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">test</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">common</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">base</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
+ <span class="k">return</span> <span class="kc">True</span>
+ <span class="k">return</span> <span class="kc">False</span>
+
+
+<span class="k">class</span> <span class="nc">HTTPPasswordMgrWithDefaultRealm</span><span class="p">(</span><span class="n">HTTPPasswordMgr</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">authuri</span><span class="p">):</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span>
+ <span class="n">authuri</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span>
+ <span class="k">return</span> <span class="n">HTTPPasswordMgr</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">authuri</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">HTTPPasswordMgrWithPriorAuth</span><span class="p">(</span><span class="n">HTTPPasswordMgrWithDefaultRealm</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">authenticated</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">add_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">is_authenticated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">update_authenticated</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">is_authenticated</span><span class="p">)</span>
+ <span class="c1"># Add a default for prior auth requests</span>
+ <span class="k">if</span> <span class="n">realm</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">add_password</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
+ <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">add_password</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">update_authenticated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">is_authenticated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+ <span class="c1"># uri could be a single URI or a sequence</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">uri</span> <span class="o">=</span> <span class="p">[</span><span class="n">uri</span><span class="p">]</span>
+
+ <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">uri</span><span class="p">:</span>
+ <span class="n">reduced_uri</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">authenticated</span><span class="p">[</span><span class="n">reduced_uri</span><span class="p">]</span> <span class="o">=</span> <span class="n">is_authenticated</span>
+
+ <span class="k">def</span> <span class="nf">is_authenticated</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">authuri</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
+ <span class="n">reduced_authuri</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">authuri</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">uri</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">authenticated</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_suburi</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">reduced_authuri</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">authenticated</span><span class="p">[</span><span class="n">uri</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">AbstractBasicAuthHandler</span><span class="p">:</span>
+
+ <span class="c1"># XXX this allows for multiple auth-schemes, but will stupidly pick</span>
+ <span class="c1"># the last one with a realm specified.</span>
+
+ <span class="c1"># allow for double- and single-quoted realm values</span>
+ <span class="c1"># (single quotes are a violation of the RFC, but appear in the wild)</span>
+ <span class="n">rx</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;(?:.*,)*[ </span><span class="se">\t</span><span class="s1">]*([^ </span><span class="se">\t</span><span class="s1">]+)[ </span><span class="se">\t</span><span class="s1">]+&#39;</span>
+ <span class="s1">&#39;realm=([&quot;</span><span class="se">\&#39;</span><span class="s1">]?)([^&quot;</span><span class="se">\&#39;</span><span class="s1">]*)</span><span class="se">\\</span><span class="s1">2&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
+
+ <span class="c1"># XXX could pre-emptively send auth info already accepted (RFC 2617,</span>
+ <span class="c1"># end of section 2, and section 1.2 immediately after &quot;credentials&quot;</span>
+ <span class="c1"># production).</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">password_mgr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">password_mgr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">password_mgr</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="n">password_mgr</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">add_password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">add_password</span>
+
+ <span class="k">def</span> <span class="nf">http_error_auth_reqed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">authreq</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="c1"># host may be an authority (without userinfo) or a URL with an</span>
+ <span class="c1"># authority</span>
+ <span class="c1"># XXX could be multiple headers</span>
+ <span class="n">authreq</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">authreq</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">authreq</span><span class="p">:</span>
+ <span class="n">scheme</span> <span class="o">=</span> <span class="n">authreq</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;AbstractBasicAuthHandler does not&quot;</span>
+ <span class="s2">&quot; support the following scheme: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span>
+ <span class="n">scheme</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">mo</span> <span class="o">=</span> <span class="n">AbstractBasicAuthHandler</span><span class="o">.</span><span class="n">rx</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">authreq</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mo</span><span class="p">:</span>
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">quote</span><span class="p">,</span> <span class="n">realm</span> <span class="o">=</span> <span class="n">mo</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">quote</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;&quot;&#39;</span><span class="p">,</span><span class="s2">&quot;&#39;&quot;</span><span class="p">]:</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Basic Auth Realm was unquoted&quot;</span><span class="p">,</span>
+ <span class="ne">UserWarning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retry_http_basic_auth</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">realm</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_http_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">realm</span><span class="p">):</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">pw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pw</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">raw</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="s2">&quot;Basic &quot;</span> <span class="o">+</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">raw</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">auth</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="n">auth</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">http_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">,</span> <span class="s1">&#39;is_authenticated&#39;</span><span class="p">)</span> <span class="ow">or</span>
+ <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">is_authenticated</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="n">req</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">req</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Authorization&#39;</span><span class="p">):</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)</span>
+ <span class="n">credentials</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">{0}</span><span class="s1">:</span><span class="si">{1}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
+ <span class="n">auth_str</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">standard_b64encode</span><span class="p">(</span><span class="n">credentials</span><span class="p">)</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="s1">&#39;Authorization&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;Basic </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">auth_str</span><span class="o">.</span><span class="n">strip</span><span class="p">()))</span>
+ <span class="k">return</span> <span class="n">req</span>
+
+ <span class="k">def</span> <span class="nf">http_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">,</span> <span class="s1">&#39;is_authenticated&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="mi">200</span> <span class="o">&lt;=</span> <span class="n">response</span><span class="o">.</span><span class="n">code</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">update_authenticated</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">update_authenticated</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">response</span>
+
+ <span class="n">https_request</span> <span class="o">=</span> <span class="n">http_request</span>
+ <span class="n">https_response</span> <span class="o">=</span> <span class="n">http_response</span>
+
+
+
+<span class="k">class</span> <span class="nc">HTTPBasicAuthHandler</span><span class="p">(</span><span class="n">AbstractBasicAuthHandler</span><span class="p">,</span> <span class="n">BaseHandler</span><span class="p">):</span>
+
+ <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Authorization&#39;</span>
+
+ <span class="k">def</span> <span class="nf">http_error_401</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">full_url</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;www-authenticate&#39;</span><span class="p">,</span>
+ <span class="n">url</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">response</span>
+
+
+<span class="k">class</span> <span class="nc">ProxyBasicAuthHandler</span><span class="p">(</span><span class="n">AbstractBasicAuthHandler</span><span class="p">,</span> <span class="n">BaseHandler</span><span class="p">):</span>
+
+ <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Proxy-authorization&#39;</span>
+
+ <span class="k">def</span> <span class="nf">http_error_407</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="c1"># http_error_auth_reqed requires that there is no userinfo component in</span>
+ <span class="c1"># authority. Assume there isn&#39;t one, since urllib.request does not (and</span>
+ <span class="c1"># should not, RFC 3986 s. 3.2.1) support requests for URLs containing</span>
+ <span class="c1"># userinfo.</span>
+ <span class="n">authority</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;proxy-authenticate&#39;</span><span class="p">,</span>
+ <span class="n">authority</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">response</span>
+
+
+<span class="c1"># Return n random bytes.</span>
+<span class="n">_randombytes</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">urandom</span>
+
+
+<span class="k">class</span> <span class="nc">AbstractDigestAuthHandler</span><span class="p">:</span>
+ <span class="c1"># Digest authentication is specified in RFC 2617.</span>
+
+ <span class="c1"># XXX The client does not inspect the Authentication-Info header</span>
+ <span class="c1"># in a successful response.</span>
+
+ <span class="c1"># XXX It should be possible to test this implementation against</span>
+ <span class="c1"># a mock server that just generates a static set of challenges.</span>
+
+ <span class="c1"># XXX qop=&quot;auth-int&quot; supports is shaky</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">passwd</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">passwd</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">passwd</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="n">passwd</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">add_password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">add_password</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">def</span> <span class="nf">reset_retry_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">http_error_auth_reqed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_header</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="n">authreq</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">:</span>
+ <span class="c1"># Don&#39;t fail endlessly - if we failed once, we&#39;ll probably</span>
+ <span class="c1"># fail a second time. Hm. Unless the Password Manager is</span>
+ <span class="c1"># prompting for the information. Crap. This isn&#39;t great</span>
+ <span class="c1"># but it&#39;s better than the current &#39;repeat until recursion</span>
+ <span class="c1"># depth exceeded&#39; approach &lt;wink&gt;</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">,</span> <span class="mi">401</span><span class="p">,</span> <span class="s2">&quot;digest auth failed&quot;</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">authreq</span><span class="p">:</span>
+ <span class="n">scheme</span> <span class="o">=</span> <span class="n">authreq</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;digest&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retry_http_digest_auth</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">authreq</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;AbstractDigestAuthHandler does not support&quot;</span>
+ <span class="s2">&quot; the following scheme: &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">scheme</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_http_digest_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">auth</span><span class="p">):</span>
+ <span class="n">token</span><span class="p">,</span> <span class="n">challenge</span> <span class="o">=</span> <span class="n">auth</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="n">chal</span> <span class="o">=</span> <span class="n">parse_keqv_list</span><span class="p">(</span><span class="nb">filter</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">parse_http_list</span><span class="p">(</span><span class="n">challenge</span><span class="p">)))</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_authorization</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">chal</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">auth</span><span class="p">:</span>
+ <span class="n">auth_val</span> <span class="o">=</span> <span class="s1">&#39;Digest </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">auth</span>
+ <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">auth_val</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="n">auth_val</span><span class="p">)</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">resp</span>
+
+ <span class="k">def</span> <span class="nf">get_cnonce</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nonce</span><span class="p">):</span>
+ <span class="c1"># The cnonce-value is an opaque</span>
+ <span class="c1"># quoted string value provided by the client and used by both client</span>
+ <span class="c1"># and server to avoid chosen plaintext attacks, to provide mutual</span>
+ <span class="c1"># authentication, and to provide some message integrity protection.</span>
+ <span class="c1"># This isn&#39;t a fabulous effort, but it&#39;s probably Good Enough.</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span><span class="p">,</span> <span class="n">nonce</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">ctime</span><span class="p">())</span>
+ <span class="n">b</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">_randombytes</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
+ <span class="n">dig</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">(</span><span class="n">b</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">dig</span><span class="p">[:</span><span class="mi">16</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">get_authorization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">chal</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">realm</span> <span class="o">=</span> <span class="n">chal</span><span class="p">[</span><span class="s1">&#39;realm&#39;</span><span class="p">]</span>
+ <span class="n">nonce</span> <span class="o">=</span> <span class="n">chal</span><span class="p">[</span><span class="s1">&#39;nonce&#39;</span><span class="p">]</span>
+ <span class="n">qop</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;qop&#39;</span><span class="p">)</span>
+ <span class="n">algorithm</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;algorithm&#39;</span><span class="p">,</span> <span class="s1">&#39;MD5&#39;</span><span class="p">)</span>
+ <span class="c1"># mod_digest doesn&#39;t send an opaque, even though it isn&#39;t</span>
+ <span class="c1"># supposed to be optional</span>
+ <span class="n">opaque</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;opaque&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">H</span><span class="p">,</span> <span class="n">KD</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_algorithm_impls</span><span class="p">(</span><span class="n">algorithm</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">H</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="n">user</span><span class="p">,</span> <span class="n">pw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+ <span class="c1"># XXX not implemented yet</span>
+ <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">entdig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_entity_digest</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">chal</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">entdig</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="n">A1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span>
+ <span class="n">A2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">(),</span>
+ <span class="c1"># XXX selector: what about proxies and full urls</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">selector</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">qop</span> <span class="o">==</span> <span class="s1">&#39;auth&#39;</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">nonce</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span> <span class="o">=</span> <span class="n">nonce</span>
+ <span class="n">ncvalue</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span>
+ <span class="n">cnonce</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cnonce</span><span class="p">(</span><span class="n">nonce</span><span class="p">)</span>
+ <span class="n">noncebit</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nonce</span><span class="p">,</span> <span class="n">ncvalue</span><span class="p">,</span> <span class="n">cnonce</span><span class="p">,</span> <span class="n">qop</span><span class="p">,</span> <span class="n">H</span><span class="p">(</span><span class="n">A2</span><span class="p">))</span>
+ <span class="n">respdig</span> <span class="o">=</span> <span class="n">KD</span><span class="p">(</span><span class="n">H</span><span class="p">(</span><span class="n">A1</span><span class="p">),</span> <span class="n">noncebit</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">qop</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">respdig</span> <span class="o">=</span> <span class="n">KD</span><span class="p">(</span><span class="n">H</span><span class="p">(</span><span class="n">A1</span><span class="p">),</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nonce</span><span class="p">,</span> <span class="n">H</span><span class="p">(</span><span class="n">A2</span><span class="p">)))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># XXX handle auth-int.</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s2">&quot;qop &#39;</span><span class="si">%s</span><span class="s2">&#39; is not supported.&quot;</span> <span class="o">%</span> <span class="n">qop</span><span class="p">)</span>
+
+ <span class="c1"># XXX should the partial digests be encoded too?</span>
+
+ <span class="n">base</span> <span class="o">=</span> <span class="s1">&#39;username=&quot;</span><span class="si">%s</span><span class="s1">&quot;, realm=&quot;</span><span class="si">%s</span><span class="s1">&quot;, nonce=&quot;</span><span class="si">%s</span><span class="s1">&quot;, uri=&quot;</span><span class="si">%s</span><span class="s1">&quot;, &#39;</span> \
+ <span class="s1">&#39;response=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">nonce</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">selector</span><span class="p">,</span>
+ <span class="n">respdig</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">opaque</span><span class="p">:</span>
+ <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, opaque=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">opaque</span>
+ <span class="k">if</span> <span class="n">entdig</span><span class="p">:</span>
+ <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, digest=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">entdig</span>
+ <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, algorithm=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">algorithm</span>
+ <span class="k">if</span> <span class="n">qop</span><span class="p">:</span>
+ <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, qop=auth, nc=</span><span class="si">%s</span><span class="s1">, cnonce=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ncvalue</span><span class="p">,</span> <span class="n">cnonce</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">base</span>
+
+ <span class="k">def</span> <span class="nf">get_algorithm_impls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">algorithm</span><span class="p">):</span>
+ <span class="c1"># lambdas assume digest modules are imported at the top level</span>
+ <span class="k">if</span> <span class="n">algorithm</span> <span class="o">==</span> <span class="s1">&#39;MD5&#39;</span><span class="p">:</span>
+ <span class="n">H</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
+ <span class="k">elif</span> <span class="n">algorithm</span> <span class="o">==</span> <span class="s1">&#39;SHA&#39;</span><span class="p">:</span>
+ <span class="n">H</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">&quot;ascii&quot;</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
+ <span class="c1"># XXX MD5-sess</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unsupported digest authentication &quot;</span>
+ <span class="s2">&quot;algorithm </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">algorithm</span><span class="p">)</span>
+ <span class="n">KD</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="n">H</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">H</span><span class="p">,</span> <span class="n">KD</span>
+
+ <span class="k">def</span> <span class="nf">get_entity_digest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">chal</span><span class="p">):</span>
+ <span class="c1"># XXX not implemented yet</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+
+<span class="k">class</span> <span class="nc">HTTPDigestAuthHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">,</span> <span class="n">AbstractDigestAuthHandler</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;An authentication protocol defined by RFC 2069</span>
+
+<span class="sd"> Digest authentication improves on basic authentication because it</span>
+<span class="sd"> does not transmit passwords in the clear.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Authorization&#39;</span>
+ <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">490</span> <span class="c1"># before Basic auth</span>
+
+ <span class="k">def</span> <span class="nf">http_error_401</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">retry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;www-authenticate&#39;</span><span class="p">,</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">reset_retry_count</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">retry</span>
+
+
+<span class="k">class</span> <span class="nc">ProxyDigestAuthHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">,</span> <span class="n">AbstractDigestAuthHandler</span><span class="p">):</span>
+
+ <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Proxy-Authorization&#39;</span>
+ <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">490</span> <span class="c1"># before Basic auth</span>
+
+ <span class="k">def</span> <span class="nf">http_error_407</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="n">retry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;proxy-authenticate&#39;</span><span class="p">,</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">reset_retry_count</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">retry</span>
+
+<span class="k">class</span> <span class="nc">AbstractHTTPHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span> <span class="o">=</span> <span class="n">debuglevel</span>
+
+ <span class="k">def</span> <span class="nf">set_http_debuglevel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span> <span class="o">=</span> <span class="n">level</span>
+
+ <span class="k">def</span> <span class="nf">_get_content_length</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPConnection</span><span class="o">.</span><span class="n">_get_content_length</span><span class="p">(</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">data</span><span class="p">,</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">get_method</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">do_request_</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># POST</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">data</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;POST data should be bytes, an iterable of bytes, &quot;</span> \
+ <span class="s2">&quot;or a file object. It cannot be of type str.&quot;</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Content-type&#39;</span><span class="p">):</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span>
+ <span class="s1">&#39;Content-type&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;application/x-www-form-urlencoded&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Content-length&#39;</span><span class="p">)</span>
+ <span class="ow">and</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Transfer-encoding&#39;</span><span class="p">)):</span>
+ <span class="n">content_length</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_content_length</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">content_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span>
+ <span class="s1">&#39;Content-length&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">content_length</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span>
+ <span class="s1">&#39;Transfer-encoding&#39;</span><span class="p">,</span> <span class="s1">&#39;chunked&#39;</span><span class="p">)</span>
+
+ <span class="n">sel_host</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">has_proxy</span><span class="p">():</span>
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">sel</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">selector</span><span class="p">)</span>
+ <span class="n">sel_host</span><span class="p">,</span> <span class="n">sel_path</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Host&#39;</span><span class="p">):</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="s1">&#39;Host&#39;</span><span class="p">,</span> <span class="n">sel_host</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">addheaders</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
+ <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">request</span>
+
+ <span class="k">def</span> <span class="nf">do_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">http_class</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="o">**</span><span class="n">http_conn_args</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return an HTTPResponse object for the request, using http_class.</span>
+
+<span class="sd"> http_class must implement the HTTPConnection API from http.client.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
+
+ <span class="c1"># will parse host:port</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">http_class</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span> <span class="o">**</span><span class="n">http_conn_args</span><span class="p">)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">set_debuglevel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span><span class="p">)</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">)</span>
+ <span class="n">headers</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">})</span>
+
+ <span class="c1"># TODO(jhylton): Should this be redesigned to handle</span>
+ <span class="c1"># persistent connections?</span>
+
+ <span class="c1"># We want to make an HTTP/1.1 request, but the addinfourl</span>
+ <span class="c1"># class isn&#39;t prepared to deal with a persistent connection.</span>
+ <span class="c1"># It will try to read all remaining data from the socket,</span>
+ <span class="c1"># which will block while the server waits for the next request.</span>
+ <span class="c1"># So make sure the connection gets closed after the (only)</span>
+ <span class="c1"># request.</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Connection&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;close&quot;</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="n">name</span><span class="o">.</span><span class="n">title</span><span class="p">():</span> <span class="n">val</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span>
+
+ <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">:</span>
+ <span class="n">tunnel_headers</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="n">proxy_auth_hdr</span> <span class="o">=</span> <span class="s2">&quot;Proxy-Authorization&quot;</span>
+ <span class="k">if</span> <span class="n">proxy_auth_hdr</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">tunnel_headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span>
+ <span class="c1"># Proxy-Authorization should not be sent to origin</span>
+ <span class="c1"># server.</span>
+ <span class="k">del</span> <span class="n">headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">set_tunnel</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">tunnel_headers</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">(),</span> <span class="n">req</span><span class="o">.</span><span class="n">selector</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span>
+ <span class="n">encode_chunked</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Transfer-encoding&#39;</span><span class="p">))</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span> <span class="c1"># timeout error</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getresponse</span><span class="p">()</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">raise</span>
+
+ <span class="c1"># If the server does not send us a &#39;Connection: close&#39; header,</span>
+ <span class="c1"># HTTPConnection assumes the socket should be left open. Manually</span>
+ <span class="c1"># mark the socket to be closed when this response object goes away.</span>
+ <span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="n">r</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">()</span>
+ <span class="c1"># This line replaces the .msg attribute of the HTTPResponse</span>
+ <span class="c1"># with .headers, because urllib clients expect the response to</span>
+ <span class="c1"># have the reason in .msg. It would be good to mark this</span>
+ <span class="c1"># attribute is deprecated and get then to use info() or</span>
+ <span class="c1"># .headers.</span>
+ <span class="n">r</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">reason</span>
+ <span class="k">return</span> <span class="n">r</span>
+
+
+<span class="k">class</span> <span class="nc">HTTPHandler</span><span class="p">(</span><span class="n">AbstractHTTPHandler</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">http_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_open</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPConnection</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
+
+ <span class="n">http_request</span> <span class="o">=</span> <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">do_request_</span>
+
+<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="p">,</span> <span class="s1">&#39;HTTPSConnection&#39;</span><span class="p">):</span>
+
+ <span class="k">class</span> <span class="nc">HTTPSHandler</span><span class="p">(</span><span class="n">AbstractHTTPHandler</span><span class="p">):</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">check_hostname</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_context</span> <span class="o">=</span> <span class="n">context</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_check_hostname</span> <span class="o">=</span> <span class="n">check_hostname</span>
+
+ <span class="k">def</span> <span class="nf">https_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_open</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span>
+ <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_context</span><span class="p">,</span> <span class="n">check_hostname</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_check_hostname</span><span class="p">)</span>
+
+ <span class="n">https_request</span> <span class="o">=</span> <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">do_request_</span>
+
+ <span class="n">__all__</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;HTTPSHandler&#39;</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">HTTPCookieProcessor</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookiejar</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="kn">import</span> <span class="nn">http.cookiejar</span>
+ <span class="k">if</span> <span class="n">cookiejar</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">cookiejar</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">CookieJar</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span> <span class="o">=</span> <span class="n">cookiejar</span>
+
+ <span class="k">def</span> <span class="nf">http_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">add_cookie_header</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">request</span>
+
+ <span class="k">def</span> <span class="nf">http_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">extract_cookies</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">response</span>
+
+ <span class="n">https_request</span> <span class="o">=</span> <span class="n">http_request</span>
+ <span class="n">https_response</span> <span class="o">=</span> <span class="n">http_response</span>
+
+<span class="k">class</span> <span class="nc">UnknownHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">unknown_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">type</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;unknown url type: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">parse_keqv_list</span><span class="p">(</span><span class="n">l</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Parse list of key=value strings where keys are not duplicated.&quot;&quot;&quot;</span>
+ <span class="n">parsed</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
+ <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">elt</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span> <span class="ow">and</span> <span class="n">v</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="n">parsed</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
+ <span class="k">return</span> <span class="n">parsed</span>
+
+<span class="k">def</span> <span class="nf">parse_http_list</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Parse lists as described by RFC 2068 Section 2.</span>
+
+<span class="sd"> In particular, parse comma-separated lists where the elements of</span>
+<span class="sd"> the list may include quoted-strings. A quoted-string could</span>
+<span class="sd"> contain a comma. A non-quoted string could have quotes in the</span>
+<span class="sd"> middle. Neither commas nor quotes count if they are escaped.</span>
+<span class="sd"> Only double-quotes count, not single-quotes.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="n">escape</span> <span class="o">=</span> <span class="n">quote</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">for</span> <span class="n">cur</span> <span class="ow">in</span> <span class="n">s</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">escape</span><span class="p">:</span>
+ <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
+ <span class="n">escape</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">continue</span>
+ <span class="k">if</span> <span class="n">quote</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">:</span>
+ <span class="n">escape</span> <span class="o">=</span> <span class="kc">True</span>
+ <span class="k">continue</span>
+ <span class="k">elif</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
+ <span class="n">quote</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;,&#39;</span><span class="p">:</span>
+ <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
+ <span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">continue</span>
+
+ <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
+ <span class="n">quote</span> <span class="o">=</span> <span class="kc">True</span>
+
+ <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
+
+ <span class="c1"># append last part</span>
+ <span class="k">if</span> <span class="n">part</span><span class="p">:</span>
+ <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">res</span><span class="p">]</span>
+
+<span class="k">class</span> <span class="nc">FileHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="c1"># Use local file or FTP depending on form of URL</span>
+ <span class="k">def</span> <span class="nf">file_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">selector</span>
+ <span class="k">if</span> <span class="n">url</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;//&#39;</span> <span class="ow">and</span> <span class="n">url</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="ow">and</span>
+ <span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="o">!=</span> <span class="s1">&#39;localhost&#39;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_names</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s2">&quot;file:// scheme is supported only on localhost&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_local_file</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
+
+ <span class="c1"># names for the localhost</span>
+ <span class="n">names</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">def</span> <span class="nf">get_names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">())[</span><span class="mi">2</span><span class="p">])</span>
+ <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
+ <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="o">=</span> <span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">),)</span>
+ <span class="k">return</span> <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span>
+
+ <span class="c1"># not entirely sure what the rules are here</span>
+ <span class="k">def</span> <span class="nf">open_local_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="kn">import</span> <span class="nn">email.utils</span>
+ <span class="kn">import</span> <span class="nn">mimetypes</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="n">filename</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">selector</span>
+ <span class="n">localfile</span> <span class="o">=</span> <span class="n">url2pathname</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">stats</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">localfile</span><span class="p">)</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">st_size</span>
+ <span class="n">modified</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">formatdate</span><span class="p">(</span><span class="n">stats</span><span class="o">.</span><span class="n">st_mtime</span><span class="p">,</span> <span class="n">usegmt</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span>
+ <span class="s1">&#39;Content-type: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">Content-length: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">Last-modified: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">mtype</span> <span class="ow">or</span> <span class="s1">&#39;text/plain&#39;</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">modified</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span> <span class="ow">or</span> \
+ <span class="p">(</span><span class="ow">not</span> <span class="n">port</span> <span class="ow">and</span> <span class="n">_safe_gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_names</span><span class="p">()):</span>
+ <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">origurl</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">filename</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">origurl</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">filename</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">localfile</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">headers</span><span class="p">,</span> <span class="n">origurl</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exp</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">exp</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;file not on local host&#39;</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_safe_gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+
+<span class="k">class</span> <span class="nc">FTPHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">ftp_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="kn">import</span> <span class="nn">ftplib</span>
+ <span class="kn">import</span> <span class="nn">mimetypes</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: no host given&#39;</span><span class="p">)</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">FTP_PORT</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
+
+ <span class="c1"># username/password handling</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user</span><span class="p">:</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="n">splitpasswd</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">passwd</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="n">user</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">passwd</span> <span class="o">=</span> <span class="n">passwd</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">msg</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">path</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="n">splitattr</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">selector</span><span class="p">)</span>
+ <span class="n">dirs</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
+ <span class="n">dirs</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">unquote</span><span class="p">,</span> <span class="n">dirs</span><span class="p">))</span>
+ <span class="n">dirs</span><span class="p">,</span> <span class="n">file</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">dirs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">dirs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
+ <span class="n">dirs</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">fw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connect_ftp</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="n">file</span> <span class="ow">and</span> <span class="s1">&#39;I&#39;</span> <span class="ow">or</span> <span class="s1">&#39;D&#39;</span>
+ <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
+ <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">splitvalue</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;type&#39;</span> <span class="ow">and</span> \
+ <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span><span class="p">,</span> <span class="s1">&#39;I&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;D&#39;</span><span class="p">):</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+ <span class="n">fp</span><span class="p">,</span> <span class="n">retrlen</span> <span class="o">=</span> <span class="n">fw</span><span class="o">.</span><span class="n">retrfile</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">mtype</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-type: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">mtype</span>
+ <span class="k">if</span> <span class="n">retrlen</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">retrlen</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-length: </span><span class="si">%d</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">retrlen</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">full_url</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">all_errors</span> <span class="k">as</span> <span class="n">exp</span><span class="p">:</span>
+ <span class="n">exc</span> <span class="o">=</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">exp</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">exc</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
+
+ <span class="k">def</span> <span class="nf">connect_ftp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">ftpwrapper</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span>
+ <span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">CacheFTPHandler</span><span class="p">(</span><span class="n">FTPHandler</span><span class="p">):</span>
+ <span class="c1"># XXX would be nice to have pluggable cache strategies</span>
+ <span class="c1"># XXX this stuff is definitely not thread safe</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cache</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">60</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span> <span class="o">=</span> <span class="mi">16</span>
+
+ <span class="k">def</span> <span class="nf">setTimeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="n">t</span>
+
+ <span class="k">def</span> <span class="nf">setMaxConns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span> <span class="o">=</span> <span class="n">m</span>
+
+ <span class="k">def</span> <span class="nf">connect_ftp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">user</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirs</span><span class="p">),</span> <span class="n">timeout</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ftpwrapper</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span>
+ <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">check_cache</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">check_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># first check for old ones</span>
+ <span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">&lt;=</span> <span class="n">t</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
+ <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
+
+ <span class="c1"># then check the size</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
+ <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span><span class="p">:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="k">break</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
+
+ <span class="k">def</span> <span class="nf">clear_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">conn</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+
+<span class="k">class</span> <span class="nc">DataHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">data_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="c1"># data URLs as specified in RFC 2397.</span>
+ <span class="c1">#</span>
+ <span class="c1"># ignores POSTed data</span>
+ <span class="c1">#</span>
+ <span class="c1"># syntax:</span>
+ <span class="c1"># dataurl := &quot;data:&quot; [ mediatype ] [ &quot;;base64&quot; ] &quot;,&quot; data</span>
+ <span class="c1"># mediatype := [ type &quot;/&quot; subtype ] *( &quot;;&quot; parameter )</span>
+ <span class="c1"># data := *urlchar</span>
+ <span class="c1"># parameter := attribute &quot;=&quot; value</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">full_url</span>
+
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;:&quot;</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">mediatype</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
+
+ <span class="c1"># even base64 encoded data URLs might be quoted so unquote in any case:</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">unquote_to_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mediatype</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s2">&quot;;base64&quot;</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">decodebytes</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="n">mediatype</span> <span class="o">=</span> <span class="n">mediatype</span><span class="p">[:</span><span class="o">-</span><span class="mi">7</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">mediatype</span><span class="p">:</span>
+ <span class="n">mediatype</span> <span class="o">=</span> <span class="s2">&quot;text/plain;charset=US-ASCII&quot;</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="s2">&quot;Content-type: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">Content-length: </span><span class="si">%d</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">mediatype</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)))</span>
+
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">io</span><span class="o">.</span><span class="n">BytesIO</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">headers</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+
+<span class="c1"># Code move from the old urllib module</span>
+
+<span class="n">MAXFTPCACHE</span> <span class="o">=</span> <span class="mi">10</span> <span class="c1"># Trim the ftp cache beyond this size</span>
+
+<span class="c1"># Helper for non-unix systems</span>
+<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;nt&#39;</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">nturl2path</span> <span class="k">import</span> <span class="n">url2pathname</span><span class="p">,</span> <span class="n">pathname2url</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">url2pathname</span><span class="p">(</span><span class="n">pathname</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;OS-specific conversion from a relative URL of the &#39;file&#39; scheme</span>
+<span class="sd"> to a file system path; not recommended for general use.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">unquote</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">pathname2url</span><span class="p">(</span><span class="n">pathname</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;OS-specific conversion from a file system path to a relative URL</span>
+<span class="sd"> of the &#39;file&#39; scheme; not recommended for general use.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">quote</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span>
+
+
+<span class="n">ftpcache</span> <span class="o">=</span> <span class="p">{}</span>
+
+
+<span class="k">class</span> <span class="nc">URLopener</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;Class to open URLs.</span>
+<span class="sd"> This is a class rather than just a subroutine because we may need</span>
+<span class="sd"> more than one set of global protocol-specific options.</span>
+<span class="sd"> Note -- this is a base class for those who don&#39;t want the</span>
+<span class="sd"> automatic handling of errors type 302 (relocated) and 401</span>
+<span class="sd"> (authorization needed).&quot;&quot;&quot;</span>
+
+ <span class="n">__tempfiles</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="n">version</span> <span class="o">=</span> <span class="s2">&quot;Python-urllib/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">__version__</span>
+
+ <span class="c1"># Constructor</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxies</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">x509</span><span class="p">):</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%(class)s</span><span class="s2"> style of invoking requests is deprecated. &quot;</span> \
+ <span class="s2">&quot;Use newer urlopen functions/methods&quot;</span> <span class="o">%</span> <span class="p">{</span><span class="s1">&#39;class&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">}</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">proxies</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies</span><span class="p">()</span>
+ <span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">proxies</span><span class="p">,</span> <span class="s1">&#39;keys&#39;</span><span class="p">),</span> <span class="s2">&quot;proxies must be a mapping&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span> <span class="o">=</span> <span class="n">proxies</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">key_file</span> <span class="o">=</span> <span class="n">x509</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;key_file&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cert_file</span> <span class="o">=</span> <span class="n">x509</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;cert_file&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;User-Agent&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;Accept&#39;</span><span class="p">,</span> <span class="s1">&#39;*/*&#39;</span><span class="p">)]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__tempfiles</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__unlink</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">unlink</span> <span class="c1"># See cleanup()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="c1"># Undocumented feature: if you assign {} to tempcache,</span>
+ <span class="c1"># it is used to cache files retrieved with</span>
+ <span class="c1"># self.retrieve(). This is not enabled by default</span>
+ <span class="c1"># since it does not work for changing documents (and I</span>
+ <span class="c1"># haven&#39;t got the logic to check expiration headers</span>
+ <span class="c1"># yet).</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span> <span class="o">=</span> <span class="n">ftpcache</span>
+ <span class="c1"># Undocumented feature: you can use a different</span>
+ <span class="c1"># ftp cache by assigning to the .ftpcache member;</span>
+ <span class="c1"># in case you want logically independent URL openers</span>
+ <span class="c1"># XXX This is not threadsafe. Bah.</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cleanup</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">cleanup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># This code sometimes runs when the rest of this module</span>
+ <span class="c1"># has already been deleted, so it can&#39;t use any globals</span>
+ <span class="c1"># or import anything.</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__tempfiles</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__tempfiles</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__unlink</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">__tempfiles</span><span class="p">[:]</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">addheader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Add a header to be used by the HTTP interface only</span>
+<span class="sd"> e.g. u.addheader(&#39;Accept&#39;, &#39;sound/basic&#39;)&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
+
+ <span class="c1"># External interface</span>
+ <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use URLopener().open(file) instead of open(file, &#39;r&#39;).&quot;&quot;&quot;</span>
+ <span class="n">fullurl</span> <span class="o">=</span> <span class="n">unwrap</span><span class="p">(</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">fullurl</span><span class="p">))</span>
+ <span class="n">fullurl</span> <span class="o">=</span> <span class="n">quote</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s2">&quot;%/:=&amp;?~#+!$,;&#39;@()*[]|&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span> <span class="ow">and</span> <span class="n">fullurl</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">:</span>
+ <span class="n">filename</span><span class="p">,</span> <span class="n">headers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">[</span><span class="n">fullurl</span><span class="p">]</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">)</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">url</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">fullurl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">urltype</span><span class="p">:</span>
+ <span class="n">urltype</span> <span class="o">=</span> <span class="s1">&#39;file&#39;</span>
+ <span class="k">if</span> <span class="n">urltype</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">:</span>
+ <span class="n">proxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">[</span><span class="n">urltype</span><span class="p">]</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">proxyhost</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">proxyhost</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">)</span> <span class="c1"># Signal special case to open_*()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">proxy</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;open_&#39;</span> <span class="o">+</span> <span class="n">urltype</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">urltype</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">proxy</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_unknown_proxy</span><span class="p">(</span><span class="n">proxy</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_unknown</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">except</span> <span class="p">(</span><span class="n">HTTPError</span><span class="p">,</span> <span class="n">URLError</span><span class="p">):</span>
+ <span class="k">raise</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">msg</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s1">&#39;socket error&#39;</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
+
+ <span class="k">def</span> <span class="nf">open_unknown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Overridable interface to open unknown URL type.&quot;&quot;&quot;</span>
+ <span class="nb">type</span><span class="p">,</span> <span class="n">url</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">fullurl</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s1">&#39;url error&#39;</span><span class="p">,</span> <span class="s1">&#39;unknown url type&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_unknown_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Overridable interface to open unknown URL type.&quot;&quot;&quot;</span>
+ <span class="nb">type</span><span class="p">,</span> <span class="n">url</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">fullurl</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s1">&#39;url error&#39;</span><span class="p">,</span> <span class="s1">&#39;invalid proxy for </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">,</span> <span class="n">proxy</span><span class="p">)</span>
+
+ <span class="c1"># External interface</span>
+ <span class="k">def</span> <span class="nf">retrieve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">reporthook</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;retrieve(url) returns (filename, headers) for a local object</span>
+<span class="sd"> or (tempfilename, headers) for a remote object.&quot;&quot;&quot;</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">unwrap</span><span class="p">(</span><span class="n">to_bytes</span><span class="p">(</span><span class="n">url</span><span class="p">))</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span> <span class="ow">and</span> <span class="n">url</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">[</span><span class="n">url</span><span class="p">]</span>
+ <span class="nb">type</span><span class="p">,</span> <span class="n">url1</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="nb">type</span> <span class="ow">or</span> <span class="nb">type</span> <span class="o">==</span> <span class="s1">&#39;file&#39;</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_local_file</span><span class="p">(</span><span class="n">url1</span><span class="p">)</span>
+ <span class="n">hdrs</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">url2pathname</span><span class="p">(</span><span class="n">splithost</span><span class="p">(</span><span class="n">url1</span><span class="p">)[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">hdrs</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">msg</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">filename</span><span class="p">:</span>
+ <span class="n">tfp</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">garbage</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">garbage</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">path</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="n">path</span><span class="p">,</span> <span class="n">garbage</span> <span class="o">=</span> <span class="n">splitquery</span><span class="p">(</span><span class="n">path</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="n">path</span><span class="p">,</span> <span class="n">garbage</span> <span class="o">=</span> <span class="n">splitattr</span><span class="p">(</span><span class="n">path</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="n">suffix</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">path</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+ <span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">filename</span><span class="p">)</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkstemp</span><span class="p">(</span><span class="n">suffix</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__tempfiles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
+ <span class="n">tfp</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">fdopen</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">filename</span><span class="p">,</span> <span class="n">headers</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tempcache</span><span class="p">[</span><span class="n">url</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
+ <span class="n">bs</span> <span class="o">=</span> <span class="mi">1024</span><span class="o">*</span><span class="mi">8</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
+ <span class="n">read</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="n">blocknum</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">if</span> <span class="s2">&quot;content-length&quot;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Content-Length&quot;</span><span class="p">])</span>
+ <span class="k">if</span> <span class="n">reporthook</span><span class="p">:</span>
+ <span class="n">reporthook</span><span class="p">(</span><span class="n">blocknum</span><span class="p">,</span> <span class="n">bs</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">block</span> <span class="o">=</span> <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">bs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">block</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="n">read</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
+ <span class="n">tfp</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">block</span><span class="p">)</span>
+ <span class="n">blocknum</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">reporthook</span><span class="p">:</span>
+ <span class="n">reporthook</span><span class="p">(</span><span class="n">blocknum</span><span class="p">,</span> <span class="n">bs</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">tfp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="c1"># raise exception if actual size does not match content-length header</span>
+ <span class="k">if</span> <span class="n">size</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">read</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">ContentTooShortError</span><span class="p">(</span>
+ <span class="s2">&quot;retrieval incomplete: got only </span><span class="si">%i</span><span class="s2"> out of </span><span class="si">%i</span><span class="s2"> bytes&quot;</span>
+ <span class="o">%</span> <span class="p">(</span><span class="n">read</span><span class="p">,</span> <span class="n">size</span><span class="p">),</span> <span class="n">result</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">result</span>
+
+ <span class="c1"># Each method named open_&lt;type&gt; knows how to open that type of URL</span>
+
+ <span class="k">def</span> <span class="nf">_open_generic_http</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection_factory</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Make an HTTP connection using connection_class.</span>
+
+<span class="sd"> This is an internal method that should be called from</span>
+<span class="sd"> open_http() or open_https().</span>
+
+<span class="sd"> Arguments:</span>
+<span class="sd"> - connection_factory should take a host name and return an</span>
+<span class="sd"> HTTPConnection instance.</span>
+<span class="sd"> - url is the url to retrieval or a host, relative-path pair.</span>
+<span class="sd"> - data is payload for a POST request or None.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">proxy_passwd</span><span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">user_passwd</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">realhost</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">url</span>
+ <span class="c1"># check whether the proxy contains authorization information</span>
+ <span class="n">proxy_passwd</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="c1"># now we proceed with the url we want to obtain</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">selector</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">rest</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">urltype</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;http&#39;</span><span class="p">:</span>
+ <span class="n">realhost</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">realhost</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">realhost</span><span class="p">:</span>
+ <span class="n">user_passwd</span><span class="p">,</span> <span class="n">realhost</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">realhost</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user_passwd</span><span class="p">:</span>
+ <span class="n">selector</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">://</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">urltype</span><span class="p">,</span> <span class="n">realhost</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">proxy_bypass</span><span class="p">(</span><span class="n">realhost</span><span class="p">):</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">realhost</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s1">&#39;http error&#39;</span><span class="p">,</span> <span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">proxy_passwd</span><span class="p">:</span>
+ <span class="n">proxy_passwd</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">proxy_passwd</span><span class="p">)</span>
+ <span class="n">proxy_auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">proxy_passwd</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;ascii&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">proxy_auth</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">if</span> <span class="n">user_passwd</span><span class="p">:</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">user_passwd</span><span class="p">)</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">user_passwd</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;ascii&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">http_conn</span> <span class="o">=</span> <span class="n">connection_factory</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">if</span> <span class="n">proxy_auth</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Proxy-Authorization&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Basic </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">proxy_auth</span>
+ <span class="k">if</span> <span class="n">auth</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Authorization&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;Basic </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">auth</span>
+ <span class="k">if</span> <span class="n">realhost</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Host&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">realhost</span>
+
+ <span class="c1"># Add Connection:close as we don&#39;t support persistent connections yet.</span>
+ <span class="c1"># This helps in closing the socket and avoiding ResourceWarning</span>
+
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Connection&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;close&quot;</span>
+
+ <span class="k">for</span> <span class="n">header</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="n">header</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Content-Type&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;application/x-www-form-urlencoded&quot;</span>
+ <span class="n">http_conn</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="s2">&quot;POST&quot;</span><span class="p">,</span> <span class="n">selector</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">http_conn</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="n">selector</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">http_conn</span><span class="o">.</span><span class="n">getresponse</span><span class="p">()</span>
+ <span class="k">except</span> <span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">BadStatusLine</span><span class="p">:</span>
+ <span class="c1"># something went wrong with the HTTP status line</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s2">&quot;http protocol error: bad status line&quot;</span><span class="p">)</span>
+
+ <span class="c1"># According to RFC 2616, &quot;2xx&quot; code indicates that the client&#39;s</span>
+ <span class="c1"># request was successfully received, understood, and accepted.</span>
+ <span class="k">if</span> <span class="mi">200</span> <span class="o">&lt;=</span> <span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="s2">&quot;http:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error</span><span class="p">(</span>
+ <span class="n">url</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">fp</span><span class="p">,</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">reason</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_http</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use HTTP protocol.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_generic_http</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPConnection</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Handle http errors.</span>
+
+<span class="sd"> Derived class can override this, or provide specific handlers</span>
+<span class="sd"> named http_error_DDD where DDD is the 3-digit error code.&quot;&quot;&quot;</span>
+ <span class="c1"># First check if there&#39;s a specific handler for this error</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;http_error_</span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">errcode</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">method</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="n">method</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Default error handler: close the connection and raise OSError.&quot;&quot;&quot;</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">_have_ssl</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">_https_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">(</span><span class="n">host</span><span class="p">,</span>
+ <span class="n">key_file</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">key_file</span><span class="p">,</span>
+ <span class="n">cert_file</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">cert_file</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_https</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use HTTPS protocol.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open_generic_http</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_https_connection</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use local file or FTP depending on form of URL.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;file error: proxy support for file protocol currently not implemented&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">url</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;//&#39;</span> <span class="ow">and</span> <span class="n">url</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="n">url</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">12</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;localhost/&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;file:// scheme is supported only on localhost&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_local_file</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_local_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use local file.&quot;&quot;&quot;</span>
+ <span class="kn">import</span> <span class="nn">email.utils</span>
+ <span class="kn">import</span> <span class="nn">mimetypes</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">file</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">localname</span> <span class="o">=</span> <span class="n">url2pathname</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">stats</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">localname</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">strerror</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
+ <span class="n">size</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">st_size</span>
+ <span class="n">modified</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">formatdate</span><span class="p">(</span><span class="n">stats</span><span class="o">.</span><span class="n">st_mtime</span><span class="p">,</span> <span class="n">usegmt</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">url</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span>
+ <span class="s1">&#39;Content-Type: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">Content-Length: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">Last-modified: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">mtype</span> <span class="ow">or</span> <span class="s1">&#39;text/plain&#39;</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">modified</span><span class="p">))</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">urlfile</span> <span class="o">=</span> <span class="n">file</span>
+ <span class="k">if</span> <span class="n">file</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span><span class="p">:</span>
+ <span class="n">urlfile</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">file</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">localname</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">headers</span><span class="p">,</span> <span class="n">urlfile</span><span class="p">)</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">port</span>
+ <span class="ow">and</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">in</span> <span class="p">((</span><span class="n">localhost</span><span class="p">(),)</span> <span class="o">+</span> <span class="n">thishost</span><span class="p">())):</span>
+ <span class="n">urlfile</span> <span class="o">=</span> <span class="n">file</span>
+ <span class="k">if</span> <span class="n">file</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;/&#39;</span><span class="p">:</span>
+ <span class="n">urlfile</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">file</span>
+ <span class="k">elif</span> <span class="n">file</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;./&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;local file url may start with / or file:. Unknown url of type: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">url</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">localname</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">headers</span><span class="p">,</span> <span class="n">urlfile</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;local file error: not on local host&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">open_ftp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use FTP protocol.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: proxy support for ftp protocol currently not implemented&#39;</span><span class="p">)</span>
+ <span class="kn">import</span> <span class="nn">mimetypes</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span> <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: no host given&#39;</span><span class="p">)</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="n">splitpasswd</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span> <span class="n">passwd</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">user</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">passwd</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">passwd</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">port</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">ftplib</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">FTP_PORT</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
+ <span class="n">path</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="n">splitattr</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+ <span class="n">path</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
+ <span class="n">dirs</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
+ <span class="n">dirs</span><span class="p">,</span> <span class="n">file</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">dirs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">dirs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> <span class="n">dirs</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
+ <span class="k">if</span> <span class="n">dirs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">user</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirs</span><span class="p">)</span>
+ <span class="c1"># XXX thread unsafe!</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">MAXFTPCACHE</span><span class="p">:</span>
+ <span class="c1"># Prune the cache, rather arbitrarily</span>
+ <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">k</span> <span class="o">!=</span> <span class="n">key</span><span class="p">:</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
+ <span class="n">v</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> \
+ <span class="n">ftpwrapper</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">file</span><span class="p">:</span> <span class="nb">type</span> <span class="o">=</span> <span class="s1">&#39;D&#39;</span>
+ <span class="k">else</span><span class="p">:</span> <span class="nb">type</span> <span class="o">=</span> <span class="s1">&#39;I&#39;</span>
+ <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
+ <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">splitvalue</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;type&#39;</span> <span class="ow">and</span> \
+ <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span><span class="p">,</span> <span class="s1">&#39;I&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;D&#39;</span><span class="p">):</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
+ <span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">retrlen</span><span class="p">)</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftpcache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">retrfile</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
+ <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="s2">&quot;ftp:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">mtype</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-Type: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">mtype</span>
+ <span class="k">if</span> <span class="n">retrlen</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">retrlen</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-Length: </span><span class="si">%d</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">retrlen</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="s2">&quot;ftp:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ftperrors</span><span class="p">()</span> <span class="k">as</span> <span class="n">exp</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">exp</span><span class="p">)</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
+
+ <span class="k">def</span> <span class="nf">open_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Use &quot;data&quot; URL.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;data error: proxy support for data protocol currently not implemented&#39;</span><span class="p">)</span>
+ <span class="c1"># ignore POSTed data</span>
+ <span class="c1">#</span>
+ <span class="c1"># syntax of data URLs:</span>
+ <span class="c1"># dataurl := &quot;data:&quot; [ mediatype ] [ &quot;;base64&quot; ] &quot;,&quot; data</span>
+ <span class="c1"># mediatype := [ type &quot;/&quot; subtype ] *( &quot;;&quot; parameter )</span>
+ <span class="c1"># data := *urlchar</span>
+ <span class="c1"># parameter := attribute &quot;=&quot; value</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="p">[</span><span class="nb">type</span><span class="p">,</span> <span class="n">data</span><span class="p">]</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s1">&#39;data error&#39;</span><span class="p">,</span> <span class="s1">&#39;bad data URL&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">type</span><span class="p">:</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="s1">&#39;text/plain;charset=US-ASCII&#39;</span>
+ <span class="n">semi</span> <span class="o">=</span> <span class="nb">type</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s1">&#39;;&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">semi</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="s1">&#39;=&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">type</span><span class="p">[</span><span class="n">semi</span><span class="p">:]:</span>
+ <span class="n">encoding</span> <span class="o">=</span> <span class="nb">type</span><span class="p">[</span><span class="n">semi</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
+ <span class="nb">type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">[:</span><span class="n">semi</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">encoding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">msg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;Date: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="o">%</span><span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S GMT&#39;</span><span class="p">,</span>
+ <span class="n">time</span><span class="o">.</span><span class="n">gmtime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())))</span>
+ <span class="n">msg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;Content-type: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">encoding</span> <span class="o">==</span> <span class="s1">&#39;base64&#39;</span><span class="p">:</span>
+ <span class="c1"># XXX is this encoding/decoding ok?</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">decodebytes</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;ascii&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;latin-1&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="n">msg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;Content-Length: </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+ <span class="n">msg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="n">msg</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">headers</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">f</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="c1">#f.fileno = None # needed for addinfourl</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">url</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">FancyURLopener</span><span class="p">(</span><span class="n">URLopener</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Derived class with handlers for errors we can handle (perhaps).&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">auth_cache</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tries</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">maxtries</span> <span class="o">=</span> <span class="mi">10</span>
+
+ <span class="k">def</span> <span class="nf">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Default error handling -- don&#39;t raise an exception.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="s2">&quot;http:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span> <span class="n">errcode</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_302</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 302 -- relocated (temporarily).&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tries</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxtries</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">tries</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">maxtries</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;http_error_500&quot;</span><span class="p">):</span>
+ <span class="n">meth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_500</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">meth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_default</span>
+ <span class="k">return</span> <span class="n">meth</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span>
+ <span class="s2">&quot;Internal Server Error: Redirect Recursion&quot;</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">)</span>
+ <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">redirect_internal</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">result</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tries</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">redirect_internal</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="s1">&#39;location&#39;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;location&#39;</span><span class="p">]</span>
+ <span class="k">elif</span> <span class="s1">&#39;uri&#39;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;uri&#39;</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="c1"># In case the server sent a relative URL, join with original:</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="n">urljoin</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">+</span> <span class="s2">&quot;:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span> <span class="n">newurl</span><span class="p">)</span>
+
+ <span class="n">urlparts</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+
+ <span class="c1"># For security reasons, we don&#39;t allow redirection to anything other</span>
+ <span class="c1"># than http, https and ftp.</span>
+
+ <span class="c1"># We are using newer HTTPError with older redirect_internal method</span>
+ <span class="c1"># This older method will get deprecated in 3.3</span>
+
+ <span class="k">if</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">scheme</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="s1">&#39;https&#39;</span><span class="p">,</span> <span class="s1">&#39;ftp&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span>
+ <span class="n">errmsg</span> <span class="o">+</span>
+ <span class="s2">&quot; Redirection to url &#39;</span><span class="si">%s</span><span class="s2">&#39; is not allowed.&quot;</span> <span class="o">%</span> <span class="n">newurl</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_301</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 301 -- also relocated (permanently).&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_302</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_303</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 303 -- also relocated (essentially identical to 302).&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_302</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_307</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 307 -- relocated, but turn POST into error.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_302</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_401</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">retry</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 401 -- authentication required.</span>
+<span class="sd"> This function supports Basic authentication only.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="s1">&#39;www-authenticate&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">stuff</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;www-authenticate&#39;</span><span class="p">]</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s1">&#39;[ </span><span class="se">\t</span><span class="s1">]*([^ </span><span class="se">\t</span><span class="s1">]+)[ </span><span class="se">\t</span><span class="s1">]+realm=&quot;([^&quot;]*)&quot;&#39;</span><span class="p">,</span> <span class="n">stuff</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">realm</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">retry</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;retry_&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">+</span> <span class="s1">&#39;_basic_auth&#39;</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">http_error_407</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">retry</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Error 407 -- proxy authentication required.</span>
+<span class="sd"> This function supports Basic authentication only.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="s1">&#39;proxy-authenticate&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">stuff</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;proxy-authenticate&#39;</span><span class="p">]</span>
+ <span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s1">&#39;[ </span><span class="se">\t</span><span class="s1">]*([^ </span><span class="se">\t</span><span class="s1">]+)[ </span><span class="se">\t</span><span class="s1">]+realm=&quot;([^&quot;]*)&quot;&#39;</span><span class="p">,</span> <span class="n">stuff</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">match</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">scheme</span><span class="p">,</span> <span class="n">realm</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">retry</span><span class="p">:</span>
+ <span class="n">URLopener</span><span class="o">.</span><span class="n">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span>
+ <span class="n">headers</span><span class="p">)</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="s1">&#39;retry_proxy_&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">+</span> <span class="s1">&#39;_basic_auth&#39;</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)(</span><span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_proxy_http_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">selector</span>
+ <span class="n">proxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">proxyhost</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
+ <span class="n">proxyhost</span><span class="p">,</span> <span class="n">proxyselector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">proxyhost</span><span class="p">)</span>
+ <span class="n">i</span> <span class="o">=</span> <span class="n">proxyhost</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">proxyhost</span> <span class="o">=</span> <span class="n">proxyhost</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_user_passwd</span><span class="p">(</span><span class="n">proxyhost</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">user</span> <span class="ow">or</span> <span class="n">passwd</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">proxyhost</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">@</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="n">quote</span><span class="p">(</span><span class="n">passwd</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="n">proxyhost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span> <span class="o">+</span> <span class="n">proxyhost</span> <span class="o">+</span> <span class="n">proxyselector</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_proxy_https_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">selector</span>
+ <span class="n">proxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;https&#39;</span><span class="p">]</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">proxyhost</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
+ <span class="n">proxyhost</span><span class="p">,</span> <span class="n">proxyselector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">proxyhost</span><span class="p">)</span>
+ <span class="n">i</span> <span class="o">=</span> <span class="n">proxyhost</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">proxyhost</span> <span class="o">=</span> <span class="n">proxyhost</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_user_passwd</span><span class="p">(</span><span class="n">proxyhost</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">user</span> <span class="ow">or</span> <span class="n">passwd</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">proxyhost</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">@</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="n">quote</span><span class="p">(</span><span class="n">passwd</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="n">proxyhost</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;https&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">proxyhost</span> <span class="o">+</span> <span class="n">proxyselector</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_http_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">i</span> <span class="o">=</span> <span class="n">host</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">host</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_user_passwd</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">user</span> <span class="ow">or</span> <span class="n">passwd</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">@</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="n">quote</span><span class="p">(</span><span class="n">passwd</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="n">host</span><span class="p">)</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">selector</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retry_https_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">i</span> <span class="o">=</span> <span class="n">host</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">host</span><span class="p">[</span><span class="n">i</span><span class="p">:]</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_user_passwd</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">user</span> <span class="ow">or</span> <span class="n">passwd</span><span class="p">):</span> <span class="k">return</span> <span class="kc">None</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">@</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">quote</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span>
+ <span class="n">quote</span><span class="p">(</span><span class="n">passwd</span><span class="p">,</span> <span class="n">safe</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">),</span> <span class="n">host</span><span class="p">)</span>
+ <span class="n">newurl</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">selector</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">get_user_passwd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">clear_cache</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">realm</span> <span class="o">+</span> <span class="s1">&#39;@&#39;</span> <span class="o">+</span> <span class="n">host</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_cache</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">clear_cache</span><span class="p">:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prompt_user_passwd</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">realm</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user</span> <span class="ow">or</span> <span class="n">passwd</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span>
+
+ <span class="k">def</span> <span class="nf">prompt_user_passwd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">realm</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Override this in a GUI environment!&quot;&quot;&quot;</span>
+ <span class="kn">import</span> <span class="nn">getpass</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">user</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="s2">&quot;Enter username for </span><span class="si">%s</span><span class="s2"> at </span><span class="si">%s</span><span class="s2">: &quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">host</span><span class="p">))</span>
+ <span class="n">passwd</span> <span class="o">=</span> <span class="n">getpass</span><span class="o">.</span><span class="n">getpass</span><span class="p">(</span><span class="s2">&quot;Enter password for </span><span class="si">%s</span><span class="s2"> in </span><span class="si">%s</span><span class="s2"> at </span><span class="si">%s</span><span class="s2">: &quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">host</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span>
+ <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
+ <span class="nb">print</span><span class="p">()</span>
+ <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
+
+
+<span class="c1"># Utility functions</span>
+
+<span class="n">_localhost</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="k">def</span> <span class="nf">localhost</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return the IP address of the magic hostname &#39;localhost&#39;.&quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_localhost</span>
+ <span class="k">if</span> <span class="n">_localhost</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">_localhost</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">_localhost</span>
+
+<span class="n">_thishost</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="k">def</span> <span class="nf">thishost</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return the IP addresses of the current host.&quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_thishost</span>
+ <span class="k">if</span> <span class="n">_thishost</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">_thishost</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">())[</span><span class="mi">2</span><span class="p">])</span>
+ <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
+ <span class="n">_thishost</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">])</span>
+ <span class="k">return</span> <span class="n">_thishost</span>
+
+<span class="n">_ftperrors</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="k">def</span> <span class="nf">ftperrors</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return the set of errors raised by the FTP class.&quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_ftperrors</span>
+ <span class="k">if</span> <span class="n">_ftperrors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">ftplib</span>
+ <span class="n">_ftperrors</span> <span class="o">=</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">all_errors</span>
+ <span class="k">return</span> <span class="n">_ftperrors</span>
+
+<span class="n">_noheaders</span> <span class="o">=</span> <span class="kc">None</span>
+<span class="k">def</span> <span class="nf">noheaders</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return an empty email Message object.&quot;&quot;&quot;</span>
+ <span class="k">global</span> <span class="n">_noheaders</span>
+ <span class="k">if</span> <span class="n">_noheaders</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">_noheaders</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">message_from_string</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">_noheaders</span>
+
+
+<span class="c1"># Utility classes</span>
+
+<span class="k">class</span> <span class="nc">ftpwrapper</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;Class used by open_ftp() for cache of open FTP connections.&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+ <span class="n">persistent</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="n">passwd</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="o">=</span> <span class="n">port</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">dirs</span> <span class="o">=</span> <span class="n">dirs</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">refcount</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">keepalive</span> <span class="o">=</span> <span class="n">persistent</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">raise</span>
+
+ <span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="kn">import</span> <span class="nn">ftplib</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">busy</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span> <span class="o">=</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">FTP</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">)</span>
+ <span class="n">_target</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dirs</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">cwd</span><span class="p">(</span><span class="n">_target</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">retrfile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
+ <span class="kn">import</span> <span class="nn">ftplib</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">endtransfer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="nb">type</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;D&#39;</span><span class="p">):</span> <span class="n">cmd</span> <span class="o">=</span> <span class="s1">&#39;TYPE A&#39;</span><span class="p">;</span> <span class="n">isdir</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">else</span><span class="p">:</span> <span class="n">cmd</span> <span class="o">=</span> <span class="s1">&#39;TYPE &#39;</span> <span class="o">+</span> <span class="nb">type</span><span class="p">;</span> <span class="n">isdir</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">all_errors</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
+ <span class="n">conn</span> <span class="o">=</span> <span class="kc">None</span>
+ <span class="k">if</span> <span class="n">file</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">isdir</span><span class="p">:</span>
+ <span class="c1"># Try to retrieve as a file</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">cmd</span> <span class="o">=</span> <span class="s1">&#39;RETR &#39;</span> <span class="o">+</span> <span class="n">file</span>
+ <span class="n">conn</span><span class="p">,</span> <span class="n">retrlen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">ntransfercmd</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">error_perm</span> <span class="k">as</span> <span class="n">reason</span><span class="p">:</span>
+ <span class="k">if</span> <span class="nb">str</span><span class="p">(</span><span class="n">reason</span><span class="p">)[:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;550&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span><span class="o">.</span><span class="n">with_traceback</span><span class="p">(</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">])</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">conn</span><span class="p">:</span>
+ <span class="c1"># Set transfer mode to ASCII!</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="s1">&#39;TYPE A&#39;</span><span class="p">)</span>
+ <span class="c1"># Try a directory listing. Verify that directory exists.</span>
+ <span class="k">if</span> <span class="n">file</span><span class="p">:</span>
+ <span class="n">pwd</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">pwd</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">cwd</span><span class="p">(</span><span class="n">file</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">error_perm</span> <span class="k">as</span> <span class="n">reason</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">reason</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">reason</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">cwd</span><span class="p">(</span><span class="n">pwd</span><span class="p">)</span>
+ <span class="n">cmd</span> <span class="o">=</span> <span class="s1">&#39;LIST &#39;</span> <span class="o">+</span> <span class="n">file</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">cmd</span> <span class="o">=</span> <span class="s1">&#39;LIST&#39;</span>
+ <span class="n">conn</span><span class="p">,</span> <span class="n">retrlen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">ntransfercmd</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">busy</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="n">ftpobj</span> <span class="o">=</span> <span class="n">addclosehook</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">makefile</span><span class="p">(</span><span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_close</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">refcount</span> <span class="o">+=</span> <span class="mi">1</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="c1"># Pass back both a suitably decorated object and a retrieval length</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">ftpobj</span><span class="p">,</span> <span class="n">retrlen</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">endtransfer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">busy</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">keepalive</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">refcount</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">real_close</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">file_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">endtransfer</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">refcount</span> <span class="o">-=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">refcount</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">keepalive</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">real_close</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">real_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">endtransfer</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">except</span> <span class="n">ftperrors</span><span class="p">():</span>
+ <span class="k">pass</span>
+
+<span class="c1"># Proxy handling</span>
+<span class="k">def</span> <span class="nf">getproxies_environment</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return a dictionary of scheme -&gt; proxy server URL mappings.</span>
+
+<span class="sd"> Scan the environment for variables named &lt;scheme&gt;_proxy;</span>
+<span class="sd"> this seems to be the standard convention. If you need a</span>
+<span class="sd"> different way, you can pass a proxies dictionary to the</span>
+<span class="sd"> [Fancy]URLopener constructor.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="c1"># in order to prefer lowercase variables, process environment in</span>
+ <span class="c1"># two passes: first matches any, second pass matches lowercase only</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">value</span> <span class="ow">and</span> <span class="n">name</span><span class="p">[</span><span class="o">-</span><span class="mi">6</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">&#39;_proxy&#39;</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">6</span><span class="p">]]</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="c1"># CVE-2016-1000110 - If we are running as CGI script, forget HTTP_PROXY</span>
+ <span class="c1"># (non-all-lowercase) as it may be set from the web server by a &quot;Proxy:&quot;</span>
+ <span class="c1"># header from the client</span>
+ <span class="c1"># If &quot;proxy&quot; is lowercase, it will still be used thanks to the next block</span>
+ <span class="k">if</span> <span class="s1">&#39;REQUEST_METHOD&#39;</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="k">if</span> <span class="n">name</span><span class="p">[</span><span class="o">-</span><span class="mi">6</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">&#39;_proxy&#39;</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">value</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">6</span><span class="p">]]</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">[:</span><span class="o">-</span><span class="mi">6</span><span class="p">],</span> <span class="kc">None</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">proxies</span>
+
+<span class="k">def</span> <span class="nf">proxy_bypass_environment</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">proxies</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Test if proxies should not be used for a particular host.</span>
+
+<span class="sd"> Checks the proxy dict for the value of no_proxy, which should</span>
+<span class="sd"> be a list of comma separated DNS suffixes, or &#39;*&#39; for all hosts.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">proxies</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies_environment</span><span class="p">()</span>
+ <span class="c1"># don&#39;t bypass, if no_proxy isn&#39;t specified</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">no_proxy</span> <span class="o">=</span> <span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;no&#39;</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="c1"># &#39;*&#39; is special case for always bypass</span>
+ <span class="k">if</span> <span class="n">no_proxy</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">1</span>
+ <span class="c1"># strip port off host</span>
+ <span class="n">hostonly</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="c1"># check if the host ends with any of the DNS suffixes</span>
+ <span class="n">no_proxy_list</span> <span class="o">=</span> <span class="p">[</span><span class="n">proxy</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">proxy</span> <span class="ow">in</span> <span class="n">no_proxy</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)]</span>
+ <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">no_proxy_list</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">name</span><span class="p">:</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span> <span class="c1"># ignore leading dots</span>
+ <span class="n">name</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="n">pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s1">&#39;(.+\.)?</span><span class="si">%s</span><span class="s1">$&#39;</span> <span class="o">%</span> <span class="n">name</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">hostonly</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
+ <span class="ow">or</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="mi">1</span>
+ <span class="c1"># otherwise, don&#39;t bypass</span>
+ <span class="k">return</span> <span class="mi">0</span>
+
+
+<span class="c1"># This code tests an OSX specific data structure but is testable on all</span>
+<span class="c1"># platforms</span>
+<span class="k">def</span> <span class="nf">_proxy_bypass_macosx_sysconf</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">proxy_settings</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return True iff this host shouldn&#39;t be accessed using a proxy</span>
+
+<span class="sd"> This function uses the MacOSX framework SystemConfiguration</span>
+<span class="sd"> to fetch the proxy information.</span>
+
+<span class="sd"> proxy_settings come from _scproxy._get_proxy_settings or get mocked ie:</span>
+<span class="sd"> { &#39;exclude_simple&#39;: bool,</span>
+<span class="sd"> &#39;exceptions&#39;: [&#39;foo.bar&#39;, &#39;*.bar.com&#39;, &#39;127.0.0.1&#39;, &#39;10.1&#39;, &#39;10.0/16&#39;]</span>
+<span class="sd"> }</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="kn">from</span> <span class="nn">fnmatch</span> <span class="k">import</span> <span class="n">fnmatch</span>
+
+ <span class="n">hostonly</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">ip2num</span><span class="p">(</span><span class="n">ipAddr</span><span class="p">):</span>
+ <span class="n">parts</span> <span class="o">=</span> <span class="n">ipAddr</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>
+ <span class="n">parts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">parts</span><span class="p">))</span>
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">4</span><span class="p">:</span>
+ <span class="n">parts</span> <span class="o">=</span> <span class="p">(</span><span class="n">parts</span> <span class="o">+</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">])[:</span><span class="mi">4</span><span class="p">]</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span> <span class="o">|</span> <span class="n">parts</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
+
+ <span class="c1"># Check for simple host names:</span>
+ <span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">proxy_settings</span><span class="p">[</span><span class="s1">&#39;exclude_simple&#39;</span><span class="p">]:</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="n">hostIP</span> <span class="o">=</span> <span class="kc">None</span>
+
+ <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">proxy_settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;exceptions&#39;</span><span class="p">,</span> <span class="p">()):</span>
+ <span class="c1"># Items in the list are strings like these: *.local, 169.254/16</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">value</span><span class="p">:</span> <span class="k">continue</span>
+
+ <span class="n">m</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;(\d+(?:\.\d+)*)(/\d+)?&quot;</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">m</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">hostIP</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">hostIP</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">hostonly</span><span class="p">)</span>
+ <span class="n">hostIP</span> <span class="o">=</span> <span class="n">ip2num</span><span class="p">(</span><span class="n">hostIP</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">continue</span>
+
+ <span class="n">base</span> <span class="o">=</span> <span class="n">ip2num</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+ <span class="n">mask</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mask</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">mask</span> <span class="o">=</span> <span class="mi">8</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">mask</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">mask</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
+ <span class="n">mask</span> <span class="o">=</span> <span class="mi">32</span> <span class="o">-</span> <span class="n">mask</span>
+
+ <span class="k">if</span> <span class="p">(</span><span class="n">hostIP</span> <span class="o">&gt;&gt;</span> <span class="n">mask</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">base</span> <span class="o">&gt;&gt;</span> <span class="n">mask</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="k">elif</span> <span class="n">fnmatch</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="k">return</span> <span class="kc">True</span>
+
+ <span class="k">return</span> <span class="kc">False</span>
+
+
+<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">platform</span> <span class="o">==</span> <span class="s1">&#39;darwin&#39;</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">_scproxy</span> <span class="k">import</span> <span class="n">_get_proxy_settings</span><span class="p">,</span> <span class="n">_get_proxies</span>
+
+ <span class="k">def</span> <span class="nf">proxy_bypass_macosx_sysconf</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="n">proxy_settings</span> <span class="o">=</span> <span class="n">_get_proxy_settings</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">_proxy_bypass_macosx_sysconf</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">proxy_settings</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">getproxies_macosx_sysconf</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return a dictionary of scheme -&gt; proxy server URL mappings.</span>
+
+<span class="sd"> This function uses the MacOSX framework SystemConfiguration</span>
+<span class="sd"> to fetch the proxy information.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">_get_proxies</span><span class="p">()</span>
+
+
+
+ <span class="k">def</span> <span class="nf">proxy_bypass</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return True, if host should be bypassed.</span>
+
+<span class="sd"> Checks proxy settings gathered from the environment, if specified,</span>
+<span class="sd"> or from the MacOSX framework SystemConfiguration.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies_environment</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">proxies</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">proxy_bypass_environment</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">proxies</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">proxy_bypass_macosx_sysconf</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">getproxies</span><span class="p">():</span>
+ <span class="k">return</span> <span class="n">getproxies_environment</span><span class="p">()</span> <span class="ow">or</span> <span class="n">getproxies_macosx_sysconf</span><span class="p">()</span>
+
+
+<span class="k">elif</span> <span class="n">os</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;nt&#39;</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">getproxies_registry</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return a dictionary of scheme -&gt; proxy server URL mappings.</span>
+
+<span class="sd"> Win32 uses the registry to store proxies.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="p">{}</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">winreg</span>
+ <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="c1"># Std module, so should be around - but you never know!</span>
+ <span class="k">return</span> <span class="n">proxies</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">internetSettings</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">OpenKey</span><span class="p">(</span><span class="n">winreg</span><span class="o">.</span><span class="n">HKEY_CURRENT_USER</span><span class="p">,</span>
+ <span class="sa">r</span><span class="s1">&#39;Software\Microsoft\Windows\CurrentVersion\Internet Settings&#39;</span><span class="p">)</span>
+ <span class="n">proxyEnable</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">QueryValueEx</span><span class="p">(</span><span class="n">internetSettings</span><span class="p">,</span>
+ <span class="s1">&#39;ProxyEnable&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">if</span> <span class="n">proxyEnable</span><span class="p">:</span>
+ <span class="c1"># Returned as Unicode but problems if not converted to ASCII</span>
+ <span class="n">proxyServer</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">winreg</span><span class="o">.</span><span class="n">QueryValueEx</span><span class="p">(</span><span class="n">internetSettings</span><span class="p">,</span>
+ <span class="s1">&#39;ProxyServer&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">if</span> <span class="s1">&#39;=&#39;</span> <span class="ow">in</span> <span class="n">proxyServer</span><span class="p">:</span>
+ <span class="c1"># Per-protocol settings</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">proxyServer</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;;&#39;</span><span class="p">):</span>
+ <span class="n">protocol</span><span class="p">,</span> <span class="n">address</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="c1"># See if address has a type:// prefix</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s1">&#39;^([^/:]+)://&#39;</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span>
+ <span class="n">address</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">://</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="n">address</span><span class="p">)</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="n">protocol</span><span class="p">]</span> <span class="o">=</span> <span class="n">address</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># Use one setting for all protocols</span>
+ <span class="k">if</span> <span class="n">proxyServer</span><span class="p">[:</span><span class="mi">5</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;http:&#39;</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">proxyServer</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;http://</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">proxyServer</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;https&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">proxyServer</span>
+ <span class="n">proxies</span><span class="p">[</span><span class="s1">&#39;ftp&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;ftp://</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">proxyServer</span>
+ <span class="n">internetSettings</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
+ <span class="k">except</span> <span class="p">(</span><span class="ne">OSError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
+ <span class="c1"># Either registry key not found etc, or the value in an</span>
+ <span class="c1"># unexpected format.</span>
+ <span class="c1"># proxies already set up to be empty so nothing to do</span>
+ <span class="k">pass</span>
+ <span class="k">return</span> <span class="n">proxies</span>
+
+ <span class="k">def</span> <span class="nf">getproxies</span><span class="p">():</span>
+ <span class="sd">&quot;&quot;&quot;Return a dictionary of scheme -&gt; proxy server URL mappings.</span>
+
+<span class="sd"> Returns settings gathered from the environment, if specified,</span>
+<span class="sd"> or the registry.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">getproxies_environment</span><span class="p">()</span> <span class="ow">or</span> <span class="n">getproxies_registry</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">proxy_bypass_registry</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">winreg</span>
+ <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="c1"># Std modules, so should be around - but you never know!</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">internetSettings</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">OpenKey</span><span class="p">(</span><span class="n">winreg</span><span class="o">.</span><span class="n">HKEY_CURRENT_USER</span><span class="p">,</span>
+ <span class="sa">r</span><span class="s1">&#39;Software\Microsoft\Windows\CurrentVersion\Internet Settings&#39;</span><span class="p">)</span>
+ <span class="n">proxyEnable</span> <span class="o">=</span> <span class="n">winreg</span><span class="o">.</span><span class="n">QueryValueEx</span><span class="p">(</span><span class="n">internetSettings</span><span class="p">,</span>
+ <span class="s1">&#39;ProxyEnable&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">proxyOverride</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">winreg</span><span class="o">.</span><span class="n">QueryValueEx</span><span class="p">(</span><span class="n">internetSettings</span><span class="p">,</span>
+ <span class="s1">&#39;ProxyOverride&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="c1"># ^^^^ Returned as Unicode but problems if not converted to ASCII</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">proxyEnable</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">proxyOverride</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="c1"># try to make a host list from name and IP address.</span>
+ <span class="n">rawHost</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="p">[</span><span class="n">rawHost</span><span class="p">]</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">addr</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">rawHost</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">addr</span> <span class="o">!=</span> <span class="n">rawHost</span><span class="p">:</span>
+ <span class="n">host</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">fqdn</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">getfqdn</span><span class="p">(</span><span class="n">rawHost</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">fqdn</span> <span class="o">!=</span> <span class="n">rawHost</span><span class="p">:</span>
+ <span class="n">host</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fqdn</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
+ <span class="k">pass</span>
+ <span class="c1"># make a check value list from the registry entry: replace the</span>
+ <span class="c1"># &#39;&lt;local&gt;&#39; string by the localhost entry and the corresponding</span>
+ <span class="c1"># canonical entry.</span>
+ <span class="n">proxyOverride</span> <span class="o">=</span> <span class="n">proxyOverride</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;;&#39;</span><span class="p">)</span>
+ <span class="c1"># now check if we match one of the registry values.</span>
+ <span class="k">for</span> <span class="n">test</span> <span class="ow">in</span> <span class="n">proxyOverride</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">test</span> <span class="o">==</span> <span class="s1">&#39;&lt;local&gt;&#39;</span><span class="p">:</span>
+ <span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">rawHost</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">1</span>
+ <span class="n">test</span> <span class="o">=</span> <span class="n">test</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">,</span> <span class="sa">r</span><span class="s2">&quot;\.&quot;</span><span class="p">)</span> <span class="c1"># mask dots</span>
+ <span class="n">test</span> <span class="o">=</span> <span class="n">test</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;*&quot;</span><span class="p">,</span> <span class="sa">r</span><span class="s2">&quot;.*&quot;</span><span class="p">)</span> <span class="c1"># change glob sequence</span>
+ <span class="n">test</span> <span class="o">=</span> <span class="n">test</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;?&quot;</span><span class="p">,</span> <span class="sa">r</span><span class="s2">&quot;.&quot;</span><span class="p">)</span> <span class="c1"># change glob char</span>
+ <span class="k">for</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">):</span>
+ <span class="k">return</span> <span class="mi">1</span>
+ <span class="k">return</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">proxy_bypass</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Return True, if host should be bypassed.</span>
+
+<span class="sd"> Checks proxy settings gathered from the environment, if specified,</span>
+<span class="sd"> or the registry.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies_environment</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">proxies</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">proxy_bypass_environment</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">proxies</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">proxy_bypass_registry</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+
+<span class="k">else</span><span class="p">:</span>
+ <span class="c1"># By default use environment variables</span>
+ <span class="n">getproxies</span> <span class="o">=</span> <span class="n">getproxies_environment</span>
+ <span class="n">proxy_bypass</span> <span class="o">=</span> <span class="n">proxy_bypass_environment</span>
+</pre></div>
+
+ </div>
+
+ </div>
+ </div>
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="../../index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="../../M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
+<h3>Related Topics</h3>
+<ul>
+ <li><a href="../../index.html">Documentation overview</a><ul>
+ <li><a href="../index.html">Module code</a><ul>
+ </ul></li>
+ </ul></li>
+</ul>
+</div>
+<div id="searchbox" style="display: none" role="search">
+ <h3>Quick search</h3>
+ <div class="searchformwrapper">
+ <form class="search" action="../../search.html" method="get">
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
+ <input type="hidden" name="check_keywords" value="yes" />
+ <input type="hidden" name="area" value="default" />
+ </form>
+ </div>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="footer">
+ &copy;2017, Matej Cepl <mcepl@cepl.eu>.
+
+ |
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
+
+ </div>
+
+
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/urllib2.html b/doc/html/_modules/urllib2.html
deleted file mode 100644
index bf30410..0000000
--- a/doc/html/_modules/urllib2.html
+++ /dev/null
@@ -1,1575 +0,0 @@
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>urllib2 &#8212; M2Crypto documentation</title>
- <link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
- <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: '../',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
- <script type="text/javascript" src="../_static/jquery.js"></script>
- <script type="text/javascript" src="../_static/underscore.js"></script>
- <script type="text/javascript" src="../_static/doctools.js"></script>
- <link rel="index" title="Index" href="../genindex.html" />
- <link rel="search" title="Search" href="../search.html" />
-
- <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
-
-
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
-
- </head>
- <body>
-
-
- <div class="document">
- <div class="documentwrapper">
- <div class="bodywrapper">
- <div class="body" role="main">
-
- <h1>Source code for urllib2</h1><div class="highlight"><pre>
-<span></span><span class="sd">&quot;&quot;&quot;An extensible library for opening URLs using a variety of protocols</span>
-
-<span class="sd">The simplest way to use this module is to call the urlopen function,</span>
-<span class="sd">which accepts a string containing a URL or a Request object (described</span>
-<span class="sd">below). It opens the URL and returns the results as file-like</span>
-<span class="sd">object; the returned object has some extra methods described below.</span>
-
-<span class="sd">The OpenerDirector manages a collection of Handler objects that do</span>
-<span class="sd">all the actual work. Each Handler implements a particular protocol or</span>
-<span class="sd">option. The OpenerDirector is a composite object that invokes the</span>
-<span class="sd">Handlers needed to open the requested URL. For example, the</span>
-<span class="sd">HTTPHandler performs HTTP GET and POST requests and deals with</span>
-<span class="sd">non-error returns. The HTTPRedirectHandler automatically deals with</span>
-<span class="sd">HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler</span>
-<span class="sd">deals with digest authentication.</span>
-
-<span class="sd">urlopen(url, data=None) -- Basic usage is the same as original</span>
-<span class="sd">urllib. pass the url and optionally data to post to an HTTP URL, and</span>
-<span class="sd">get a file-like object back. One difference is that you can also pass</span>
-<span class="sd">a Request instance instead of URL. Raises a URLError (subclass of</span>
-<span class="sd">IOError); for HTTP errors, raises an HTTPError, which can also be</span>
-<span class="sd">treated as a valid response.</span>
-
-<span class="sd">build_opener -- Function that creates a new OpenerDirector instance.</span>
-<span class="sd">Will install the default handlers. Accepts one or more Handlers as</span>
-<span class="sd">arguments, either instances or Handler classes that it will</span>
-<span class="sd">instantiate. If one of the argument is a subclass of the default</span>
-<span class="sd">handler, the argument will be installed instead of the default.</span>
-
-<span class="sd">install_opener -- Installs a new opener as the default opener.</span>
-
-<span class="sd">objects of interest:</span>
-
-<span class="sd">OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages</span>
-<span class="sd">the Handler classes, while dealing with requests and responses.</span>
-
-<span class="sd">Request -- An object that encapsulates the state of a request. The</span>
-<span class="sd">state can be as simple as the URL. It can also include extra HTTP</span>
-<span class="sd">headers, e.g. a User-Agent.</span>
-
-<span class="sd">BaseHandler --</span>
-
-<span class="sd">exceptions:</span>
-<span class="sd">URLError -- A subclass of IOError, individual protocols have their own</span>
-<span class="sd">specific subclass.</span>
-
-<span class="sd">HTTPError -- Also a valid HTTP response, so you can treat an HTTP error</span>
-<span class="sd">as an exceptional event or valid response.</span>
-
-<span class="sd">internals:</span>
-<span class="sd">BaseHandler and parent</span>
-<span class="sd">_call_chain conventions</span>
-
-<span class="sd">Example usage:</span>
-
-<span class="sd">import urllib2</span>
-
-<span class="sd"># set up authentication info</span>
-<span class="sd">authinfo = urllib2.HTTPBasicAuthHandler()</span>
-<span class="sd">authinfo.add_password(realm=&#39;PDQ Application&#39;,</span>
-<span class="sd"> uri=&#39;https://mahler:8092/site-updates.py&#39;,</span>
-<span class="sd"> user=&#39;klem&#39;,</span>
-<span class="sd"> passwd=&#39;geheim$parole&#39;)</span>
-
-<span class="sd">proxy_support = urllib2.ProxyHandler({&quot;http&quot; : &quot;http://ahad-haam:3128&quot;})</span>
-
-<span class="sd"># build a new opener that adds authentication and caching FTP handlers</span>
-<span class="sd">opener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler)</span>
-
-<span class="sd"># install it</span>
-<span class="sd">urllib2.install_opener(opener)</span>
-
-<span class="sd">f = urllib2.urlopen(&#39;http://www.python.org/&#39;)</span>
-
-
-<span class="sd">&quot;&quot;&quot;</span>
-
-<span class="c1"># XXX issues:</span>
-<span class="c1"># If an authentication error handler that tries to perform</span>
-<span class="c1"># authentication for some reason but fails, how should the error be</span>
-<span class="c1"># signalled? The client needs to know the HTTP error code. But if</span>
-<span class="c1"># the handler knows that the problem was, e.g., that it didn&#39;t know</span>
-<span class="c1"># that hash algo that requested in the challenge, it would be good to</span>
-<span class="c1"># pass that information along to the client, too.</span>
-<span class="c1"># ftp errors aren&#39;t handled cleanly</span>
-<span class="c1"># check digest against correct (i.e. non-apache) implementation</span>
-
-<span class="c1"># Possible extensions:</span>
-<span class="c1"># complex proxies XXX not sure what exactly was meant by this</span>
-<span class="c1"># abstract factory for opener</span>
-
-<span class="kn">import</span> <span class="nn">base64</span>
-<span class="kn">import</span> <span class="nn">hashlib</span>
-<span class="kn">import</span> <span class="nn">httplib</span>
-<span class="kn">import</span> <span class="nn">mimetools</span>
-<span class="kn">import</span> <span class="nn">os</span>
-<span class="kn">import</span> <span class="nn">posixpath</span>
-<span class="kn">import</span> <span class="nn">random</span>
-<span class="kn">import</span> <span class="nn">re</span>
-<span class="kn">import</span> <span class="nn">socket</span>
-<span class="kn">import</span> <span class="nn">sys</span>
-<span class="kn">import</span> <span class="nn">time</span>
-<span class="kn">import</span> <span class="nn">urlparse</span>
-<span class="kn">import</span> <span class="nn">bisect</span>
-<span class="kn">import</span> <span class="nn">warnings</span>
-
-<span class="k">try</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">cStringIO</span> <span class="k">import</span> <span class="n">StringIO</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="kn">from</span> <span class="nn">StringIO</span> <span class="k">import</span> <span class="n">StringIO</span>
-
-<span class="c1"># check for SSL</span>
-<span class="k">try</span><span class="p">:</span>
- <span class="kn">import</span> <span class="nn">ssl</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
- <span class="n">_have_ssl</span> <span class="o">=</span> <span class="kc">False</span>
-<span class="k">else</span><span class="p">:</span>
- <span class="n">_have_ssl</span> <span class="o">=</span> <span class="kc">True</span>
-
-<span class="kn">from</span> <span class="nn">urllib</span> <span class="k">import</span> <span class="p">(</span><span class="n">unwrap</span><span class="p">,</span> <span class="n">unquote</span><span class="p">,</span> <span class="n">splittype</span><span class="p">,</span> <span class="n">splithost</span><span class="p">,</span> <span class="n">quote</span><span class="p">,</span>
- <span class="n">addinfourl</span><span class="p">,</span> <span class="n">splitport</span><span class="p">,</span> <span class="n">splittag</span><span class="p">,</span> <span class="n">toBytes</span><span class="p">,</span>
- <span class="n">splitattr</span><span class="p">,</span> <span class="n">ftpwrapper</span><span class="p">,</span> <span class="n">splituser</span><span class="p">,</span> <span class="n">splitpasswd</span><span class="p">,</span> <span class="n">splitvalue</span><span class="p">)</span>
-
-<span class="c1"># support for FileHandler, proxies via environment variables</span>
-<span class="kn">from</span> <span class="nn">urllib</span> <span class="k">import</span> <span class="n">localhost</span><span class="p">,</span> <span class="n">url2pathname</span><span class="p">,</span> <span class="n">getproxies</span><span class="p">,</span> <span class="n">proxy_bypass</span>
-
-<span class="c1"># used in User-Agent header sent</span>
-<span class="n">__version__</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span>
-
-<span class="n">_opener</span> <span class="o">=</span> <span class="kc">None</span>
-<span class="k">def</span> <span class="nf">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">_GLOBAL_DEFAULT_TIMEOUT</span><span class="p">,</span>
- <span class="n">cafile</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">capath</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">cadefault</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="k">global</span> <span class="n">_opener</span>
- <span class="k">if</span> <span class="n">cafile</span> <span class="ow">or</span> <span class="n">capath</span> <span class="ow">or</span> <span class="n">cadefault</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">context</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
- <span class="s2">&quot;You can&#39;t pass both context and any of cafile, capath, and &quot;</span>
- <span class="s2">&quot;cadefault&quot;</span>
- <span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">_have_ssl</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;SSL support not available&#39;</span><span class="p">)</span>
- <span class="n">context</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">create_default_context</span><span class="p">(</span><span class="n">purpose</span><span class="o">=</span><span class="n">ssl</span><span class="o">.</span><span class="n">Purpose</span><span class="o">.</span><span class="n">SERVER_AUTH</span><span class="p">,</span>
- <span class="n">cafile</span><span class="o">=</span><span class="n">cafile</span><span class="p">,</span>
- <span class="n">capath</span><span class="o">=</span><span class="n">capath</span><span class="p">)</span>
- <span class="n">https_handler</span> <span class="o">=</span> <span class="n">HTTPSHandler</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span>
- <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">(</span><span class="n">https_handler</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">context</span><span class="p">:</span>
- <span class="n">https_handler</span> <span class="o">=</span> <span class="n">HTTPSHandler</span><span class="p">(</span><span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">)</span>
- <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">(</span><span class="n">https_handler</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">_opener</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">_opener</span> <span class="o">=</span> <span class="n">opener</span> <span class="o">=</span> <span class="n">build_opener</span><span class="p">()</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">opener</span> <span class="o">=</span> <span class="n">_opener</span>
- <span class="k">return</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">):</span>
- <span class="k">global</span> <span class="n">_opener</span>
- <span class="n">_opener</span> <span class="o">=</span> <span class="n">opener</span>
-
-<span class="c1"># do these error classes make sense?</span>
-<span class="c1"># make sure all of the IOError stuff is overridden. we just want to be</span>
-<span class="c1"># subtypes.</span>
-
-<span class="k">class</span> <span class="nc">URLError</span><span class="p">(</span><span class="ne">IOError</span><span class="p">):</span>
- <span class="c1"># URLError is a sub-type of IOError, but it doesn&#39;t share any of</span>
- <span class="c1"># the implementation. need to override __init__ and __str__.</span>
- <span class="c1"># It sets self.args for compatibility with other EnvironmentError</span>
- <span class="c1"># subclasses, but args doesn&#39;t have the typical format with errno in</span>
- <span class="c1"># slot 0 and strerror in slot 1. This may be better than nothing.</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">reason</span><span class="p">,</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">reason</span> <span class="o">=</span> <span class="n">reason</span>
-
- <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s1">&#39;&lt;urlopen error </span><span class="si">%s</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">reason</span>
-
-<span class="k">class</span> <span class="nc">HTTPError</span><span class="p">(</span><span class="n">URLError</span><span class="p">,</span> <span class="n">addinfourl</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Raised when HTTP error occurs, but also acts like non-error return&quot;&quot;&quot;</span>
- <span class="n">__super_init</span> <span class="o">=</span> <span class="n">addinfourl</span><span class="o">.</span><span class="fm">__init__</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">,</span> <span class="n">fp</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">code</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">hdrs</span> <span class="o">=</span> <span class="n">hdrs</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">fp</span> <span class="o">=</span> <span class="n">fp</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">url</span>
- <span class="c1"># The addinfourl classes depend on fp being a valid file</span>
- <span class="c1"># object. In some cases, the HTTPError may not have a valid</span>
- <span class="c1"># file object. If this happens, the simplest workaround is to</span>
- <span class="c1"># not initialize the base classes.</span>
- <span class="k">if</span> <span class="n">fp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__super_init</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">code</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="s1">&#39;HTTP Error </span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">code</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
-
- <span class="c1"># since URLError specifies a .reason attribute, HTTPError should also</span>
- <span class="c1"># provide this attribute. See issue13211 fo discussion.</span>
- <span class="nd">@property</span>
- <span class="k">def</span> <span class="nf">reason</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span>
-
- <span class="k">def</span> <span class="nf">info</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">hdrs</span>
-
-<span class="c1"># copied from cookielib.py</span>
-<span class="n">_cut_port_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;:\d+$&quot;</span><span class="p">)</span>
-<span class="k">def</span> <span class="nf">request_host</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Return request-host, as defined by RFC 2965.</span>
-
-<span class="sd"> Variation from RFC: returned value is lowercased, for convenient</span>
-<span class="sd"> comparison.</span>
-
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">url</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">()</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">host</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span><span class="p">:</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="s2">&quot;Host&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
-
- <span class="c1"># remove port, if present</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">_cut_port_re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">host</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
-
-<span class="k">class</span> <span class="nc">Request</span><span class="p">:</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{},</span>
- <span class="n">origin_req_host</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">unverifiable</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
- <span class="c1"># unwrap(&#39;&lt;URL:type://host/path&gt;&#39;) --&gt; &#39;type://host/path&#39;</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__original</span> <span class="o">=</span> <span class="n">unwrap</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__original</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fragment</span> <span class="o">=</span> <span class="n">splittag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__original</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="c1"># self.__r_type is what&#39;s left after doing the splittype</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="k">if</span> <span class="n">origin_req_host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">origin_req_host</span> <span class="o">=</span> <span class="n">request_host</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">origin_req_host</span> <span class="o">=</span> <span class="n">origin_req_host</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">unverifiable</span> <span class="o">=</span> <span class="n">unverifiable</span>
-
- <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
- <span class="c1"># XXX this is a fallback mechanism to guard against these</span>
- <span class="c1"># methods getting called in a non-standard order. this may be</span>
- <span class="c1"># too complicated and/or unnecessary.</span>
- <span class="c1"># XXX should the __r_XXX attributes be public?</span>
- <span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;_Request__r_type&#39;</span><span class="p">,</span> <span class="s1">&#39;_Request__r_host&#39;</span><span class="p">):</span>
- <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;get_&#39;</span> <span class="o">+</span> <span class="n">attr</span><span class="p">[</span><span class="mi">12</span><span class="p">:])()</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span>
- <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">,</span> <span class="n">attr</span>
-
- <span class="k">def</span> <span class="nf">get_method</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_data</span><span class="p">():</span>
- <span class="k">return</span> <span class="s2">&quot;POST&quot;</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="s2">&quot;GET&quot;</span>
-
- <span class="c1"># XXX these helper methods are lame</span>
-
- <span class="k">def</span> <span class="nf">add_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
-
- <span class="k">def</span> <span class="nf">has_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
-
- <span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span>
-
- <span class="k">def</span> <span class="nf">get_full_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fragment</span><span class="p">:</span>
- <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">#</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__original</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__fragment</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__original</span>
-
- <span class="k">def</span> <span class="nf">get_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__r_type</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__original</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="s2">&quot;unknown url type: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__original</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span>
-
- <span class="k">def</span> <span class="nf">get_host</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__r_host</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__r_type</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">)</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span>
-
- <span class="k">def</span> <span class="nf">get_selector</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__r_host</span>
-
- <span class="k">def</span> <span class="nf">set_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">==</span> <span class="s1">&#39;https&#39;</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_tunnel_host</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="nb">type</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">__r_host</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__original</span>
-
- <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
-
- <span class="k">def</span> <span class="nf">has_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__r_host</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">__original</span>
-
- <span class="k">def</span> <span class="nf">get_origin_req_host</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">origin_req_host</span>
-
- <span class="k">def</span> <span class="nf">is_unverifiable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">unverifiable</span>
-
- <span class="k">def</span> <span class="nf">add_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
- <span class="c1"># useful for something like authentication</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()]</span> <span class="o">=</span> <span class="n">val</span>
-
- <span class="k">def</span> <span class="nf">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
- <span class="c1"># will not be added to a redirected request</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">[</span><span class="n">key</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()]</span> <span class="o">=</span> <span class="n">val</span>
-
- <span class="k">def</span> <span class="nf">has_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header_name</span><span class="p">):</span>
- <span class="k">return</span> <span class="p">(</span><span class="n">header_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="ow">or</span>
- <span class="n">header_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">get_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header_name</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
- <span class="n">header_name</span><span class="p">,</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">header_name</span><span class="p">,</span> <span class="n">default</span><span class="p">))</span>
-
- <span class="k">def</span> <span class="nf">header_items</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="n">hdrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
- <span class="n">hdrs</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">hdrs</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
-
-<span class="k">class</span> <span class="nc">OpenerDirector</span><span class="p">:</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="n">client_version</span> <span class="o">=</span> <span class="s2">&quot;Python-urllib/</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">__version__</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;User-agent&#39;</span><span class="p">,</span> <span class="n">client_version</span><span class="p">)]</span>
- <span class="c1"># self.handlers is retained only for backward compatibility</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">handlers</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="c1"># manage the individual handlers</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span> <span class="o">=</span> <span class="p">{}</span>
-
- <span class="k">def</span> <span class="nf">add_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="s2">&quot;add_parent&quot;</span><span class="p">):</span>
- <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;expected BaseHandler instance, got </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span>
- <span class="nb">type</span><span class="p">(</span><span class="n">handler</span><span class="p">))</span>
-
- <span class="n">added</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">for</span> <span class="n">meth</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">handler</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">meth</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">&quot;redirect_request&quot;</span><span class="p">,</span> <span class="s2">&quot;do_open&quot;</span><span class="p">,</span> <span class="s2">&quot;proxy_open&quot;</span><span class="p">]:</span>
- <span class="c1"># oops, coincidental match</span>
- <span class="k">continue</span>
-
- <span class="n">i</span> <span class="o">=</span> <span class="n">meth</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)</span>
- <span class="n">protocol</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span>
- <span class="n">condition</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
-
- <span class="k">if</span> <span class="n">condition</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;error&quot;</span><span class="p">):</span>
- <span class="n">j</span> <span class="o">=</span> <span class="n">condition</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;_&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
- <span class="n">kind</span> <span class="o">=</span> <span class="n">meth</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">kind</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">kind</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
- <span class="k">pass</span>
- <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">{})</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="p">[</span><span class="n">protocol</span><span class="p">]</span> <span class="o">=</span> <span class="n">lookup</span>
- <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;open&quot;</span><span class="p">:</span>
- <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
- <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span>
- <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;response&quot;</span><span class="p">:</span>
- <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
- <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span>
- <span class="k">elif</span> <span class="n">condition</span> <span class="o">==</span> <span class="s2">&quot;request&quot;</span><span class="p">:</span>
- <span class="n">kind</span> <span class="o">=</span> <span class="n">protocol</span>
- <span class="n">lookup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">continue</span>
-
- <span class="n">handlers</span> <span class="o">=</span> <span class="n">lookup</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">kind</span><span class="p">,</span> <span class="p">[])</span>
- <span class="k">if</span> <span class="n">handlers</span><span class="p">:</span>
- <span class="n">bisect</span><span class="o">.</span><span class="n">insort</span><span class="p">(</span><span class="n">handlers</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
- <span class="n">added</span> <span class="o">=</span> <span class="kc">True</span>
-
- <span class="k">if</span> <span class="n">added</span><span class="p">:</span>
- <span class="n">bisect</span><span class="o">.</span><span class="n">insort</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handlers</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
- <span class="n">handler</span><span class="o">.</span><span class="n">add_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="c1"># Only exists for backwards compatibility.</span>
- <span class="k">pass</span>
-
- <span class="k">def</span> <span class="nf">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">chain</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
- <span class="c1"># Handlers raise an exception if no one else should try to handle</span>
- <span class="c1"># the request, or return None if they can&#39;t but another handler</span>
- <span class="c1"># could. Otherwise, they return the response.</span>
- <span class="n">handlers</span> <span class="o">=</span> <span class="n">chain</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">kind</span><span class="p">,</span> <span class="p">())</span>
- <span class="k">for</span> <span class="n">handler</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
- <span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
-
- <span class="n">result</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">result</span>
-
- <span class="k">def</span> <span class="nf">open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">_GLOBAL_DEFAULT_TIMEOUT</span><span class="p">):</span>
- <span class="c1"># accept a URL or a Request object</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
- <span class="n">req</span> <span class="o">=</span> <span class="n">Request</span><span class="p">(</span><span class="n">fullurl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">req</span> <span class="o">=</span> <span class="n">fullurl</span>
- <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">req</span><span class="o">.</span><span class="n">add_data</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-
- <span class="n">req</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span>
- <span class="n">protocol</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_type</span><span class="p">()</span>
-
- <span class="c1"># pre-process request</span>
- <span class="n">meth_name</span> <span class="o">=</span> <span class="n">protocol</span><span class="o">+</span><span class="s2">&quot;_request&quot;</span>
- <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">[]):</span>
- <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
- <span class="n">req</span> <span class="o">=</span> <span class="n">meth</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
-
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
-
- <span class="c1"># post-process response</span>
- <span class="n">meth_name</span> <span class="o">=</span> <span class="n">protocol</span><span class="o">+</span><span class="s2">&quot;_response&quot;</span>
- <span class="k">for</span> <span class="n">processor</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">process_response</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">protocol</span><span class="p">,</span> <span class="p">[]):</span>
- <span class="n">meth</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span>
- <span class="n">response</span> <span class="o">=</span> <span class="n">meth</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span>
-
- <span class="k">return</span> <span class="n">response</span>
-
- <span class="k">def</span> <span class="nf">_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="p">,</span>
- <span class="s1">&#39;default_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">result</span>
-
- <span class="n">protocol</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_type</span><span class="p">()</span>
- <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">protocol</span> <span class="o">+</span>
- <span class="s1">&#39;_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">result</span>
-
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">handle_open</span><span class="p">,</span> <span class="s1">&#39;unknown&#39;</span><span class="p">,</span>
- <span class="s1">&#39;unknown_open&#39;</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proto</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">proto</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="s1">&#39;https&#39;</span><span class="p">):</span>
- <span class="c1"># XXX http[s] protocols are special-cased</span>
- <span class="nb">dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="p">[</span><span class="s1">&#39;http&#39;</span><span class="p">]</span> <span class="c1"># https is not different than http</span>
- <span class="n">proto</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># YUCK!</span>
- <span class="n">meth_name</span> <span class="o">=</span> <span class="s1">&#39;http_error_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">proto</span>
- <span class="n">http_err</span> <span class="o">=</span> <span class="mi">1</span>
- <span class="n">orig_args</span> <span class="o">=</span> <span class="n">args</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="nb">dict</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span>
- <span class="n">meth_name</span> <span class="o">=</span> <span class="n">proto</span> <span class="o">+</span> <span class="s1">&#39;_error&#39;</span>
- <span class="n">http_err</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">proto</span><span class="p">,</span> <span class="n">meth_name</span><span class="p">)</span> <span class="o">+</span> <span class="n">args</span>
- <span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">result</span>
-
- <span class="k">if</span> <span class="n">http_err</span><span class="p">:</span>
- <span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="s1">&#39;default&#39;</span><span class="p">,</span> <span class="s1">&#39;http_error_default&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">orig_args</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_call_chain</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
-
-<span class="c1"># XXX probably also want an abstract factory that knows when it makes</span>
-<span class="c1"># sense to skip a superclass in favor of a subclass and when it might</span>
-<span class="c1"># make sense to include both</span>
-
-<span class="k">def</span> <span class="nf">build_opener</span><span class="p">(</span><span class="o">*</span><span class="n">handlers</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Create an opener object from a list of handlers.</span>
-
-<span class="sd"> The opener will use several default handlers, including support</span>
-<span class="sd"> for HTTP, FTP and when applicable, HTTPS.</span>
-
-<span class="sd"> If any of the handlers passed as arguments are subclasses of the</span>
-<span class="sd"> default handlers, the default handlers will not be used.</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="kn">import</span> <span class="nn">types</span>
- <span class="k">def</span> <span class="nf">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
- <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="p">(</span><span class="n">types</span><span class="o">.</span><span class="n">ClassType</span><span class="p">,</span> <span class="nb">type</span><span class="p">))</span>
-
- <span class="n">opener</span> <span class="o">=</span> <span class="n">OpenerDirector</span><span class="p">()</span>
- <span class="n">default_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">ProxyHandler</span><span class="p">,</span> <span class="n">UnknownHandler</span><span class="p">,</span> <span class="n">HTTPHandler</span><span class="p">,</span>
- <span class="n">HTTPDefaultErrorHandler</span><span class="p">,</span> <span class="n">HTTPRedirectHandler</span><span class="p">,</span>
- <span class="n">FTPHandler</span><span class="p">,</span> <span class="n">FileHandler</span><span class="p">,</span> <span class="n">HTTPErrorProcessor</span><span class="p">]</span>
- <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">httplib</span><span class="p">,</span> <span class="s1">&#39;HTTPS&#39;</span><span class="p">):</span>
- <span class="n">default_classes</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">HTTPSHandler</span><span class="p">)</span>
- <span class="n">skip</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
- <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">check</span><span class="p">):</span>
- <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
- <span class="n">skip</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
- <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
- <span class="n">skip</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">skip</span><span class="p">:</span>
- <span class="n">default_classes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
-
- <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
- <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">klass</span><span class="p">())</span>
-
- <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">h</span><span class="p">):</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">h</span><span class="p">()</span>
- <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">opener</span>
-
-<span class="k">class</span> <span class="nc">BaseHandler</span><span class="p">:</span>
- <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">500</span>
-
- <span class="k">def</span> <span class="nf">add_parent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
-
- <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="c1"># Only exists for backwards compatibility</span>
- <span class="k">pass</span>
-
- <span class="k">def</span> <span class="nf">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="s2">&quot;handler_order&quot;</span><span class="p">):</span>
- <span class="c1"># Try to preserve the old behavior of having custom classes</span>
- <span class="c1"># inserted after default ones (works only for custom user</span>
- <span class="c1"># classes which are not aware of handler_order).</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler_order</span> <span class="o">&lt;</span> <span class="n">other</span><span class="o">.</span><span class="n">handler_order</span>
-
-
-<span class="k">class</span> <span class="nc">HTTPErrorProcessor</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Process HTTP error responses.&quot;&quot;&quot;</span>
- <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">1000</span> <span class="c1"># after all other processing</span>
-
- <span class="k">def</span> <span class="nf">http_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
- <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">code</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">info</span><span class="p">()</span>
-
- <span class="c1"># According to RFC 2616, &quot;2xx&quot; code indicates that the client&#39;s</span>
- <span class="c1"># request was successfully received, understood, and accepted.</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">200</span> <span class="o">&lt;=</span> <span class="n">code</span> <span class="o">&lt;</span> <span class="mi">300</span><span class="p">):</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
- <span class="s1">&#39;http&#39;</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">)</span>
-
- <span class="k">return</span> <span class="n">response</span>
-
- <span class="n">https_response</span> <span class="o">=</span> <span class="n">http_response</span>
-
-<span class="k">class</span> <span class="nc">HTTPDefaultErrorHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">http_error_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">):</span>
- <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">(),</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">hdrs</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
-
-<span class="k">class</span> <span class="nc">HTTPRedirectHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="c1"># maximum number of redirections to any single URL</span>
- <span class="c1"># this is needed because of the state that cookies introduce</span>
- <span class="n">max_repeats</span> <span class="o">=</span> <span class="mi">4</span>
- <span class="c1"># maximum total number of redirections (regardless of URL) before</span>
- <span class="c1"># assuming we&#39;re in a loop</span>
- <span class="n">max_redirections</span> <span class="o">=</span> <span class="mi">10</span>
-
- <span class="k">def</span> <span class="nf">redirect_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">newurl</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Return a Request or None in response to a redirect.</span>
-
-<span class="sd"> This is called by the http_error_30x methods when a</span>
-<span class="sd"> redirection response is received. If a redirection should</span>
-<span class="sd"> take place, return a new Request to allow http_error_30x to</span>
-<span class="sd"> perform the redirect. Otherwise, raise HTTPError if no-one</span>
-<span class="sd"> else should try to handle this url. Return None if you can&#39;t</span>
-<span class="sd"> but another Handler might.</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">m</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">()</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">301</span><span class="p">,</span> <span class="mi">302</span><span class="p">,</span> <span class="mi">303</span><span class="p">,</span> <span class="mi">307</span><span class="p">)</span> <span class="ow">and</span> <span class="n">m</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="s2">&quot;HEAD&quot;</span><span class="p">)</span>
- <span class="ow">or</span> <span class="n">code</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">301</span><span class="p">,</span> <span class="mi">302</span><span class="p">,</span> <span class="mi">303</span><span class="p">)</span> <span class="ow">and</span> <span class="n">m</span> <span class="o">==</span> <span class="s2">&quot;POST&quot;</span><span class="p">):</span>
- <span class="c1"># Strictly (according to RFC 2616), 301 or 302 in response</span>
- <span class="c1"># to a POST MUST NOT cause a redirection without confirmation</span>
- <span class="c1"># from the user (of urllib2, in this case). In practice,</span>
- <span class="c1"># essentially all clients do redirect in this case, so we</span>
- <span class="c1"># do the same.</span>
- <span class="c1"># be conciliant with URIs containing a space</span>
- <span class="n">newurl</span> <span class="o">=</span> <span class="n">newurl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;%20&#39;</span><span class="p">)</span>
- <span class="n">newheaders</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">k</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">&quot;content-length&quot;</span><span class="p">,</span> <span class="s2">&quot;content-type&quot;</span><span class="p">)</span>
- <span class="p">)</span>
- <span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span>
- <span class="n">headers</span><span class="o">=</span><span class="n">newheaders</span><span class="p">,</span>
- <span class="n">origin_req_host</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">get_origin_req_host</span><span class="p">(),</span>
- <span class="n">unverifiable</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">(),</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
-
- <span class="c1"># Implementation note: To avoid the server sending us into an</span>
- <span class="c1"># infinite loop, the request object needs to track what URLs we</span>
- <span class="c1"># have already seen. Do this by adding a handler-specific</span>
- <span class="c1"># attribute to the Request object.</span>
- <span class="k">def</span> <span class="nf">http_error_302</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="c1"># Some servers (incorrectly) return multiple Location headers</span>
- <span class="c1"># (so probably same goes for URI). Use first header.</span>
- <span class="k">if</span> <span class="s1">&#39;location&#39;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
- <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">getheaders</span><span class="p">(</span><span class="s1">&#39;location&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
- <span class="k">elif</span> <span class="s1">&#39;uri&#39;</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
- <span class="n">newurl</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">getheaders</span><span class="p">(</span><span class="s1">&#39;uri&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span>
-
- <span class="c1"># fix a possible malformed URL</span>
- <span class="n">urlparts</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">newurl</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">path</span> <span class="ow">and</span> <span class="n">urlparts</span><span class="o">.</span><span class="n">netloc</span><span class="p">:</span>
- <span class="n">urlparts</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">urlparts</span><span class="p">)</span>
- <span class="n">urlparts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;/&quot;</span>
- <span class="n">newurl</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlunparse</span><span class="p">(</span><span class="n">urlparts</span><span class="p">)</span>
-
- <span class="n">newurl</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urljoin</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">(),</span> <span class="n">newurl</span><span class="p">)</span>
-
- <span class="c1"># For security reasons we do not allow redirects to protocols</span>
- <span class="c1"># other than HTTP, HTTPS or FTP.</span>
- <span class="n">newurl_lower</span> <span class="o">=</span> <span class="n">newurl</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">newurl_lower</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;http://&#39;</span><span class="p">)</span> <span class="ow">or</span>
- <span class="n">newurl_lower</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">)</span> <span class="ow">or</span>
- <span class="n">newurl_lower</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;ftp://&#39;</span><span class="p">)):</span>
- <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span>
- <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot; - Redirection to url &#39;</span><span class="si">%s</span><span class="s2">&#39; is not allowed&quot;</span> <span class="o">%</span>
- <span class="n">newurl</span><span class="p">,</span>
- <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
-
- <span class="c1"># XXX Probably want to forget about the state of the current</span>
- <span class="c1"># request, although that might interact poorly with other</span>
- <span class="c1"># handlers that also use handler-specific request attributes</span>
- <span class="n">new</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">redirect_request</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">newurl</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">new</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span>
-
- <span class="c1"># loop detection</span>
- <span class="c1"># .redirect_dict has a key url if url was previously visited.</span>
- <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="s1">&#39;redirect_dict&#39;</span><span class="p">):</span>
- <span class="n">visited</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">redirect_dict</span>
- <span class="k">if</span> <span class="p">(</span><span class="n">visited</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_repeats</span> <span class="ow">or</span>
- <span class="nb">len</span><span class="p">(</span><span class="n">visited</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_redirections</span><span class="p">):</span>
- <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">(),</span> <span class="n">code</span><span class="p">,</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">inf_msg</span> <span class="o">+</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">fp</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">visited</span> <span class="o">=</span> <span class="n">new</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">redirect_dict</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="n">visited</span><span class="p">[</span><span class="n">newurl</span><span class="p">]</span> <span class="o">=</span> <span class="n">visited</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">newurl</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
-
- <span class="c1"># Don&#39;t close the fp until we are sure that we won&#39;t use it</span>
- <span class="c1"># with HTTPError.</span>
- <span class="n">fp</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
- <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">new</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
-
- <span class="n">http_error_301</span> <span class="o">=</span> <span class="n">http_error_303</span> <span class="o">=</span> <span class="n">http_error_307</span> <span class="o">=</span> <span class="n">http_error_302</span>
-
- <span class="n">inf_msg</span> <span class="o">=</span> <span class="s2">&quot;The HTTP server returned a redirect error that would &quot;</span> \
- <span class="s2">&quot;lead to an infinite loop.</span><span class="se">\n</span><span class="s2">&quot;</span> \
- <span class="s2">&quot;The last 30x error message was:</span><span class="se">\n</span><span class="s2">&quot;</span>
-
-
-<span class="k">def</span> <span class="nf">_parse_proxy</span><span class="p">(</span><span class="n">proxy</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Return (scheme, user, password, host/port) given a URL or an authority.</span>
-
-<span class="sd"> If a URL is supplied, it must have an authority (host:port) component.</span>
-<span class="sd"> According to RFC 3986, having an authority component means the URL must</span>
-<span class="sd"> have two slashes after the scheme:</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;file:/ftp.example.com/&#39;)</span>
-<span class="sd"> Traceback (most recent call last):</span>
-<span class="sd"> ValueError: proxy URL with no authority: &#39;file:/ftp.example.com/&#39;</span>
-
-<span class="sd"> The first three items of the returned tuple may be None.</span>
-
-<span class="sd"> Examples of authority parsing:</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;proxy.example.com&#39;)</span>
-<span class="sd"> (None, None, None, &#39;proxy.example.com&#39;)</span>
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;proxy.example.com:3128&#39;)</span>
-<span class="sd"> (None, None, None, &#39;proxy.example.com:3128&#39;)</span>
-
-<span class="sd"> The authority component may optionally include userinfo (assumed to be</span>
-<span class="sd"> username:password):</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;joe:password@proxy.example.com&#39;)</span>
-<span class="sd"> (None, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com&#39;)</span>
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;joe:password@proxy.example.com:3128&#39;)</span>
-<span class="sd"> (None, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com:3128&#39;)</span>
-
-<span class="sd"> Same examples, but with URLs instead:</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;http://proxy.example.com/&#39;)</span>
-<span class="sd"> (&#39;http&#39;, None, None, &#39;proxy.example.com&#39;)</span>
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;http://proxy.example.com:3128/&#39;)</span>
-<span class="sd"> (&#39;http&#39;, None, None, &#39;proxy.example.com:3128&#39;)</span>
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;http://joe:password@proxy.example.com/&#39;)</span>
-<span class="sd"> (&#39;http&#39;, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com&#39;)</span>
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;http://joe:password@proxy.example.com:3128&#39;)</span>
-<span class="sd"> (&#39;http&#39;, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com:3128&#39;)</span>
-
-<span class="sd"> Everything after the authority is ignored:</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;ftp://joe:password@proxy.example.com/rubbish:3128&#39;)</span>
-<span class="sd"> (&#39;ftp&#39;, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com&#39;)</span>
-
-<span class="sd"> Test for no trailing &#39;/&#39; case:</span>
-
-<span class="sd"> &gt;&gt;&gt; _parse_proxy(&#39;http://joe:password@proxy.example.com&#39;)</span>
-<span class="sd"> (&#39;http&#39;, &#39;joe&#39;, &#39;password&#39;, &#39;proxy.example.com&#39;)</span>
-
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">scheme</span><span class="p">,</span> <span class="n">r_scheme</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">):</span>
- <span class="c1"># authority</span>
- <span class="n">scheme</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="n">proxy</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># URL</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;//&quot;</span><span class="p">):</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;proxy URL with no authority: </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">proxy</span><span class="p">)</span>
- <span class="c1"># We have an authority, so for RFC 3986-compliant URLs (by ss 3.</span>
- <span class="c1"># and 3.3.), path is empty or starts with &#39;/&#39;</span>
- <span class="n">end</span> <span class="o">=</span> <span class="n">r_scheme</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">end</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
- <span class="n">end</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="n">r_scheme</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="n">end</span><span class="p">]</span>
- <span class="n">userinfo</span><span class="p">,</span> <span class="n">hostport</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">authority</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">userinfo</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">user</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">splitpasswd</span><span class="p">(</span><span class="n">userinfo</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">user</span> <span class="o">=</span> <span class="n">password</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">return</span> <span class="n">scheme</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">hostport</span>
-
-<span class="k">class</span> <span class="nc">ProxyHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="c1"># Proxies must be in front</span>
- <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">100</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">proxies</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">proxies</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">proxies</span> <span class="o">=</span> <span class="n">getproxies</span><span class="p">()</span>
- <span class="k">assert</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">proxies</span><span class="p">,</span> <span class="s1">&#39;has_key&#39;</span><span class="p">),</span> <span class="s2">&quot;proxies must be a mapping&quot;</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">proxies</span> <span class="o">=</span> <span class="n">proxies</span>
- <span class="k">for</span> <span class="nb">type</span><span class="p">,</span> <span class="n">url</span> <span class="ow">in</span> <span class="n">proxies</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">_open&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">,</span>
- <span class="k">lambda</span> <span class="n">r</span><span class="p">,</span> <span class="n">proxy</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span> <span class="n">meth</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">proxy_open</span><span class="p">:</span> \
- <span class="n">meth</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="nb">type</span><span class="p">))</span>
-
- <span class="k">def</span> <span class="nf">proxy_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">proxy</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
- <span class="n">orig_type</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_type</span><span class="p">()</span>
- <span class="n">proxy_type</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">hostport</span> <span class="o">=</span> <span class="n">_parse_proxy</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
-
- <span class="k">if</span> <span class="n">proxy_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">proxy_type</span> <span class="o">=</span> <span class="n">orig_type</span>
-
- <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
-
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="ow">and</span> <span class="n">proxy_bypass</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">host</span><span class="p">):</span>
- <span class="k">return</span> <span class="kc">None</span>
-
- <span class="k">if</span> <span class="n">user</span> <span class="ow">and</span> <span class="n">password</span><span class="p">:</span>
- <span class="n">user_pass</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">:</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">unquote</span><span class="p">(</span><span class="n">user</span><span class="p">),</span> <span class="n">unquote</span><span class="p">(</span><span class="n">password</span><span class="p">))</span>
- <span class="n">creds</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">user_pass</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
- <span class="n">req</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s1">&#39;Proxy-authorization&#39;</span><span class="p">,</span> <span class="s1">&#39;Basic &#39;</span> <span class="o">+</span> <span class="n">creds</span><span class="p">)</span>
- <span class="n">hostport</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">hostport</span><span class="p">)</span>
- <span class="n">req</span><span class="o">.</span><span class="n">set_proxy</span><span class="p">(</span><span class="n">hostport</span><span class="p">,</span> <span class="n">proxy_type</span><span class="p">)</span>
-
- <span class="k">if</span> <span class="n">orig_type</span> <span class="o">==</span> <span class="n">proxy_type</span> <span class="ow">or</span> <span class="n">orig_type</span> <span class="o">==</span> <span class="s1">&#39;https&#39;</span><span class="p">:</span>
- <span class="c1"># let other handlers take care of it</span>
- <span class="k">return</span> <span class="kc">None</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># need to start over, because the other handlers don&#39;t</span>
- <span class="c1"># grok the proxy&#39;s URL type</span>
- <span class="c1"># e.g. if we have a constructor arg proxies like so:</span>
- <span class="c1"># {&#39;http&#39;: &#39;ftp://proxy.example.com&#39;}, we may end up turning</span>
- <span class="c1"># a request for http://acme.example.com/a into one for</span>
- <span class="c1"># ftp://proxy.example.com/a</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
-
-<span class="k">class</span> <span class="nc">HTTPPasswordMgr</span><span class="p">:</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="p">{}</span>
-
- <span class="k">def</span> <span class="nf">add_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">):</span>
- <span class="c1"># uri could be a single URI or a sequence</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">basestring</span><span class="p">):</span>
- <span class="n">uri</span> <span class="o">=</span> <span class="p">[</span><span class="n">uri</span><span class="p">]</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">realm</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">[</span><span class="n">realm</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
- <span class="n">reduced_uri</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
- <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span> <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">uri</span><span class="p">])</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="p">[</span><span class="n">realm</span><span class="p">][</span><span class="n">reduced_uri</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">authuri</span><span class="p">):</span>
- <span class="n">domains</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="p">{})</span>
- <span class="k">for</span> <span class="n">default_port</span> <span class="ow">in</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">False</span><span class="p">:</span>
- <span class="n">reduced_authuri</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reduce_uri</span><span class="p">(</span><span class="n">authuri</span><span class="p">,</span> <span class="n">default_port</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">uris</span><span class="p">,</span> <span class="n">authinfo</span> <span class="ow">in</span> <span class="n">domains</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
- <span class="k">for</span> <span class="n">uri</span> <span class="ow">in</span> <span class="n">uris</span><span class="p">:</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_suburi</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">reduced_authuri</span><span class="p">):</span>
- <span class="k">return</span> <span class="n">authinfo</span>
- <span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
-
- <span class="k">def</span> <span class="nf">reduce_uri</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">default_port</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Accept authority or URI and extract only the authority and path.&quot;&quot;&quot;</span>
- <span class="c1"># note HTTP URLs do not have a userinfo component</span>
- <span class="n">parts</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlsplit</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
- <span class="c1"># URI</span>
- <span class="n">scheme</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
- <span class="n">path</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="ow">or</span> <span class="s1">&#39;/&#39;</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># host or host:port</span>
- <span class="n">scheme</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="n">uri</span>
- <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;/&#39;</span>
- <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">authority</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">default_port</span> <span class="ow">and</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">scheme</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">dport</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;http&quot;</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span>
- <span class="s2">&quot;https&quot;</span><span class="p">:</span> <span class="mi">443</span><span class="p">,</span>
- <span class="p">}</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">scheme</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">dport</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">dport</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">authority</span><span class="p">,</span> <span class="n">path</span>
-
- <span class="k">def</span> <span class="nf">is_suburi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base</span><span class="p">,</span> <span class="n">test</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Check if test is below base in a URI tree</span>
-
-<span class="sd"> Both args must be URIs in reduced form.</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="k">if</span> <span class="n">base</span> <span class="o">==</span> <span class="n">test</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">if</span> <span class="n">base</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">test</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
- <span class="k">return</span> <span class="kc">False</span>
- <span class="n">common</span> <span class="o">=</span> <span class="n">posixpath</span><span class="o">.</span><span class="n">commonprefix</span><span class="p">((</span><span class="n">base</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">test</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">common</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">base</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
- <span class="k">return</span> <span class="kc">True</span>
- <span class="k">return</span> <span class="kc">False</span>
-
-
-<span class="k">class</span> <span class="nc">HTTPPasswordMgrWithDefaultRealm</span><span class="p">(</span><span class="n">HTTPPasswordMgr</span><span class="p">):</span>
-
- <span class="k">def</span> <span class="nf">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">authuri</span><span class="p">):</span>
- <span class="n">user</span><span class="p">,</span> <span class="n">password</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span>
- <span class="n">authuri</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span>
- <span class="k">return</span> <span class="n">HTTPPasswordMgr</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">authuri</span><span class="p">)</span>
-
-
-<span class="k">class</span> <span class="nc">AbstractBasicAuthHandler</span><span class="p">:</span>
-
- <span class="c1"># XXX this allows for multiple auth-schemes, but will stupidly pick</span>
- <span class="c1"># the last one with a realm specified.</span>
-
- <span class="c1"># allow for double- and single-quoted realm values</span>
- <span class="c1"># (single quotes are a violation of the RFC, but appear in the wild)</span>
- <span class="n">rx</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;(?:.*,)*[ </span><span class="se">\t</span><span class="s1">]*([^ </span><span class="se">\t</span><span class="s1">]+)[ </span><span class="se">\t</span><span class="s1">]+&#39;</span>
- <span class="s1">&#39;realm=([&quot;</span><span class="se">\&#39;</span><span class="s1">]?)([^&quot;</span><span class="se">\&#39;</span><span class="s1">]*)</span><span class="se">\\</span><span class="s1">2&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">I</span><span class="p">)</span>
-
- <span class="c1"># XXX could pre-emptively send auth info already accepted (RFC 2617,</span>
- <span class="c1"># end of section 2, and section 1.2 immediately after &quot;credentials&quot;</span>
- <span class="c1"># production).</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">password_mgr</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">password_mgr</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">password_mgr</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="n">password_mgr</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">add_password</span>
-
-
- <span class="k">def</span> <span class="nf">http_error_auth_reqed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">authreq</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="c1"># host may be an authority (without userinfo) or a URL with an</span>
- <span class="c1"># authority</span>
- <span class="c1"># XXX could be multiple headers</span>
- <span class="n">authreq</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">authreq</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
-
- <span class="k">if</span> <span class="n">authreq</span><span class="p">:</span>
- <span class="n">mo</span> <span class="o">=</span> <span class="n">AbstractBasicAuthHandler</span><span class="o">.</span><span class="n">rx</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">authreq</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">mo</span><span class="p">:</span>
- <span class="n">scheme</span><span class="p">,</span> <span class="n">quote</span><span class="p">,</span> <span class="n">realm</span> <span class="o">=</span> <span class="n">mo</span><span class="o">.</span><span class="n">groups</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">quote</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;&quot;&#39;</span><span class="p">,</span> <span class="s2">&quot;&#39;&quot;</span><span class="p">]:</span>
- <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Basic Auth Realm was unquoted&quot;</span><span class="p">,</span>
- <span class="ne">UserWarning</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;basic&#39;</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retry_http_basic_auth</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">realm</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">retry_http_basic_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">realm</span><span class="p">):</span>
- <span class="n">user</span><span class="p">,</span> <span class="n">pw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">host</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">pw</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">raw</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span>
- <span class="n">auth</span> <span class="o">=</span> <span class="s1">&#39;Basic </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">base64</span><span class="o">.</span><span class="n">b64encode</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">auth</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
- <span class="n">req</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="n">auth</span><span class="p">)</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
-
-
-<span class="k">class</span> <span class="nc">HTTPBasicAuthHandler</span><span class="p">(</span><span class="n">AbstractBasicAuthHandler</span><span class="p">,</span> <span class="n">BaseHandler</span><span class="p">):</span>
-
- <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Authorization&#39;</span>
-
- <span class="k">def</span> <span class="nf">http_error_401</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">()</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;www-authenticate&#39;</span><span class="p">,</span>
- <span class="n">url</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">response</span>
-
-
-<span class="k">class</span> <span class="nc">ProxyBasicAuthHandler</span><span class="p">(</span><span class="n">AbstractBasicAuthHandler</span><span class="p">,</span> <span class="n">BaseHandler</span><span class="p">):</span>
-
- <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Proxy-authorization&#39;</span>
-
- <span class="k">def</span> <span class="nf">http_error_407</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="c1"># http_error_auth_reqed requires that there is no userinfo component in</span>
- <span class="c1"># authority. Assume there isn&#39;t one, since urllib2 does not (and</span>
- <span class="c1"># should not, RFC 3986 s. 3.2.1) support requests for URLs containing</span>
- <span class="c1"># userinfo.</span>
- <span class="n">authority</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="n">response</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;proxy-authenticate&#39;</span><span class="p">,</span>
- <span class="n">authority</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">response</span>
-
-
-<span class="k">def</span> <span class="nf">randombytes</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Return n random bytes.&quot;&quot;&quot;</span>
- <span class="c1"># Use /dev/urandom if it is available. Fall back to random module</span>
- <span class="c1"># if not. It might be worthwhile to extend this function to use</span>
- <span class="c1"># other platform-specific mechanisms for getting random bytes.</span>
- <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;/dev/urandom&quot;</span><span class="p">):</span>
- <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;/dev/urandom&quot;</span><span class="p">)</span>
- <span class="n">s</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
- <span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">s</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">L</span> <span class="o">=</span> <span class="p">[</span><span class="nb">chr</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">randrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">256</span><span class="p">))</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">)]</span>
- <span class="k">return</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">L</span><span class="p">)</span>
-
-<span class="k">class</span> <span class="nc">AbstractDigestAuthHandler</span><span class="p">:</span>
- <span class="c1"># Digest authentication is specified in RFC 2617.</span>
-
- <span class="c1"># XXX The client does not inspect the Authentication-Info header</span>
- <span class="c1"># in a successful response.</span>
-
- <span class="c1"># XXX It should be possible to test this implementation against</span>
- <span class="c1"># a mock server that just generates a static set of challenges.</span>
-
- <span class="c1"># XXX qop=&quot;auth-int&quot; supports is shaky</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">passwd</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">passwd</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">passwd</span> <span class="o">=</span> <span class="n">HTTPPasswordMgr</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span> <span class="o">=</span> <span class="n">passwd</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">add_password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">add_password</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span> <span class="o">=</span> <span class="kc">None</span>
-
- <span class="k">def</span> <span class="nf">reset_retry_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">=</span> <span class="mi">0</span>
-
- <span class="k">def</span> <span class="nf">http_error_auth_reqed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_header</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="n">authreq</span> <span class="o">=</span> <span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">:</span>
- <span class="c1"># Don&#39;t fail endlessly - if we failed once, we&#39;ll probably</span>
- <span class="c1"># fail a second time. Hm. Unless the Password Manager is</span>
- <span class="c1"># prompting for the information. Crap. This isn&#39;t great</span>
- <span class="c1"># but it&#39;s better than the current &#39;repeat until recursion</span>
- <span class="c1"># depth exceeded&#39; approach &lt;wink&gt;</span>
- <span class="k">raise</span> <span class="n">HTTPError</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">(),</span> <span class="mi">401</span><span class="p">,</span> <span class="s2">&quot;digest auth failed&quot;</span><span class="p">,</span>
- <span class="n">headers</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">retried</span> <span class="o">+=</span> <span class="mi">1</span>
- <span class="k">if</span> <span class="n">authreq</span><span class="p">:</span>
- <span class="n">scheme</span> <span class="o">=</span> <span class="n">authreq</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">scheme</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;digest&#39;</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retry_http_digest_auth</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">authreq</span><span class="p">)</span>
-
- <span class="k">def</span> <span class="nf">retry_http_digest_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">auth</span><span class="p">):</span>
- <span class="n">token</span><span class="p">,</span> <span class="n">challenge</span> <span class="o">=</span> <span class="n">auth</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
- <span class="n">chal</span> <span class="o">=</span> <span class="n">parse_keqv_list</span><span class="p">(</span><span class="n">parse_http_list</span><span class="p">(</span><span class="n">challenge</span><span class="p">))</span>
- <span class="n">auth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_authorization</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">chal</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">auth</span><span class="p">:</span>
- <span class="n">auth_val</span> <span class="o">=</span> <span class="s1">&#39;Digest </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">auth</span>
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">auth_val</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
- <span class="n">req</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">auth_header</span><span class="p">,</span> <span class="n">auth_val</span><span class="p">)</span>
- <span class="n">resp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">resp</span>
-
- <span class="k">def</span> <span class="nf">get_cnonce</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nonce</span><span class="p">):</span>
- <span class="c1"># The cnonce-value is an opaque</span>
- <span class="c1"># quoted string value provided by the client and used by both client</span>
- <span class="c1"># and server to avoid chosen plaintext attacks, to provide mutual</span>
- <span class="c1"># authentication, and to provide some message integrity protection.</span>
- <span class="c1"># This isn&#39;t a fabulous effort, but it&#39;s probably Good Enough.</span>
- <span class="n">dig</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span><span class="p">,</span> <span class="n">nonce</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">ctime</span><span class="p">(),</span>
- <span class="n">randombytes</span><span class="p">(</span><span class="mi">8</span><span class="p">)))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">dig</span><span class="p">[:</span><span class="mi">16</span><span class="p">]</span>
-
- <span class="k">def</span> <span class="nf">get_authorization</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">chal</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">realm</span> <span class="o">=</span> <span class="n">chal</span><span class="p">[</span><span class="s1">&#39;realm&#39;</span><span class="p">]</span>
- <span class="n">nonce</span> <span class="o">=</span> <span class="n">chal</span><span class="p">[</span><span class="s1">&#39;nonce&#39;</span><span class="p">]</span>
- <span class="n">qop</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;qop&#39;</span><span class="p">)</span>
- <span class="n">algorithm</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;algorithm&#39;</span><span class="p">,</span> <span class="s1">&#39;MD5&#39;</span><span class="p">)</span>
- <span class="c1"># mod_digest doesn&#39;t send an opaque, even though it isn&#39;t</span>
- <span class="c1"># supposed to be optional</span>
- <span class="n">opaque</span> <span class="o">=</span> <span class="n">chal</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;opaque&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
-
- <span class="n">H</span><span class="p">,</span> <span class="n">KD</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_algorithm_impls</span><span class="p">(</span><span class="n">algorithm</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">H</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
-
- <span class="n">user</span><span class="p">,</span> <span class="n">pw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">passwd</span><span class="o">.</span><span class="n">find_user_password</span><span class="p">(</span><span class="n">realm</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">user</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
-
- <span class="c1"># XXX not implemented yet</span>
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">has_data</span><span class="p">():</span>
- <span class="n">entdig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_entity_digest</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_data</span><span class="p">(),</span> <span class="n">chal</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">entdig</span> <span class="o">=</span> <span class="kc">None</span>
-
- <span class="n">A1</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span>
- <span class="n">A2</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">(),</span>
- <span class="c1"># XXX selector: what about proxies and full urls</span>
- <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">())</span>
- <span class="k">if</span> <span class="n">qop</span> <span class="o">==</span> <span class="s1">&#39;auth&#39;</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">nonce</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">+=</span> <span class="mi">1</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span> <span class="o">=</span> <span class="mi">1</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">last_nonce</span> <span class="o">=</span> <span class="n">nonce</span>
-
- <span class="n">ncvalue</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">nonce_count</span>
- <span class="n">cnonce</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cnonce</span><span class="p">(</span><span class="n">nonce</span><span class="p">)</span>
- <span class="n">noncebit</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nonce</span><span class="p">,</span> <span class="n">ncvalue</span><span class="p">,</span> <span class="n">cnonce</span><span class="p">,</span> <span class="n">qop</span><span class="p">,</span> <span class="n">H</span><span class="p">(</span><span class="n">A2</span><span class="p">))</span>
- <span class="n">respdig</span> <span class="o">=</span> <span class="n">KD</span><span class="p">(</span><span class="n">H</span><span class="p">(</span><span class="n">A1</span><span class="p">),</span> <span class="n">noncebit</span><span class="p">)</span>
- <span class="k">elif</span> <span class="n">qop</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">respdig</span> <span class="o">=</span> <span class="n">KD</span><span class="p">(</span><span class="n">H</span><span class="p">(</span><span class="n">A1</span><span class="p">),</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">nonce</span><span class="p">,</span> <span class="n">H</span><span class="p">(</span><span class="n">A2</span><span class="p">)))</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="c1"># XXX handle auth-int.</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s2">&quot;qop &#39;</span><span class="si">%s</span><span class="s2">&#39; is not supported.&quot;</span> <span class="o">%</span> <span class="n">qop</span><span class="p">)</span>
-
- <span class="c1"># XXX should the partial digests be encoded too?</span>
-
- <span class="n">base</span> <span class="o">=</span> <span class="s1">&#39;username=&quot;</span><span class="si">%s</span><span class="s1">&quot;, realm=&quot;</span><span class="si">%s</span><span class="s1">&quot;, nonce=&quot;</span><span class="si">%s</span><span class="s1">&quot;, uri=&quot;</span><span class="si">%s</span><span class="s1">&quot;, &#39;</span> \
- <span class="s1">&#39;response=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">nonce</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">(),</span>
- <span class="n">respdig</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">opaque</span><span class="p">:</span>
- <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, opaque=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">opaque</span>
- <span class="k">if</span> <span class="n">entdig</span><span class="p">:</span>
- <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, digest=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">entdig</span>
- <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, algorithm=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">algorithm</span>
- <span class="k">if</span> <span class="n">qop</span><span class="p">:</span>
- <span class="n">base</span> <span class="o">+=</span> <span class="s1">&#39;, qop=auth, nc=</span><span class="si">%s</span><span class="s1">, cnonce=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ncvalue</span><span class="p">,</span> <span class="n">cnonce</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">base</span>
-
- <span class="k">def</span> <span class="nf">get_algorithm_impls</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">algorithm</span><span class="p">):</span>
- <span class="c1"># algorithm should be case-insensitive according to RFC2617</span>
- <span class="n">algorithm</span> <span class="o">=</span> <span class="n">algorithm</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
- <span class="c1"># lambdas assume digest modules are imported at the top level</span>
- <span class="k">if</span> <span class="n">algorithm</span> <span class="o">==</span> <span class="s1">&#39;MD5&#39;</span><span class="p">:</span>
- <span class="n">H</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">md5</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
- <span class="k">elif</span> <span class="n">algorithm</span> <span class="o">==</span> <span class="s1">&#39;SHA&#39;</span><span class="p">:</span>
- <span class="n">H</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha1</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
- <span class="c1"># XXX MD5-sess</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unsupported digest authentication &quot;</span>
- <span class="s2">&quot;algorithm </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">algorithm</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
- <span class="n">KD</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">:</span> <span class="n">H</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">d</span><span class="p">))</span>
- <span class="k">return</span> <span class="n">H</span><span class="p">,</span> <span class="n">KD</span>
-
- <span class="k">def</span> <span class="nf">get_entity_digest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">chal</span><span class="p">):</span>
- <span class="c1"># XXX not implemented yet</span>
- <span class="k">return</span> <span class="kc">None</span>
-
-
-<span class="k">class</span> <span class="nc">HTTPDigestAuthHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">,</span> <span class="n">AbstractDigestAuthHandler</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;An authentication protocol defined by RFC 2069</span>
-
-<span class="sd"> Digest authentication improves on basic authentication because it</span>
-<span class="sd"> does not transmit passwords in the clear.</span>
-<span class="sd"> &quot;&quot;&quot;</span>
-
- <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Authorization&#39;</span>
- <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">490</span> <span class="c1"># before Basic auth</span>
-
- <span class="k">def</span> <span class="nf">http_error_401</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">urlparse</span><span class="o">.</span><span class="n">urlparse</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())[</span><span class="mi">1</span><span class="p">]</span>
- <span class="n">retry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;www-authenticate&#39;</span><span class="p">,</span>
- <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">reset_retry_count</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">retry</span>
-
-
-<span class="k">class</span> <span class="nc">ProxyDigestAuthHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">,</span> <span class="n">AbstractDigestAuthHandler</span><span class="p">):</span>
-
- <span class="n">auth_header</span> <span class="o">=</span> <span class="s1">&#39;Proxy-Authorization&#39;</span>
- <span class="n">handler_order</span> <span class="o">=</span> <span class="mi">490</span> <span class="c1"># before Basic auth</span>
-
- <span class="k">def</span> <span class="nf">http_error_407</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">code</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="n">retry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_error_auth_reqed</span><span class="p">(</span><span class="s1">&#39;proxy-authenticate&#39;</span><span class="p">,</span>
- <span class="n">host</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">reset_retry_count</span><span class="p">()</span>
- <span class="k">return</span> <span class="n">retry</span>
-
-<span class="k">class</span> <span class="nc">AbstractHTTPHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span> <span class="o">=</span> <span class="n">debuglevel</span>
-
- <span class="k">def</span> <span class="nf">set_http_debuglevel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span> <span class="o">=</span> <span class="n">level</span>
-
- <span class="k">def</span> <span class="nf">do_request_</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
-
- <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">has_data</span><span class="p">():</span> <span class="c1"># POST</span>
- <span class="n">data</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">get_data</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Content-type&#39;</span><span class="p">):</span>
- <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span>
- <span class="s1">&#39;Content-type&#39;</span><span class="p">,</span>
- <span class="s1">&#39;application/x-www-form-urlencoded&#39;</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Content-length&#39;</span><span class="p">):</span>
- <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span>
- <span class="s1">&#39;Content-length&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
-
- <span class="n">sel_host</span> <span class="o">=</span> <span class="n">host</span>
- <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">has_proxy</span><span class="p">():</span>
- <span class="n">scheme</span><span class="p">,</span> <span class="n">sel</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">get_selector</span><span class="p">())</span>
- <span class="n">sel_host</span><span class="p">,</span> <span class="n">sel_path</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span>
-
- <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="s1">&#39;Host&#39;</span><span class="p">):</span>
- <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="s1">&#39;Host&#39;</span><span class="p">,</span> <span class="n">sel_host</span><span class="p">)</span>
- <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">addheaders</span><span class="p">:</span>
- <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">capitalize</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">request</span><span class="o">.</span><span class="n">has_header</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
- <span class="n">request</span><span class="o">.</span><span class="n">add_unredirected_header</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
-
- <span class="k">return</span> <span class="n">request</span>
-
- <span class="k">def</span> <span class="nf">do_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">http_class</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span> <span class="o">**</span><span class="n">http_conn_args</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Return an addinfourl object for the request, using http_class.</span>
-
-<span class="sd"> http_class must implement the HTTPConnection API from httplib.</span>
-<span class="sd"> The addinfourl return value is a file-like object. It also</span>
-<span class="sd"> has methods and attributes including:</span>
-<span class="sd"> - info(): return a mimetools.Message object for the headers</span>
-<span class="sd"> - geturl(): return the original request URL</span>
-<span class="sd"> - code: HTTP status code</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
-
- <span class="c1"># will parse host:port</span>
- <span class="n">h</span> <span class="o">=</span> <span class="n">http_class</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">,</span> <span class="o">**</span><span class="n">http_conn_args</span><span class="p">)</span>
- <span class="n">h</span><span class="o">.</span><span class="n">set_debuglevel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span><span class="p">)</span>
-
- <span class="n">headers</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">)</span>
- <span class="n">headers</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">dict</span><span class="p">((</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">))</span>
-
- <span class="c1"># We want to make an HTTP/1.1 request, but the addinfourl</span>
- <span class="c1"># class isn&#39;t prepared to deal with a persistent connection.</span>
- <span class="c1"># It will try to read all remaining data from the socket,</span>
- <span class="c1"># which will block while the server waits for the next request.</span>
- <span class="c1"># So make sure the connection gets closed after the (only)</span>
- <span class="c1"># request.</span>
- <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Connection&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;close&quot;</span>
- <span class="n">headers</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
- <span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">title</span><span class="p">(),</span> <span class="n">val</span><span class="p">)</span> <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">headers</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
-
- <span class="k">if</span> <span class="n">req</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">:</span>
- <span class="n">tunnel_headers</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="n">proxy_auth_hdr</span> <span class="o">=</span> <span class="s2">&quot;Proxy-Authorization&quot;</span>
- <span class="k">if</span> <span class="n">proxy_auth_hdr</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span>
- <span class="n">tunnel_headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span>
- <span class="c1"># Proxy-Authorization should not be sent to origin</span>
- <span class="c1"># server.</span>
- <span class="k">del</span> <span class="n">headers</span><span class="p">[</span><span class="n">proxy_auth_hdr</span><span class="p">]</span>
- <span class="n">h</span><span class="o">.</span><span class="n">set_tunnel</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">_tunnel_host</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">tunnel_headers</span><span class="p">)</span>
-
- <span class="k">try</span><span class="p">:</span>
- <span class="n">h</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">(),</span> <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">(),</span> <span class="n">req</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">err</span><span class="p">:</span> <span class="c1"># XXX what error?</span>
- <span class="n">h</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">r</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getresponse</span><span class="p">(</span><span class="n">buffering</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span> <span class="c1"># buffering kw not supported</span>
- <span class="n">r</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getresponse</span><span class="p">()</span>
-
- <span class="c1"># Pick apart the HTTPResponse object to get the addinfourl</span>
- <span class="c1"># object initialized properly.</span>
-
- <span class="c1"># Wrap the HTTPResponse object in socket&#39;s file object adapter</span>
- <span class="c1"># for Windows. That adapter calls recv(), so delegate recv()</span>
- <span class="c1"># to read(). This weird wrapping allows the returned object to</span>
- <span class="c1"># have readline() and readlines() methods.</span>
-
- <span class="c1"># XXX It might be better to extract the read buffering code</span>
- <span class="c1"># out of socket._fileobject() and into a base class.</span>
-
- <span class="n">r</span><span class="o">.</span><span class="n">recv</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">read</span>
- <span class="n">fp</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">_fileobject</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">close</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-
- <span class="n">resp</span> <span class="o">=</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())</span>
- <span class="n">resp</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">status</span>
- <span class="n">resp</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">reason</span>
- <span class="k">return</span> <span class="n">resp</span>
-
-
-<span class="k">class</span> <span class="nc">HTTPHandler</span><span class="p">(</span><span class="n">AbstractHTTPHandler</span><span class="p">):</span>
-
- <span class="k">def</span> <span class="nf">http_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_open</span><span class="p">(</span><span class="n">httplib</span><span class="o">.</span><span class="n">HTTPConnection</span><span class="p">,</span> <span class="n">req</span><span class="p">)</span>
-
- <span class="n">http_request</span> <span class="o">=</span> <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">do_request_</span>
-
-<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">httplib</span><span class="p">,</span> <span class="s1">&#39;HTTPS&#39;</span><span class="p">):</span>
- <span class="k">class</span> <span class="nc">HTTPSHandler</span><span class="p">(</span><span class="n">AbstractHTTPHandler</span><span class="p">):</span>
-
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">debuglevel</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">_context</span> <span class="o">=</span> <span class="n">context</span>
-
- <span class="k">def</span> <span class="nf">https_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">do_open</span><span class="p">(</span><span class="n">httplib</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span>
- <span class="n">context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_context</span><span class="p">)</span>
-
- <span class="n">https_request</span> <span class="o">=</span> <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">do_request_</span>
-
-<span class="k">class</span> <span class="nc">HTTPCookieProcessor</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookiejar</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
- <span class="kn">import</span> <span class="nn">cookielib</span>
- <span class="k">if</span> <span class="n">cookiejar</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">cookiejar</span> <span class="o">=</span> <span class="n">cookielib</span><span class="o">.</span><span class="n">CookieJar</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span> <span class="o">=</span> <span class="n">cookiejar</span>
-
- <span class="k">def</span> <span class="nf">http_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">add_cookie_header</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">request</span>
-
- <span class="k">def</span> <span class="nf">http_response</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">response</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">extract_cookies</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">response</span>
-
- <span class="n">https_request</span> <span class="o">=</span> <span class="n">http_request</span>
- <span class="n">https_response</span> <span class="o">=</span> <span class="n">http_response</span>
-
-<span class="k">class</span> <span class="nc">UnknownHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">unknown_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="nb">type</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_type</span><span class="p">()</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;unknown url type: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">)</span>
-
-<span class="k">def</span> <span class="nf">parse_keqv_list</span><span class="p">(</span><span class="n">l</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Parse list of key=value strings where keys are not duplicated.&quot;&quot;&quot;</span>
- <span class="n">parsed</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="k">for</span> <span class="n">elt</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
- <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">elt</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span> <span class="ow">and</span> <span class="n">v</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
- <span class="n">v</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
- <span class="n">parsed</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
- <span class="k">return</span> <span class="n">parsed</span>
-
-<span class="k">def</span> <span class="nf">parse_http_list</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
- <span class="sd">&quot;&quot;&quot;Parse lists as described by RFC 2068 Section 2.</span>
-
-<span class="sd"> In particular, parse comma-separated lists where the elements of</span>
-<span class="sd"> the list may include quoted-strings. A quoted-string could</span>
-<span class="sd"> contain a comma. A non-quoted string could have quotes in the</span>
-<span class="sd"> middle. Neither commas nor quotes count if they are escaped.</span>
-<span class="sd"> Only double-quotes count, not single-quotes.</span>
-<span class="sd"> &quot;&quot;&quot;</span>
- <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
- <span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
-
- <span class="n">escape</span> <span class="o">=</span> <span class="n">quote</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">for</span> <span class="n">cur</span> <span class="ow">in</span> <span class="n">s</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">escape</span><span class="p">:</span>
- <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
- <span class="n">escape</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="k">continue</span>
- <span class="k">if</span> <span class="n">quote</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">:</span>
- <span class="n">escape</span> <span class="o">=</span> <span class="kc">True</span>
- <span class="k">continue</span>
- <span class="k">elif</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
- <span class="n">quote</span> <span class="o">=</span> <span class="kc">False</span>
- <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
- <span class="k">continue</span>
-
- <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;,&#39;</span><span class="p">:</span>
- <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
- <span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
- <span class="k">continue</span>
-
- <span class="k">if</span> <span class="n">cur</span> <span class="o">==</span> <span class="s1">&#39;&quot;&#39;</span><span class="p">:</span>
- <span class="n">quote</span> <span class="o">=</span> <span class="kc">True</span>
-
- <span class="n">part</span> <span class="o">+=</span> <span class="n">cur</span>
-
- <span class="c1"># append last part</span>
- <span class="k">if</span> <span class="n">part</span><span class="p">:</span>
- <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
-
- <span class="k">return</span> <span class="p">[</span><span class="n">part</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">res</span><span class="p">]</span>
-
-<span class="k">def</span> <span class="nf">_safe_gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="k">return</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
- <span class="k">return</span> <span class="kc">None</span>
-
-<span class="k">class</span> <span class="nc">FileHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="c1"># Use local file or FTP depending on form of URL</span>
- <span class="k">def</span> <span class="nf">file_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="n">url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">()</span>
- <span class="k">if</span> <span class="n">url</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;//&#39;</span> <span class="ow">and</span> <span class="n">url</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;/&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="ow">and</span>
- <span class="n">req</span><span class="o">.</span><span class="n">host</span> <span class="o">!=</span> <span class="s1">&#39;localhost&#39;</span><span class="p">):</span>
- <span class="n">req</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="s1">&#39;ftp&#39;</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_local_file</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
-
- <span class="c1"># names for the localhost</span>
- <span class="n">names</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="k">def</span> <span class="nf">get_names</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">if</span> <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span>
- <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">]</span> <span class="o">+</span>
- <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname_ex</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span><span class="p">())[</span><span class="mi">2</span><span class="p">])</span>
- <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
- <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span> <span class="o">=</span> <span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="s1">&#39;localhost&#39;</span><span class="p">),)</span>
- <span class="k">return</span> <span class="n">FileHandler</span><span class="o">.</span><span class="n">names</span>
-
- <span class="c1"># not entirely sure what the rules are here</span>
- <span class="k">def</span> <span class="nf">open_local_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="kn">import</span> <span class="nn">email.utils</span>
- <span class="kn">import</span> <span class="nn">mimetypes</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="n">filename</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">()</span>
- <span class="n">localfile</span> <span class="o">=</span> <span class="n">url2pathname</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">stats</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">stat</span><span class="p">(</span><span class="n">localfile</span><span class="p">)</span>
- <span class="n">size</span> <span class="o">=</span> <span class="n">stats</span><span class="o">.</span><span class="n">st_size</span>
- <span class="n">modified</span> <span class="o">=</span> <span class="n">email</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">formatdate</span><span class="p">(</span><span class="n">stats</span><span class="o">.</span><span class="n">st_mtime</span><span class="p">,</span> <span class="n">usegmt</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
- <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
- <span class="n">headers</span> <span class="o">=</span> <span class="n">mimetools</span><span class="o">.</span><span class="n">Message</span><span class="p">(</span><span class="n">StringIO</span><span class="p">(</span>
- <span class="s1">&#39;Content-type: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">Content-length: </span><span class="si">%d</span><span class="se">\n</span><span class="s1">Last-modified: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span>
- <span class="p">(</span><span class="n">mtype</span> <span class="ow">or</span> <span class="s1">&#39;text/plain&#39;</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">modified</span><span class="p">)))</span>
- <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
- <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span> <span class="ow">or</span> \
- <span class="p">(</span><span class="ow">not</span> <span class="n">port</span> <span class="ow">and</span> <span class="n">_safe_gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_names</span><span class="p">()):</span>
- <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
- <span class="n">origurl</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="n">filename</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">origurl</span> <span class="o">=</span> <span class="s1">&#39;file://&#39;</span> <span class="o">+</span> <span class="n">filename</span>
- <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">localfile</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">),</span> <span class="n">headers</span><span class="p">,</span> <span class="n">origurl</span><span class="p">)</span>
- <span class="k">except</span> <span class="ne">OSError</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
- <span class="c1"># urllib2 users shouldn&#39;t expect OSErrors coming from urlopen()</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;file not on local host&#39;</span><span class="p">)</span>
-
-<span class="k">class</span> <span class="nc">FTPHandler</span><span class="p">(</span><span class="n">BaseHandler</span><span class="p">):</span>
- <span class="k">def</span> <span class="nf">ftp_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
- <span class="kn">import</span> <span class="nn">ftplib</span>
- <span class="kn">import</span> <span class="nn">mimetypes</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
- <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;ftp error: no host given&#39;</span><span class="p">)</span>
- <span class="n">host</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="n">splitport</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">port</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">port</span> <span class="o">=</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">FTP_PORT</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
-
- <span class="c1"># username/password handling</span>
- <span class="n">user</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">user</span><span class="p">:</span>
- <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span> <span class="o">=</span> <span class="n">splitpasswd</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">passwd</span> <span class="o">=</span> <span class="kc">None</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="n">user</span> <span class="o">=</span> <span class="n">user</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
- <span class="n">passwd</span> <span class="o">=</span> <span class="n">passwd</span> <span class="ow">or</span> <span class="s1">&#39;&#39;</span>
-
- <span class="k">try</span><span class="p">:</span>
- <span class="n">host</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
- <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
- <span class="n">path</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="n">splitattr</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">())</span>
- <span class="n">dirs</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">)</span>
- <span class="n">dirs</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">unquote</span><span class="p">,</span> <span class="n">dirs</span><span class="p">)</span>
- <span class="n">dirs</span><span class="p">,</span> <span class="n">file</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">dirs</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">dirs</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
- <span class="n">dirs</span> <span class="o">=</span> <span class="n">dirs</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
- <span class="k">try</span><span class="p">:</span>
- <span class="n">fw</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connect_ftp</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
- <span class="nb">type</span> <span class="o">=</span> <span class="n">file</span> <span class="ow">and</span> <span class="s1">&#39;I&#39;</span> <span class="ow">or</span> <span class="s1">&#39;D&#39;</span>
- <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">:</span>
- <span class="n">attr</span><span class="p">,</span> <span class="n">value</span> <span class="o">=</span> <span class="n">splitvalue</span><span class="p">(</span><span class="n">attr</span><span class="p">)</span>
- <span class="k">if</span> <span class="n">attr</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;type&#39;</span> <span class="ow">and</span> \
- <span class="n">value</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span> <span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="s1">&#39;i&#39;</span><span class="p">,</span> <span class="s1">&#39;I&#39;</span><span class="p">,</span> <span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;D&#39;</span><span class="p">):</span>
- <span class="nb">type</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
- <span class="n">fp</span><span class="p">,</span> <span class="n">retrlen</span> <span class="o">=</span> <span class="n">fw</span><span class="o">.</span><span class="n">retrfile</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
- <span class="n">headers</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
- <span class="n">mtype</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())[</span><span class="mi">0</span><span class="p">]</span>
- <span class="k">if</span> <span class="n">mtype</span><span class="p">:</span>
- <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-type: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">mtype</span>
- <span class="k">if</span> <span class="n">retrlen</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">retrlen</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
- <span class="n">headers</span> <span class="o">+=</span> <span class="s2">&quot;Content-length: </span><span class="si">%d</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">retrlen</span>
- <span class="n">sf</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span>
- <span class="n">headers</span> <span class="o">=</span> <span class="n">mimetools</span><span class="o">.</span><span class="n">Message</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span>
- <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())</span>
- <span class="k">except</span> <span class="n">ftplib</span><span class="o">.</span><span class="n">all_errors</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
- <span class="k">raise</span> <span class="n">URLError</span><span class="p">,</span> <span class="p">(</span><span class="s1">&#39;ftp error: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">msg</span><span class="p">),</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">]</span>
-
- <span class="k">def</span> <span class="nf">connect_ftp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
- <span class="n">fw</span> <span class="o">=</span> <span class="n">ftpwrapper</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span>
- <span class="n">persistent</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
-<span class="c1">## fw.ftp.set_debuglevel(1)</span>
- <span class="k">return</span> <span class="n">fw</span>
-
-<span class="k">class</span> <span class="nc">CacheFTPHandler</span><span class="p">(</span><span class="n">FTPHandler</span><span class="p">):</span>
- <span class="c1"># XXX would be nice to have pluggable cache strategies</span>
- <span class="c1"># XXX this stuff is definitely not thread safe</span>
- <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cache</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="p">{}</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="mi">0</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">60</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span> <span class="o">=</span> <span class="mi">16</span>
-
- <span class="k">def</span> <span class="nf">setTimeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="n">t</span>
-
- <span class="k">def</span> <span class="nf">setMaxConns</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span> <span class="o">=</span> <span class="n">m</span>
-
- <span class="k">def</span> <span class="nf">connect_ftp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
- <span class="n">key</span> <span class="o">=</span> <span class="n">user</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirs</span><span class="p">),</span> <span class="n">timeout</span>
- <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">ftpwrapper</span><span class="p">(</span><span class="n">user</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">dirs</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">check_cache</span><span class="p">()</span>
- <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
-
- <span class="k">def</span> <span class="nf">check_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="c1"># first check for old ones</span>
- <span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
- <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">&lt;=</span> <span class="n">t</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="k">if</span> <span class="n">v</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">:</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
- <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
-
- <span class="c1"># then check the size</span>
- <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">)</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_conns</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
- <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span><span class="p">:</span>
- <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
- <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
- <span class="k">break</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">soonest</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
-
- <span class="k">def</span> <span class="nf">clear_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
- <span class="k">for</span> <span class="n">conn</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">values</span><span class="p">():</span>
- <span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">cache</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
- <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
-</pre></div>
-
- </div>
- </div>
- </div>
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
-<h3>Related Topics</h3>
-<ul>
- <li><a href="../index.html">Documentation overview</a><ul>
- <li><a href="index.html">Module code</a><ul>
- </ul></li>
- </ul></li>
-</ul>
-</div>
-<div id="searchbox" style="display: none" role="search">
- <h3>Quick search</h3>
- <form class="search" action="../search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
- <input type="hidden" name="check_keywords" value="yes" />
- <input type="hidden" name="area" value="default" />
- </form>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
- </div>
- </div>
- <div class="clearer"></div>
- </div>
- <div class="footer">
- &copy;2017, Matej Cepl <mcepl@cepl.eu>.
-
- |
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
-
- </div>
-
-
-
-
- </body>
-</html> \ No newline at end of file
diff --git a/doc/html/_sources/M2Crypto.SSL.txt b/doc/html/_sources/M2Crypto.SSL.txt
deleted file mode 100644
index 233c1eb..0000000
--- a/doc/html/_sources/M2Crypto.SSL.txt
+++ /dev/null
@@ -1,91 +0,0 @@
-SSL Package
-===========
-
-:mod:`SSL` Package
-------------------
-
-.. automodule:: M2Crypto.SSL
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Checker` Module
----------------------
-
-.. automodule:: M2Crypto.SSL.Checker
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Cipher` Module
---------------------
-
-.. automodule:: M2Crypto.SSL.Cipher
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Connection` Module
-------------------------
-
-.. automodule:: M2Crypto.SSL.Connection
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Context` Module
----------------------
-
-.. automodule:: M2Crypto.SSL.Context
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`SSLServer` Module
------------------------
-
-.. automodule:: M2Crypto.SSL.SSLServer
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Session` Module
----------------------
-
-.. automodule:: M2Crypto.SSL.Session
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`TwistedProtocolWrapper` Module
-------------------------------------
-
-.. automodule:: M2Crypto.SSL.TwistedProtocolWrapper
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`cb` Module
-----------------
-
-.. automodule:: M2Crypto.SSL.cb
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`ssl_dispatcher` Module
-----------------------------
-
-.. automodule:: M2Crypto.SSL.ssl_dispatcher
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`timeout` Module
----------------------
-
-.. automodule:: M2Crypto.SSL.timeout
- :members:
- :undoc-members:
- :show-inheritance:
-
diff --git a/doc/html/_sources/M2Crypto.txt b/doc/html/_sources/M2Crypto.txt
deleted file mode 100644
index dc6c706..0000000
--- a/doc/html/_sources/M2Crypto.txt
+++ /dev/null
@@ -1,218 +0,0 @@
-M2Crypto Package
-================
-
-:mod:`M2Crypto` Package
------------------------
-
-.. automodule:: M2Crypto.__init__
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`ASN1` Module
-------------------
-
-.. automodule:: M2Crypto.ASN1
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`AuthCookie` Module
-------------------------
-
-.. automodule:: M2Crypto.AuthCookie
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`BIO` Module
------------------
-
-.. automodule:: M2Crypto.BIO
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`BN` Module
-----------------
-
-.. automodule:: M2Crypto.BN
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`DH` Module
-----------------
-
-.. automodule:: M2Crypto.DH
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`DSA` Module
------------------
-
-.. automodule:: M2Crypto.DSA
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`EC` Module
-----------------
-
-.. automodule:: M2Crypto.EC
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`EVP` Module
------------------
-
-.. automodule:: M2Crypto.EVP
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Engine` Module
---------------------
-
-.. automodule:: M2Crypto.Engine
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Err` Module
------------------
-
-.. automodule:: M2Crypto.Err
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`RC4` Module
------------------
-
-.. automodule:: M2Crypto.RC4
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`RSA` Module
------------------
-
-.. automodule:: M2Crypto.RSA
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`Rand` Module
-------------------
-
-.. automodule:: M2Crypto.Rand
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`SMIME` Module
--------------------
-
-.. automodule:: M2Crypto.SMIME
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`X509` Module
-------------------
-
-.. automodule:: M2Crypto.X509
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`callback` Module
-----------------------
-
-.. automodule:: M2Crypto.callback
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`ftpslib` Module
----------------------
-
-.. automodule:: M2Crypto.ftpslib
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`httpslib` Module
-----------------------
-
-.. automodule:: M2Crypto.httpslib
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`m2` Module
-----------------
-
-.. automodule:: M2Crypto.m2
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`m2crypto` Module
-----------------------
-
-.. automodule:: M2Crypto.m2crypto
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`m2urllib` Module
-----------------------
-
-.. automodule:: M2Crypto.m2urllib
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`m2urllib2` Module
------------------------
-
-.. automodule:: M2Crypto.m2urllib2
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`m2xmlrpclib` Module
--------------------------
-
-.. automodule:: M2Crypto.m2xmlrpclib
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`threading` Module
------------------------
-
-.. automodule:: M2Crypto.threading
- :members:
- :undoc-members:
- :show-inheritance:
-
-:mod:`util` Module
-------------------
-
-.. automodule:: M2Crypto.util
- :members:
- :undoc-members:
- :show-inheritance:
-
-Subpackages
------------
-
-.. toctree::
-
- M2Crypto.SSL
-
diff --git a/doc/html/_sources/ZServerSSL-HOWTO.txt b/doc/html/_sources/ZServerSSL-HOWTO.txt
deleted file mode 100644
index 91ef5af..0000000
--- a/doc/html/_sources/ZServerSSL-HOWTO.txt
+++ /dev/null
@@ -1,239 +0,0 @@
-:orphan:
-
-.. _zserverssl-howto:
-
-ZServerSSL-HOWTO
-################
-
-:author: Pheng Siong Ng <ngps@post1.com>
-:copyright: © 2000, 2001 by Ng Pheng Siong.
-:date: 2003-06-22
-
-.. contents::
- :backlinks: entry
-
-.. sectnum::
- :suffix: .
-
-Introduction
-============
-
-ZServerSSL adds to Zope's ZServer the following:
-
-- HTTPS server
-- WebDAV-source-over-HTTPS server
-
-With the HTTPS server, ZServerSSL also provides WebDAV-over-HTTPS and
-XMLRPC-over-HTTPS access to Zope.
-
-These instructions apply to both Un\*x and Windows installations of Zope
-2.6.1. To avoid cluttering the presentation, Windows pathnames are shown
-in Un\*x fashion.
-
-Preparation
-===========
-
-#. Download M2Crypto 0.11, contained in the file ``m2crypto-0.11.zip``.
-#. Unpack ``m2crypto-0.11.zip``. This will create a directory
- ``m2crypto-0.11``. Henceforth, we refer to this directory as ``$M2``.
-#. Install M2Crypto per the instructions in ``$M2/INSTALL``.
-
-The ZServerSSL distribution is in ``$M2/demo/Zope``. We shall refer to
-this directory as ``$ZSSL``.
-
-Installation
-============
-
-Below, we refer to your Zope top-level directory as ``$ZOPE``.
-
-#. Copy ``$ZSSL/z2s.py`` into ``$ZOPE``.
-
-#. Depending on your operating system, modify ``$ZOPE/start`` or
- ``$ZOPE/start.bat`` to invoke ``$ZOPE/z2s.py``, instead of
- ``$ZOPE/z2.py``. The files ``$ZSSL/starts`` and ``$ZSSL/starts.bat``
- serve as examples.
-
-#. Copy ``$ZSSL/dh1024.pem`` into ``$ZOPE``. This file contains
- Diffie-Hellman parameters for use by the SSL protocol.
-
-#. Copy ``$ZSSL/randpool.dat`` into ``$ZOPE``. This file contains seed
- material for the OpenSSL PRNG. Alternatively, create
- ``$ZOPE/randpool.dat`` thusly::
-
- $ dd if=/dev/urandom of=randpool.dat bs=1024 count=1
-
-#. Copy ``$ZSSL/ca.pem`` to ``$ZOPE``. This file contains an
- example Certification Authority (CA) certificate. For
- information on operating your own CA, see :ref:`howto-ca` or
- one of numerous similar documents available on the web.
-
-#. Copy ``$ZSSL/server.pem`` to ``$ZOPE``. This file contains an RSA key
- pair and its X.509v3 certificate issued by the above CA. You may also
- create your own key/certificate bundle.
-
-#. Copy ``$ZSSL/ZServer/HTTPS_Server.py`` to ``$ZOPE/ZServer``.
-
-#. Copy ``$ZSSL/ZServer/__init__.py`` to ``$ZOPE/ZServer``. This
- overwrites the existing ``$ZOPE/ZServer/__init__.py``. Alternatively,
- apply the following patch to ``$ZOPE/ZServer/__init__.py``::
-
- --- __init__.py.org Sat Jun 21 23:20:41 2003
- +++ __init__.py Tue Jan 7 23:30:53 2003
- @@ -84,6 +84,7 @@
- import asyncore
- from medusa import resolver, logger
- from HTTPServer import zhttp_server, zhttp_handler
- +from HTTPS_Server import zhttps_server, zhttps_handler
- from PCGIServer import PCGIServer
- from FCGIServer import FCGIServer
- from FTPServer import FTPServer
-
-#. Copy ``$ZSSL/ZServer/medusa/https_server.py`` to
- ``$ZOPE/ZServer/medusa``.
-
-#. Stop Zope, if it is running.
-
-#. Start Zope with ZServerSSL thusly::
-
- ./starts -X -f 9021 -w 9080 -W 9081 -y 9443 -Y 9444
-
- This starts the following:
-
- - an FTP server on port 9021
- - a HTTP server on port 9080
- - a WebDAV-source server on port 9081
- - a HTTPS server on port 9443
- - a WebDAV-source-over-HTTPS server on port 9444
-
-Testing
-=======
-
-Below, we assume your Zope server is running on ``localhost``.
-
-HTTPS
-=====
-
-This testing is done with Mozilla 1.1 on FreeBSD.
-
-#. With a browser, connect to https://localhost:9443/. Browse around.
- Check out your browser's HTTPS informational screens.
-#. Connect to https://localhost:9443/manage. Verify that you can access
- Zope's management functionality.
-
-WebDAV-over-HTTPS
-=================
-
-This testing is done with Cadaver 0.21.0 on FreeBSD.::
-
- $ cadaver https://localhost:9443/
- WARNING: Untrusted server certificate presented:
- Issued to: M2Crypto, SG
- Issued by: M2Crypto, SG
- Do you wish to accept the certificate? (y/n) y
- dav:/> ls
- Listing collection `/': succeeded.
- Coll: Channels 0 Jun 19 00:04
- Coll: Control_Panel 0 Jun 6 00:13
- Coll: Examples 0 Jun 6 00:12
- Coll: catalog 0 Jun 12 11:53
- Coll: ngps 0 Jun 16 15:34
- Coll: portal 0 Jun 21 15:21
- Coll: skunk 0 Jun 18 21:18
- Coll: temp_folder 0 Jun 22 17:57
- Coll: zope 0 Jun 20 15:27
- acl_users 0 Dec 30 1998
- browser_id_manager 0 Jun 6 00:12
- default.css 3037 Jun 21 16:38
- error_log 0 Jun 6 00:12
- index_html 313 Jun 12 13:36
- portal0 0 Jun 21 15:21
- session_data_manager 0 Jun 6 00:12
- standard_error_message 1365 Jan 21 2001
- standard_html_footer 50 Jun 12 12:30
- standard_html_header 80 Jan 21 2001
- standard_template.pt 282 Jun 6 00:12
- zsyncer 0 Jun 17 15:28
- dav:/> quit
- Connection to `localhost' closed.
- $
-
-
-WebDAV-Source-over-HTTPS
-========================
-
-This testing is done with Mozilla 1.1 on FreeBSD.
-
-#. Open the Mozilla Composer window.
-#. Click "File", "Open Web Location". A dialog box appears.
-#. Enter ``https://localhost:9444/index_html`` for the URL.
-#. Select "Open in new Composer window."
-#. Click "Open". A new Composer window will open with ``index_html``
- loaded.
-
-Python with M2Crypto
-====================
-
-This testing is done with M2Crypto 0.11 and Python 2.2.2 on FreeBSD.
-
-HTTPS
-=====
-
-::
-
- >>> from M2Crypto import Rand, SSL, m2urllib
- >>> url = m2urllib.FancyURLopener()
- >>> url.addheader('Connection', 'close')
- >>> u = url.open('https://127.0.0.1:9443/')
- send: 'GET / HTTP/1.1\r\nHost: 127.0.0.1:9443\r\nAccept-Encoding: identity\r\nUser-agent: Python-urllib/1.15\r\nConnection: close\r\n\r\n'
- reply: 'HTTP/1.1 200 OK\r\n'
- header: Server: ZServerSSL/0.11
- header: Date: Sun, 22 Jun 2003 13:42:34 GMT
- header: Connection: close
- header: Content-Type: text/html
- header: Etag:
- header: Content-Length: 535
- >>> while 1:
- ... data = u.read()
- ... if not data: break
- ... print(data)
- ...
-
-::
-
- <html><head>
- <base href="https://127.0.0.1:9443/" />
- <title>Zope</title></head><body bgcolor="#FFFFFF">
-
- <h1>NgPS Desktop Portal</h1>
-
- &nbsp;&nbsp;So many hacks.<br>
- &nbsp;&nbsp;So little time.<br>
-
- <h2>Link Farm</h2>
- <ul>
- <li><a href="http://localhost:8080/portal">Portal</a></li>
- <li><a href="http://localhost/">Local Apache Home Page</a></li>
- </ul>
-
- <hr><a href="http://www.zope.org/Credits" target="_top"><img src="https://127.0.0.1:9443/p_/ZopeButton" width="115" height="50" border="0" alt="Powered by Zope" /></a></body></html>
-
-::
-
- >>> u.close()
- >>>
-
-XMLRPC-over-HTTPS
-=================
-
-::
-
- >>> from M2Crypto.m2xmlrpclib import Server, SSL_Transport
- >>> zs = Server('https://127.0.0.1:9443/', SSL_Transport())
- >>> print(zs.propertyMap())
- [{'type': 'string', 'id': 'title', 'mode': 'w'}]
- >>>
-
-Conclusion
-==========
-
-Well, it works! ;-)
diff --git a/doc/html/_sources/howto.ca.txt b/doc/html/_sources/howto.ca.txt
deleted file mode 100644
index e950b59..0000000
--- a/doc/html/_sources/howto.ca.txt
+++ /dev/null
@@ -1,370 +0,0 @@
-:orphan:
-
-.. _howto-ca:
-
-HOWTO: Creating your own CA with OpenSSL
-########################################
-
-:author: Pheng Siong Ng <ngps@post1.com>
-:copyright: © 2000, 2001 by Ng Pheng Siong.
-
-Introduction
-============
-
-This is a HOWTO on creating your own *certification authority* (*CA*)
-with OpenSSL.
-
-I last created a CA about a year ago, when I began work on
-`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ and needed
-certificates for the SSL bits. I accepted the tools' default
-settings then, e.g., certificate validity of 365 days; this meant
-that my certificates, including my CA's certificate, have now
-expired.
-
-Since I am using these certificates for M2Crypto's demonstration
-programs (and I have forgotten the passphrase to the CA's private
-key), I decided to discard the old CA and start afresh. I also
-decided to document the process, hence this HOWTO.
-
-The Procedure
-=============
-
-I use ``CA.pl``, a Perl program written by Steve Hanson and bundled with
-OpenSSL.
-
-The following are the steps to create a CA:
-
-1. Choose a directory to do your CA work. All commands are executed
- within this directory. Let's call the directory ``demo``.
-
-2. Copy ``CA.pl`` and ``openssl.cnf`` into ``demo``.
-
-3. Apply the following patch to ``CA.pl``, which allows it to generate a
- CA certificate with a validity period of 1095 days, i.e.,
- 3 years::
-
- --- CA.pl.org Sat Mar 31 12:40:13 2001
- +++ CA.pl Sat Mar 31 12:41:15 2001
- @@ -97,7 +97,7 @@
- } else {
- print "Making CA certificate ...\n";
- system ("$REQ -new -x509 -keyout " .
- - "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT $DAYS");
- + "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT -days 1095");
- $RET=$?;
- }
- }
-
-
-4. Create a new CA like this::
-
- ./CA.pl -newca
-
- A certificate filename (or enter to create) <enter>
-
- Making CA certificate ...
- Using configuration from openssl.cnf
- Generating a 1024 bit RSA private key
- ............++++++
- ......................++++++
- writing new private key to './demoCA/private/cakey.pem'
- Enter PEM pass phrase: <secret passphrase here>
- Verifying password - Enter PEM pass phrase: <secret passphrase again>
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [AU]:SG
- State or Province Name (full name) [Some-State]:.
- Locality Name (eg, city) []:..
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:DemoCA
- Organizational Unit Name (eg, section) []:.
- Common Name (eg, YOUR name) []:DemoCA Certificate Master
- Email Address []:certmaster@democa.dom
-
- This creates a new CA in the directory ``demoCA``. The CA's
- self-signed certificate is in ``demoCA/cacert.pem`` and its RSA key
- pair is in ``demoCA/private/cakey.pem``.
-
- ``demoCA/private/cakey.pem`` looks like this::
-
- cat demoCA/private/cakey.pem
-
- -----BEGIN RSA PRIVATE KEY-----
- Proc-Type: 4,ENCRYPTED
- DEK-Info: DES-EDE3-CBC,19973A9DBBB601BA
-
- eOq9WFScNiI4/UWEUaSnGTKpJv2JYuMD3HwQox2Q3Cd4zGqVjJ6gF3exa5126cKf
- X/bMVnwbPpuFZPiAIvaLyCjT6pYeXTBbSzs7/GQnvEOv+nYnDUFWi0Qm92qLk0uy
- pFi/M1aWheN3vir2ZlAw+DW0bOOZhj8tC7Co7lMYb0YE271b6/YRPZCwQ3GXAHUJ
- +aMYxlUDrK45aCUa/1CZDzTgk7h9cDgx2QJSIvYMYytCfI3zsuZMJS8/4OXLL0bI
- lKmAc1dwB3DqGJt5XK4WJesiNfdxeCNEgAcYtEAgYZTPIApU+kTgTCIxJl2nMW7j
- ax+Q1z7g+4MpgG20WD633D4z4dTlDdz+dnLi0rvuvxiwt+dUhrqiML1tyi+Z6EBH
- jU4/cLBWev3rYfrlp4x8J9mDte0YKOk3t0wQOHqRetTsIfdtjnFp/Hu3qDmTCWjD
- z/g7PPoO/bg/B877J9WBPbL/1hXXFYo88M+2aGlPOgDcFdiOqbLb2DCscohMbbVr
- A4mgiy2kwWfIE73qiyV7yyG8FlRvr1iib+jbT3LTGf743utYAAs7HNGuOUObhoyt
- jYvBD7ACn35P5YX7KTqvqErwdijxYCaNBCnvmRtmYSaNw9Kv1UJTxc5Vx7YLwIPk
- E9KyBgKI7vPOjWBZ27+zOvNycmv1ciNtpALAw4bWtXnhCDVTHaVDy34OkheMzNCg
- 2cjcBFzOkMIjcI03KbTQXOFIQGlsTWXGzkNf/zBQ+KksT1MCj+zBXSCvlDASMckg
- kef21pGgUqPF14gKGfWX3sV4bjc1vbrRwq6zlG3nMuYqR5MtJJY9eQ==
- -----END RSA PRIVATE KEY-----
-
-
-5. Next, generate a certificate request::
-
- ./CA.pl -newreq
-
- Using configuration from openssl.cnf
- Generating a 1024 bit RSA private key
- ..........++++++
- ..............++++++
- writing new private key to 'newreq.pem'
- Enter PEM pass phrase: <another secret passphrase here>
- Verifying password - Enter PEM pass phrase: <another secret passphrase again>
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [AU]:SG
- State or Province Name (full name) [Some-State]:..
- Locality Name (eg, city) []:.
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
- Organizational Unit Name (eg, section) []:.
- Common Name (eg, YOUR name) []:localhost
- Email Address []:admin@server.example.dom
-
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:<enter>
- An optional company name []:<enter>
- Request (and private key) is in newreq.pem
-
-\
-
- The certificate request and private key in ``newreq.pem`` looks like
- this::
-
- cat newreq.pem
-
- -----BEGIN RSA PRIVATE KEY-----
- Proc-Type: 4,ENCRYPTED
- DEK-Info: DES-EDE3-CBC,41B2874DF3D02DD4
-
- mg611EoVkLEooSTv+qTM0Ddmm/M1jE/Jy5RD/sc3LSMhuGu9xc26OgsTJmkQuIAh
- J/B4lAw8G59VTG6DykeEtrG0rUBx4bggc7PKbFuiN423YjJODWcHvVgnPOzXMQt+
- lY4tPl5+217MRHyx2NsWGrpkQNdu3GeSPOVMl3jeQiaXupONbwQ7rj42+X/VtAJP
- W4D1NNwu8aGCPyShsEXHc/fI1WDpphYWke97pOjIZVQESFZOPty5HjIYZux4U+td
- W81xODtq2ecJXc8fn2Wpa9y5VD1LT7oJksOuL1+Z04OVaeUe4x0swM17HlBm2kVt
- fe/C/L6kN27MwZhE331VjtTjSGl4/gknqQDbLOtqT06f3OISsDJETm2itllyhgzv
- C6Fi3N03rGFmKectijC+tws5k+P+HRG6sai33usk8xPokJqA+HYSWPz1XVlpRmv4
- kdjQOdST7ovU62mOTgf3ARcduPPwuzTfxOlYONe5NioO1APVHBrInQwcpLkpOTQR
- vI4roIN+b75/nihUWGUJn/nbbBa2Yl0N5Gs1Tyiy9Z+CcRT2TfWKBBFlEUIFl7Mb
- J9fTV3DI+k+akbR4il1NkQ8EcSmCr3WpA0I9n0EHI7ZVpVaHxc0sqaPFl8YGdFHq
- 1Qk53C/w6+qPpDzT3yKFmG2LZytAAM1czvb6RbNRJJP2ZrpBwn/h99sUTo/yPfxY
- nueYmFJDm0uVNtG0icXGNUfSfnjKNTtHPAgyKGetRIC3kgJz/bo2w7EI6iEjBAzK
- l5TRm4x6ZJxwuXXMiJCehMMd8TC8ybwWO4AO19B3ebFFeTVsUgxSGA==
- -----END RSA PRIVATE KEY-----
- -----BEGIN CERTIFICATE REQUEST-----
- MIIBnTCCAQYCAQAwXTELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIw
- EAYDVQQDEwlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGFkbWluQHNlcnZlci5l
- eGFtcGxlLmRvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr1nYY1Qrll1r
- uB/FqlCRrr5nvupdIN+3wF7q915tvEQoc74bnu6b8IbbGRMhzdzmvQ4SzFfVEAuM
- MuTHeybPq5th7YDrTNizKKxOBnqE2KYuX9X22A1Kh49soJJFg6kPb9MUgiZBiMlv
- tb7K3CHfgw5WagWnLl8Lb+ccvKZZl+8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GB
- AHpoRp5YS55CZpy+wdigQEwjL/wSluvo+WjtpvP0YoBMJu4VMKeZi405R7o8oEwi
- PdlrrliKNknFmHKIaCKTLRcU59ScA6ADEIWUzqmUzP5Cs6jrSRo3NKfg1bd09D1K
- 9rsQkRc9Urv9mRBIsredGnYECNeRaK5R1yzpOowninXC
- -----END CERTIFICATE REQUEST-----
-
-\
-
- Decoding the certificate request gives the following::
-
- openssl req -text -noout < newreq.pem
-
- Using configuration from /usr/local/pkg/openssl/openssl.cnf
- Certificate Request:
- Data:
- Version: 0 (0x0)
- Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
- 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
- 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
- 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
- c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
- 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
- 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
- 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
- 0b:6f:e7:1c:bc:a6:59:97:ef
- Exponent: 65537 (0x10001)
- Attributes:
- a0:00
- Signature Algorithm: md5WithRSAEncryption
- 7a:68:46:9e:58:4b:9e:42:66:9c:be:c1:d8:a0:40:4c:23:2f:
- fc:12:96:eb:e8:f9:68:ed:a6:f3:f4:62:80:4c:26:ee:15:30:
- a7:99:8b:8d:39:47:ba:3c:a0:4c:22:3d:d9:6b:ae:58:8a:36:
- 49:c5:98:72:88:68:22:93:2d:17:14:e7:d4:9c:03:a0:03:10:
- 85:94:ce:a9:94:cc:fe:42:b3:a8:eb:49:1a:37:34:a7:e0:d5:
- b7:74:f4:3d:4a:f6:bb:10:91:17:3d:52:bb:fd:99:10:48:b2:
- b7:9d:1a:76:04:08:d7:91:68:ae:51:d7:2c:e9:3a:8c:27:8a:
- 75:c2
-
-6. Now, sign the certificate request::
-
- ./CA.pl -sign
-
- Using configuration from openssl.cnf
- Enter PEM pass phrase: <CA's passphrase>
- Check that the request matches the signature
- Signature ok
- The Subjects Distinguished Name is as follows
- countryName :PRINTABLE:'SG'
- organizationName :PRINTABLE:'M2Crypto'
- commonName :PRINTABLE:'localhost'
- emailAddress :IA5STRING:'admin@server.example.dom'
- Certificate is to be certified until Mar 31 02:57:30 2002 GMT (365 days)
- Sign the certificate? [y/n]:y
-
-
- 1 out of 1 certificate requests certified, commit? [y/n]y
- Write out database with 1 new entries
- Data Base Updated
- Signed certificate is in newcert.pem
-
-\
-
- ``newcert.pem`` looks like this::
-
- cat newcert.pem
-
- Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 1 (0x1)
- Signature Algorithm: md5WithRSAEncryption
- Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
- Validity
- Not Before: Mar 31 02:57:30 2001 GMT
- Not After : Mar 31 02:57:30 2002 GMT
- Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
- 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
- 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
- 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
- c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
- 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
- 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
- 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
- 0b:6f:e7:1c:bc:a6:59:97:ef
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 1 (0x1)
- Signature Algorithm: md5WithRSAEncryption
- Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
- Validity
- Not Before: Mar 31 02:57:30 2001 GMT
- Not After : Mar 31 02:57:30 2002 GMT
- Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
- 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
- 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
- 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
- c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
- 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
- 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
- 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
- 0b:6f:e7:1c:bc:a6:59:97:ef
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints:
- CA:FALSE
- Netscape Comment:
- OpenSSL Generated Certificate
- X509v3 Subject Key Identifier:
- B3:D6:89:88:2F:B1:15:40:EC:0A:C0:30:35:3A:B7:DA:72:73:1B:4D
- X509v3 Authority Key Identifier:
- keyid:F9:6A:A6:34:97:6B:BC:BB:5A:17:0D:19:FC:62:21:0B:00:B5:0E:29
- DirName:/C=SG/O=DemoCA/CN=DemoCA Certificate Master/Email=certmaster@democa.dom
- serial:00
-
- Signature Algorithm: md5WithRSAEncryption
-
-7. In certain situations, e.g., where your certificate and private key
- are to be used in an unattended SSL server, you may wish to not
- encrypt the private key, i.e., leave the key in the clear. This
- decision should be governed by your site's security policy and threat
- model, of course::
-
- openssl rsa < newkey.pem > newkey2.pem
-
- read RSA key
- Enter PEM pass phrase:<secret passphrase here>
- writing RSA key
-
- ``newkey2.pem`` looks like this::
-
- cat newkey2.pem
-
- -----BEGIN RSA PRIVATE KEY-----
- MIICXgIBAAKBgQCvWdhjVCuWXWu4H8WqUJGuvme+6l0g37fAXur3Xm28RChzvhue
- 7pvwhtsZEyHN3Oa9DhLMV9UQC4wy5Md7Js+rm2HtgOtM2LMorE4GeoTYpi5f1fbY
- DUqHj2ygkkWDqQ9v0xSCJkGIyW+1vsrcId+DDlZqBacuXwtv5xy8plmX7wIDAQAB
- AoGAbAkU8w3W1Qu15Hle1bJSL7GMReoreqeblOBmMAZz4by0l6sXZXJpjWXo86f/
- +dASMYTMPC4ZTYtv06N07AFbjL+kDfqDMTfzQkYMHp1LAq1Ihbq1rHWSBH5n3ekq
- KiY8JKpv8DR5Po1iKaXJFuDByGDENJwYbSRSpSK3P+vkWWECQQDkEUE/ZPqqqZkQ
- 2iWRPAsCbEID8SAraQl3DdCLYs/GgARfmmj4yUHEwkys9Jo1H8k4BdxugmaUwNi5
- YQ/CVzrXAkEAxNO80ArbGxPUmr11GHG/bGBYj1DUBkHZSc7dgxZdtUCLGNxQnNsg
- Iwq3n6j1sUzS3UW6abQ8bivYNOUcMKJAqQJBANQxFaLU4b/NQaODQ3aoBZpAfP9L
- 5eFdvbet+7zjt2r5CpikgkwOfAmDuXEltx/8LevY0CllW+nErx9zJgVrwUsCQQCu
- 76H5JiznPBDSF2FjgHWqVVdgyW4owY3mU739LHvNBLicN/RN9VPy0Suy8/CqzKT9
- lWPBXzf2k3FuUdNkRlFBAkEAmpXoybuiFR2S5Bma/ax96lVs0/VihhfC1zZP/X/F
- Br77+h9dIul+2DnyOl50zu0Sdzst1/7ay4JSDHyiBCMGSQ==
- -----END RSA PRIVATE KEY-----
-
-
-That's it! The certificate, ``newcert.pem``, and the private key -
-``newkey.pem`` (encrypted) or ``newkey2.pem`` (unencrypted) - are now
-ready to be used. You may wish to rename the files to more intuitive
-names.
-
-You should also keep the CA's certificate ``demo/cacert.pem`` handy
-for use when developing and deploying SSL or S/MIME applications.
-
-Conclusion
-==========
-
-We've walked through the basic steps in the creation of a CA and
-certificates using the tools that come with OpenSSL. We did not cover
-more advanced topics such as constraining a certificate to be SSL-only
-or S/MIME-only.
-
-There exist several HOWTOs similar to this one on the net. This one is
-written specifically to facilitate discussions in my other HOWTOs on
-developing SSL and S/MIME applications in
-`Python <http://www.python.org>`__ using
-`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__.
-
diff --git a/doc/html/_sources/howto.smime.txt b/doc/html/_sources/howto.smime.txt
deleted file mode 100644
index 715e7c4..0000000
--- a/doc/html/_sources/howto.smime.txt
+++ /dev/null
@@ -1,778 +0,0 @@
-:orphan:
-
-.. _howto-smime:
-
-HOWTO: Programming S/MIME in Python with M2Crypto
-=================================================
-
-:author: Pheng Siong Ng <ngps@post1.com>
-:copyright: © 2000, 2001 by Ng Pheng Siong.
-
-Introduction
-============
-
-`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ is a
-`Python <http://www.python.org>`__ interface to
-`OpenSSL <http://www.openssl.org>`__. It makes available to the Python
-programmer SSL functionality to implement clients and servers, S/MIME
-v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.
-
-This document demonstrates programming S/MIME with M2Crypto.
-
-S/MIME
-======
-
-S/MIME - Secure Multipurpose Internet Mail Extensions [RFC 2311, RFC
-2312] - provides a consistent way to send and receive secure MIME data.
-Based on the popular Internet MIME standard, S/MIME provides the
-following cryptographic security services for electronic messaging
-applications - *authentication*, *message integrity* and
-*non-repudiation of origin* (using *digital signatures*), and *privacy*
-and *data security* (using *encryption*).
-
-Keys and Certificates
-=====================
-
-To create an S/MIME-signed message, you need an RSA key pair (this
-consists of a public key and a private key) and an X.509 certificate of
-said public key.
-
-To create an S/MIME-encrypted message, you need an X.509 certificate for
-each recipient.
-
-To create an S/MIME-signed *and* -encrypted message, first create a
-signed message, then encrypt the signed message with the recipients'
-certificates.
-
-You may generate key pairs and obtain certificates by using a commercial
-*certification authority* service.
-
-You can also do so using freely-available software. For many purposes,
-e.g., automated S/MIME messaging by system administration processes,
-this approach is cheap and effective.
-
-We now work through using OpenSSL to generate key pairs and
-certificates. This assumes you have OpenSSL installed properly on your
-system.
-
-First, we generate an X.509 certificate to be used for signing::
-
- openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out signer.pem
-
- Using configuration from /usr/local/pkg/openssl/openssl.cnf
- Generating a 1024 bit RSA private key
- ..++++++
- ....................++++++
- writing new private key to 'privkey.pem'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [AU]:SG
- State or Province Name (full name) [Some-State]:.
- Locality Name (eg, city) []:.
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
- Organizational Unit Name (eg, section) []:.
- Common Name (eg, YOUR name) []:S/MIME Sender
- Email Address []:sender@example.dom
-
-
-This generates a 1024-bit RSA key pair, unencrypted, into
-``privkey.pem``; it also generates a self-signed X.509 certificate for
-the public key into ``signer.pem``. The certificate is valid for 365
-days, i.e., a year.
-
-Let's rename ``privkey.pem`` so that we know it is a companion of
-``signer.pem``'s::
-
- mv privkey.pem signer_key.pem
-
-To verify the content of ``signer.pem``, execute the following::
-
- openssl x509 -noout -text -in signer.pem
-
- Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number: 0 (0x0)
- Signature Algorithm: md5WithRSAEncryption
- Issuer: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
- Validity
- Not Before: Mar 24 12:56:16 2001 GMT
- Not After : Mar 24 12:56:16 2002 GMT
- Subject: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public Key: (1024 bit)
- Modulus (1024 bit):
- 00:a9:d6:e2:b5:11:3b:ae:3c:e2:17:31:70:e1:6e:
- 01:f4:19:6d:bd:2a:42:36:2b:37:34:e2:83:1d:0d:
- 11:2e:b4:99:44:db:10:67:be:97:5f:5b:1a:26:33:
- 46:23:2f:95:04:7a:35:da:9d:f9:26:88:39:9e:17:
- cd:3e:eb:a8:19:8d:a8:2a:f1:43:da:55:a9:2e:2c:
- 65:ed:04:71:42:ce:73:53:b8:ea:7e:c7:f0:23:c6:
- 63:c5:5e:68:96:64:a7:b4:2a:94:26:76:eb:79:ea:
- e3:4e:aa:82:09:4f:44:87:4a:12:62:b5:d7:1f:ca:
- f2:ce:d5:ba:7e:1f:48:fd:b9
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Subject Key Identifier:
- 29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
- X509v3 Authority Key Identifier:
- keyid:29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
- DirName:/C=SG/O=M2Crypto/CN=S/MIME Sender/Email=sender@example.dom
- serial:00
-
- X509v3 Basic Constraints:
- CA:TRUE
- Signature Algorithm: md5WithRSAEncryption
- 68:c8:6b:1b:fa:7c:9a:39:35:76:18:15:c9:fd:89:97:62:db:
- 7a:b0:2d:13:dd:97:e8:1b:7a:9f:22:27:83:24:9d:2e:56:ec:
- 97:89:3c:ef:16:55:80:5a:18:7c:22:d0:f6:bb:e3:a4:e8:59:
- 30:ff:99:5a:93:3e:ea:bc:ee:7f:8d:d6:7d:37:8c:ac:3d:74:
- 80:ce:7a:99:ba:27:b9:2a:a3:71:fa:a5:25:ba:47:17:df:07:
- 56:96:36:fd:60:b9:6c:96:06:e8:e3:7b:9f:4b:6a:95:71:a8:
- 34:fc:fc:b5:88:8b:c4:3f:1e:24:f6:52:47:b2:7d:44:67:d9:
- 83:e8
-
-Next, we generate a self-signed X.509 certificate for the recipient.
-Note that ``privkey.pem`` will be recreated::
-
- openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out recipient.pem
-
- Using configuration from /usr/local/pkg/openssl/openssl.cnf
- Generating a 1024 bit RSA private key
- .....................................++++++
- .................++++++
- writing new private key to 'privkey.pem'
- -----
- You are about to be asked to enter information that will be incorporated
- into your certificate request.
- What you are about to enter is what is called a Distinguished Name or a DN.
- There are quite a few fields but you can leave some blank
- For some fields there will be a default value,
- If you enter '.', the field will be left blank.
- -----
- Country Name (2 letter code) [AU]:SG
- State or Province Name (full name) [Some-State]:.
- Locality Name (eg, city) []:.
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
- Organizational Unit Name (eg, section) []:.
- Common Name (eg, YOUR name) []:S/MIME Recipient
- Email Address []:recipient@example.dom
-
-Again, rename ``privkey.pem``::
-
- mv privkey.pem recipient_key.pem
-
-
-In the examples to follow, S/MIME Sender, ``<sender@example.dom>``,
-shall be the sender of S/MIME messages, while S/MIME Recipient,
-``<recipient@example.dom>``, shall be the recipient of S/MIME messages.
-
-Armed with the key pairs and certificates, we are now ready to begin
-programming S/MIME in Python.
-
- **Note:** The private keys generated above are *not
- passphrase-protected*, i.e., they are *in the clear*. Anyone who has
- access to such a key can generate S/MIME-signed messages with it,
- and decrypt S/MIME messages encrypted to it's corresponding public
- key.
-
- We may passphrase-protect the keys, if we so choose. M2Crypto will
- prompt the user for the passphrase when such a key is being loaded.
-
-M2Crypto.SMIME
-==============
-
-The Python programmer accesses M2Crypto's S/MIME functionality through
-class ``SMIME`` in the module ``M2Crypto.SMIME``. Typically, an
-``SMIME`` object is instantiated; the object is then set up for the
-intended operation: sign, encrypt, decrypt or verify; finally, the
-operation is invoked on the object.
-
-``M2Crypto.SMIME`` makes extensive use of ``M2Crypto.BIO``:
-``M2Crypto.BIO`` is a Python abstraction of the ``BIO`` abstraction in
-OpenSSL. A commonly used ``BIO`` abstraction in M2Crypto is
-``M2Crypto.BIO.MemoryBuffer``, which implements a memory-based file-like
-object, similar to Python's own ``StringIO``.
-
-Sign
-====
-
-The following code demonstrates how to generate an S/MIME-signed
-message. ``randpool.dat`` contains random data which is used to seed
-OpenSSL's pseudo-random number generator via M2Crypto::
-
- from M2Crypto import BIO, Rand, SMIME
-
- def makebuf(text):
- return BIO.MemoryBuffer(text)
-
- # Make a MemoryBuffer of the message.
- buf = makebuf('a sign of our times')
-
- # Seed the PRNG.
- Rand.load_file('randpool.dat', -1)
-
- # Instantiate an SMIME object; set it up; sign the buffer.
- s = SMIME.SMIME()
- s.load_key('signer_key.pem', 'signer.pem')
- p7 = s.sign(buf, SMIME.PKCS7_DETACHED)
-
-
-``p7`` now contains a *PKCS #7 signature blob* wrapped in an
-``M2Crypto.SMIME.PKCS7`` object. Note that ``buf`` has been consumed by
-``sign()`` and has to be recreated if it is to be used again.
-
-We may now send the signed message via SMTP. In these examples, we shall
-not do so; instead, we'll render the S/MIME output in mail-friendly
-format, and pretend that our messages are sent and received
-correctly::
-
- # Recreate buf.
- buf = makebuf('a sign of our times')
-
- # Output p7 in mail-friendly format.
- out = BIO.MemoryBuffer()
- out.write('From: sender@example.dom\n')
- out.write('To: recipient@example.dom\n')
- out.write('Subject: M2Crypto S/MIME testing\n')
- s.write(out, p7, buf)
-
- print(out.read())
-
- # Save the PRNG's state.
- Rand.save_file('randpool.dat')
-
-Here's the output::
-
- From: sender@example.dom
- To: recipient@example.dom
- Subject: M2Crypto S/MIME testing
- MIME-Version: 1.0
- Content-Type: multipart/signed ; protocol="application/x-pkcs7-signature" ; micalg=sha1 ; boundary="----3C93156FC7B4EBF49FE9C7DB7F503087"
-
- This is an S/MIME signed message
-
- ------3C93156FC7B4EBF49FE9C7DB7F503087
- a sign of our times
- ------3C93156FC7B4EBF49FE9C7DB7F503087
- Content-Type: application/x-pkcs7-signature; name="smime.p7s"
- Content-Transfer-Encoding: base64
- Content-Disposition: attachment; filename="smime.p7s"
-
- MIIE8AYJKoZIhvcNAQcCoIIE4TCCBN0CAQExCzAJBgUrDgMCGgUAMCIGCSqGSIb3
- DQEHAaAVBBNhIHNpZ24gb2Ygb3VyIHRpbWVzoIIC5zCCAuMwggJMoAMCAQICAQAw
- DQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRv
- MRYwFAYDVQQDEw1TL01JTUUgU2VuZGVyMSEwHwYJKoZIhvcNAQkBFhJzZW5kZXJA
- ZXhhbXBsZS5kb20wHhcNMDEwMzMxMTE0MDMzWhcNMDIwMzMxMTE0MDMzWjBbMQsw
- CQYDVQQGEwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBT
- ZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbTCBnzANBgkq
- hkiG9w0BAQEFAAOBjQAwgYkCgYEA5c5Tj1CHTSOxa1q2q0FYiwMWYHptJpJcvtZm
- UwrgU5sHrA8OnCM0cDXEj0KPf3cfNjHffB8HWMzI4UEgNmFXQNsxoGZ+iqwxLlNj
- y9Mh7eFW/Bjq5hNXbouSlQ0rWBRkoxV64y+t6lQehb32WfYXQbKFxFJSXzSxOx3R
- 8YhSPd0CAwEAAaOBtjCBszAdBgNVHQ4EFgQUXOyolL1t4jaBwZFRM7MS8nBLzUow
- gYMGA1UdIwR8MHqAFFzsqJS9beI2gcGRUTOzEvJwS81KoV+kXTBbMQswCQYDVQQG
- EwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIx
- ITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbYIBADAMBgNVHRMEBTAD
- AQH/MA0GCSqGSIb3DQEBBAUAA4GBAHo3DrCHR86fSTVAvfiXdSswWqKtCEhUHRdC
- TLFGl4hDk2GyZxaFuqZwiURz/H7nMicymI2wkz8H/wyHFg8G3BIehURpj2v/ZWXY
- eovbgS7EZALVVkDj4hNl/IIHWd6Gtv1UODf7URbxtl3hQ9/eTWITrefT1heuPnar
- 8czydsOLMYIBujCCAbYCAQEwYDBbMQswCQYDVQQGEwJTRzERMA8GA1UEChMITTJD
- cnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNl
- bmRlckBleGFtcGxlLmRvbQIBADAJBgUrDgMCGgUAoIGxMBgGCSqGSIb3DQEJAzEL
- BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAxMDMzMTExNDUwMlowIwYJKoZI
- hvcNAQkEMRYEFOoeRUd8ExIYXfQq8BTFuKWrSP3iMFIGCSqGSIb3DQEJDzFFMEMw
- CgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsO
- AwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABIGAQpU8hFUtLCF6hO2t
- ec9EYJ/Imqqiiw+BxWxkUUVT81Vbjwdn9JST6+sztM5JRP2ZW+b4txEjZriYC8f3
- kv95YMTGbIsuWkJ93GrbvqoJ/CxO23r9WWRnZEm/1EZN9ZmlrYqzBTxnNRmP3Dhj
- cW8kzZwH+2/2zz2G7x1HxRWH95A=
-
- ------3C93156FC7B4EBF49FE9C7DB7F503087--
-
-
-Verify
-======
-
-Assume the above output has been saved into ``sign.p7``. Let's now
-verify the signature::
-
- from M2Crypto import SMIME, X509
-
- # Instantiate an SMIME object.
- s = SMIME.SMIME()
-
- # Load the signer's cert.
- x509 = X509.load_cert('signer.pem')
- sk = X509.X509_Stack()
- sk.push(x509)
- s.set_x509_stack(sk)
-
- # Load the signer's CA cert. In this case, because the signer's
- # cert is self-signed, it is the signer's cert itself.
- st = X509.X509_Store()
- st.load_info('signer.pem')
- s.set_x509_store(st)
-
- # Load the data, verify it.
- p7, data = SMIME.smime_load_pkcs7('sign.p7')
- v = s.verify(p7, data)
- print(v)
- print(data)
- print(data.read())
-
-Here's the output of the above program::
-
- a sign of our times
- <M2Crypto.BIO.BIO instance at 0x822012c>
- a sign of our times
-
-Suppose, instead of loading ``signer.pem`` above, we load
-``recipient.pem``. That is, we do a global substitution of
-``recipient.pem`` for ``signer.pem`` in the above program. Here's the
-modified program's output::
-
- Traceback (most recent call last):
- File "./verify.py", line 22, in ?
- v = s.verify(p7)
- File "/usr/local/home/ngps/prog/m2/M2Crypto/SMIME.py", line 205, in verify
- raise SMIME_Error, Err.get_error()
- M2Crypto.SMIME.SMIME_Error: 312:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:213:Verify error:self signed certificate
-
-
-As displayed, the error is generated by line 213 of OpenSSL's
-``pk7_smime.c`` (as of OpenSSL 0.9.6); if you are a C programmer, you
-may wish to look up the C source to explore OpenSSL's S/MIME
-implementation and understand why the error message is worded thus.
-
-Encrypt
-=======
-
-We now demonstrate how to generate an S/MIME-encrypted message::
-
- from M2Crypto import BIO, Rand, SMIME, X509
-
- def makebuf(text):
- return BIO.MemoryBuffer(text)
-
- # Make a MemoryBuffer of the message.
- buf = makebuf('a sign of our times')
-
- # Seed the PRNG.
- Rand.load_file('randpool.dat', -1)
-
- # Instantiate an SMIME object.
- s = SMIME.SMIME()
-
- # Load target cert to encrypt to.
- x509 = X509.load_cert('recipient.pem')
- sk = X509.X509_Stack()
- sk.push(x509)
- s.set_x509_stack(sk)
-
- # Set cipher: 3-key triple-DES in CBC mode.
- s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
-
- # Encrypt the buffer.
- p7 = s.encrypt(buf)
-
- # Output p7 in mail-friendly format.
- out = BIO.MemoryBuffer()
- out.write('From: sender@example.dom\n')
- out.write('To: recipient@example.dom\n')
- out.write('Subject: M2Crypto S/MIME testing\n')
- s.write(out, p7)
-
- print(out.read())
-
- # Save the PRNG's state.
- Rand.save_file('randpool.dat')
-
-Here's the output of the above program::
-
- From: sender@example.dom
- To: recipient@example.dom
- Subject: M2Crypto S/MIME testing
- MIME-Version: 1.0
- Content-Disposition: attachment; filename="smime.p7m"
- Content-Type: application/x-pkcs7-mime; name="smime.p7m"
- Content-Transfer-Encoding: base64
-
- MIIBVwYJKoZIhvcNAQcDoIIBSDCCAUQCAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
- BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
- ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
- KoZIhvcNAQEBBQAEgYCBaXZ+qjpBEZwdP7gjfzfAtQitESyMwo3i+LBOw6sSDir6
- FlNDPCnkrTvqDX3Rt6X6vBtTCYOm+qiN7ujPkOU61cN7h8dvHR8YW9+0IPY80/W0
- lZ/HihSRgwTNd7LnxUUcPx8YV1id0dlmP0Hz+Lg+mHf6rqaR//JcYhX9vW4XvjA7
- BgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECMN+qya6ADywgBgHr9Jkhwn5Gsdu7BwX
- nIQfYTYcdL9I5Sk=
-
-
-Decrypt
-=======
-
-Assume the above output has been saved into ``encrypt.p7``. Decrypt the
-message thusly::
-
- from M2Crypto import BIO, SMIME, X509
-
- # Instantiate an SMIME object.
- s = SMIME.SMIME()
-
- # Load private key and cert.
- s.load_key('recipient_key.pem', 'recipient.pem')
-
- # Load the encrypted data.
- p7, data = SMIME.smime_load_pkcs7('encrypt.p7')
-
- # Decrypt p7.
- out = s.decrypt(p7)
-
- print(out)
-
-Here's the output::
-
- a sign of our times
-
-
-Sign and Encrypt
-================
-
-Here's how to generate an S/MIME-signed/encrypted message::
-
- from M2Crypto import BIO, Rand, SMIME, X509
-
- def makebuf(text):
- return BIO.MemoryBuffer(text)
-
- # Make a MemoryBuffer of the message.
- buf = makebuf('a sign of our times')
-
- # Seed the PRNG.
- Rand.load_file('randpool.dat', -1)
-
- # Instantiate an SMIME object.
- s = SMIME.SMIME()
-
- # Load signer's key and cert. Sign the buffer.
- s.load_key('signer_key.pem', 'signer.pem')
- p7 = s.sign(buf)
-
- # Load target cert to encrypt the signed message to.
- x509 = X509.load_cert('recipient.pem')
- sk = X509.X509_Stack()
- sk.push(x509)
- s.set_x509_stack(sk)
-
- # Set cipher: 3-key triple-DES in CBC mode.
- s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
-
- # Create a temporary buffer.
- tmp = BIO.MemoryBuffer()
-
- # Write the signed message into the temporary buffer.
- s.write(tmp, p7)
-
- # Encrypt the temporary buffer.
- p7 = s.encrypt(tmp)
-
- # Output p7 in mail-friendly format.
- out = BIO.MemoryBuffer()
- out.write('From: sender@example.dom\n')
- out.write('To: recipient@example.dom\n')
- out.write('Subject: M2Crypto S/MIME testing\n')
- s.write(out, p7)
-
- print(out.read())
-
- # Save the PRNG's state.
- Rand.save_file('randpool.dat')
-
-Here's the output of the above program::
-
- From: sender@example.dom
- To: recipient@example.dom
- Subject: M2Crypto S/MIME testing
- MIME-Version: 1.0
- Content-Disposition: attachment; filename="smime.p7m"
- Content-Type: application/x-pkcs7-mime; name="smime.p7m"
- Content-Transfer-Encoding: base64
-
- MIIIwwYJKoZIhvcNAQcDoIIItDCCCLACAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
- BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
- ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
- KoZIhvcNAQEBBQAEgYBlZlGupFphwhsGtIAPvDExN61qisz3oem88xoXkUW0SzoR
- B9zJFFAuQTWzdNJgrKKYikhWjDojaAc/PFl1K5dYxRgtZLB36ULJD/v/yWmxnjz8
- TvtK+Wbal2P/MH2pZ4LVERXa/snTElhCawUlwtiFz/JvY5CiF/dcwd+AwFQq4jCC
- B6UGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIRF525UfwszaAggeA85RmX6AXQMxb
- eBDz/LJeCgc3RqU1UwIsbKMquIs1S46Ebbm5nP75izPnujOkJ2hv+LNzqOWADmOl
- +CnGEq1qxTyduIgUDA2nBgCL/gVyVy+/XC9dtImUUTxtxLgYtB0ujkBNsOaENOlM
- fv4SGM3jkR+K/xlYG6HHzZGbfYyNGj2Y7yMZ1rL1m8SnRNmkCysKGTrudeNf6wT9
- J6wO9DzLTioz3ZnVr3LjsSKIb4tIp4ugqNJaLuW7m3FtZ3MAgxN68hBbJs8TZ8tL
- V/0jwUqS+grcgZEb9ymfcedxahtDUfHjRkpDpsxZzVVGkSBNcbQu92oByQVnRQ8m
- wrYLp3/eawM5AvuV7HNpTT5ZR+1t8luishHN9899IMP2Vyg0Ub67FqFypYmM2cm2
- sjAI4KpfvT00XFNvgLuYwYEKs9syGTO7hiHNQKcF44F5LYv6nTFwmFQB11dAtY9V
- ull4D2CLDx9OvyNyKwdEZB5dyV0r/uKIdkhST60V2Q9KegpzgFpoZtSKM/HPYSVH
- 1Bc9f3Q/GqZCvNZZCMx8UvRjQR8dRWDSmPJ0VXG1+wJ+fCmSPP3AuQ1/VsgPRqx2
- 56VrpGPpGut40hV8xQFbWIZ2whwWLKPFAHj8B79ZtFUzUrU6Z2rNpvv8inHc/+S/
- b6GR5s8/gucRblvd7n3OFNX5UJmPmcw9zWbu/1Dr9DY8l0nAQh21y5FGSS8B1wdE
- oD2M3Lp7JbwjQbRtnDhImqul2S4yu+m+wDD1aR2K4k3GAI7KKgOBWT0+BDClcn8A
- 4Ju6/YUbj33YlMPJgnGijLnolFy0hNW7TmWqR+8tSI3wO5eNKg4qwBnarqc3vgCV
- quVxINAXyGQCO9lzdw6hudk8/+BlweGdqhONaIWbK5z1L/SfQo6LC9MTsj7FJydq
- bc+kEbfZS8aSq7uc9axW6Ti0eAPJ8EVHtwhSBgZQRweKFBXs6HbbhMIdc4N0M7Oq
- UiFXaF6s4n2uihVP6TqXtHEjTpZoC7pC+HCYiuKXUJtaqtXBOh+y3KLvHk09YL6D
- XmTDg+UTiFsh4jKKm/BhdelbR5JbpJcj5AId76Mfr8+F/1g9ePOvsWHpQr/oIQTo
- xEkaxCmzEgP0b6caMWfMUQrbVGxBBNcqKc/ir9fGGOPHATzzq/xLcQYvK1tZhd/D
- ah/gpMPndsyvVCEuFPluWyDiM0VkwHgC2/3pJIYFHaxK64IutmPsy393rHMEB4kN
- AHau6kWK+yL9qEVH1pP2zvswQ12P7gjt3T/G3bGsmvlXkEfztfjkXo6XnjcBNf5y
- G+974AKLcjnk1gzIgarz+lAMY57Gkw4oNDMrTqVQ2OJQlvOSbllPXzH+aAiavB8W
- ZPECLLwHxD4B1AuaiAArgKl935u/TOB+yQOR8JgGsUzROyJqHJ/SC51HkebgCkL1
- aggtjgPlIBEXLZAlhpWLZ9lAQyrQpvCVJYwaOvfMmvRav4NAFNoZ2/Q7S4Tn1z+U
- XX+f+GD58P4MPMhU5IKnz4yH4nlHnAiTEvcs85TZUAXze9g/uBOwZITeGtyLi52S
- aETIr4v7SgXMepX7ThQ1Pv/jddsK/u4j2F34u0XktwCP+UrbfkE2mocdXvdzxbmd
- tZSznK2qwgVSsPOs9MhUaepbnjmNBFFBrULhrUtSglM/VX/rWNiyh0aw4XYyHhIt
- 9ZNlfEjKjJ67VEMBxBJ/ieUCouRGCxPYD1j65VT7oB3ZiyPu2F2nlUIcYNqPg1Sd
- QBCrdaOXdJ0uLwyTAUeVE+wMbgscLvWsfZcCCJHAvw9NHFMUcnrdWxAYMVETNUOn
- uryVAK7VfOldaz6z3NOSOi6nonNeHpR/sipBa4ik5xCRLT9e0S2QJgRvO9GyfAqz
- 3DIzHtxIGePFzTiUYUTxS3i2gnMX2PEe3ChTLlYWD3jNeAKz0iOzpDphIF2xHLLQ
- 1tCAqBmq/vUzALyDFFdFuTIqQZys4z/u4Dmyq9uXs421eN3v2hkVHvDy8uT2Ot29
- lg4Q5YezR1EjaW//9guL1BXbcKrTEdtxeNqtem7SpZOMTSwD2lhB8z65GrX90Cyt
- EMmaRSGYEdf5h1afL1SmKOMskbqxe1D2jG/vsXC7XX7xO/ioy0BdiJcYN1JiMOHJ
- EOzFol5I20YkiV6j+cenfQFwc/NkaSxEkR8AUHJSbvUmRQRl6r0nnsFpZdR1w7pv
- wkaT+eOpZynO4mY/ZtF6MpXJsixi6L4ZYXEbS6yHf+XGFfB0okILylmwv2bf6+Mq
- nqXlmGj3Jwq7X9/+2BDqvfpFFX5lSmItKZAobLdssjFR6roJxOqRsGia2aZ+0+U5
- VhgdITtnElgtHBaeZU5rHDswgdeLVBP+rGWnKxpJ+pLtNNi25sPYRcWFL6Erd25u
- eXiY8GEIr+u7rqBWpc9HR34sAPRs3ubbCUleT748keCbx247ImBtiDctZxcc1O86
- +0QjHP6HUT7FSo/FmT7a120S3Gd2jixGh06l/9ij5Z6mJa7Rm7TTbSjup/XISnOT
- MKWcbI1nfVOhCv3xDq2eLae+s0oVoc041ceRazqFM2TL/Z6UXRME
-
-
-Decrypt and Verify
-==================
-
-Suppose the above output has been saved into ``se.p7``. The following
-demonstrates how to decrypt and verify it::
-
- from M2Crypto import BIO, SMIME, X509
-
- # Instantiate an SMIME object.
- s = SMIME.SMIME()
-
- # Load private key and cert.
- s.load_key('recipient_key.pem', 'recipient.pem')
-
- # Load the signed/encrypted data.
- p7, data = SMIME.smime_load_pkcs7('se.p7')
-
- # After the above step, 'data' == None.
- # Decrypt p7. 'out' now contains a PKCS #7 signed blob.
- out = s.decrypt(p7)
-
- # Load the signer's cert.
- x509 = X509.load_cert('signer.pem')
- sk = X509.X509_Stack()
- sk.push(x509)
- s.set_x509_stack(sk)
-
- # Load the signer's CA cert. In this case, because the signer's
- # cert is self-signed, it is the signer's cert itself.
- st = X509.X509_Store()
- st.load_info('signer.pem')
- s.set_x509_store(st)
-
- # Recall 'out' contains a PKCS #7 blob.
- # Transform 'out'; verify the resulting PKCS #7 blob.
- p7_bio = BIO.MemoryBuffer(out)
- p7, data = SMIME.smime_load_pkcs7_bio(p7_bio)
- v = s.verify(p7)
-
- print(v)
-
-
-The output is as follows::
-
- a sign of our times
-
-
-Sending S/MIME messages via SMTP
-================================
-
-In the above examples, we've assumed that our S/MIME messages are sent
-and received automagically. The following is a Python function that
-generates S/MIME-signed/encrypted messages and sends them via
-SMTP::
-
- from M2Crypto import BIO, SMIME, X509
- import smtplib, string, sys
-
- def sendsmime(from_addr, to_addrs, subject, msg, from_key, from_cert=None, to_certs=None, smtpd='localhost'):
-
- msg_bio = BIO.MemoryBuffer(msg)
- sign = from_key
- encrypt = to_certs
-
- s = SMIME.SMIME()
- if sign:
- s.load_key(from_key, from_cert)
- if encrypt:
- p7 = s.sign(msg_bio, flags=SMIME.PKCS7_TEXT)
- else:
- p7 = s.sign(msg_bio, flags=SMIME.PKCS7_TEXT|SMIME.PKCS7_DETACHED)
- msg_bio = BIO.MemoryBuffer(msg) # Recreate coz sign() has consumed it.
-
- if encrypt:
- sk = X509.X509_Stack()
- for x in to_certs:
- sk.push(X509.load_cert(x))
- s.set_x509_stack(sk)
- s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
- tmp_bio = BIO.MemoryBuffer()
- if sign:
- s.write(tmp_bio, p7)
- else:
- tmp_bio.write(msg)
- p7 = s.encrypt(tmp_bio)
-
- out = BIO.MemoryBuffer()
- out.write('From: %s\r\n' % from_addr)
- out.write('To: %s\r\n' % string.join(to_addrs, ", "))
- out.write('Subject: %s\r\n' % subject)
- if encrypt:
- s.write(out, p7)
- else:
- if sign:
- s.write(out, p7, msg_bio, SMIME.PKCS7_TEXT)
- else:
- out.write('\r\n')
- out.write(msg)
- out.close()
-
- smtp = smtplib.SMTP()
- smtp.connect(smtpd)
- smtp.sendmail(from_addr, to_addrs, out.read())
- smtp.quit()
-
-
-This function sends plain, S/MIME-signed, S/MIME-encrypted, and
-S/MIME-signed/encrypted messages, depending on the parameters
-``from_key`` and ``to_certs``. The function's output interoperates with
-Netscape Messenger.
-
-Verifying origin of S/MIME messages
-===================================
-
-In our examples above that decrypt or verify messages, we skipped a
-step: verifying that the ``from`` address of the message matches the
-``email address`` attribute in the sender's certificate.
-
-The premise of current X.509 certification practice is that the CA is
-supposed to verify your identity, and to issue a certificate with
-``email address`` that matches your actual mail address. (Verisign's
-March 2001 failure in identity verification resulting in Microsoft
-certificates being issued to spoofers notwithstanding.)
-
-If you run your own CA, your certification practice is up to you, of
-course, and it would probably be part of your security policy.
-
-Whether your S/MIME messaging application needs to verify the ``from``
-addresses of S/MIME messages depends on your security policy and your
-system's threat model, as always.
-
-Interoperating with Netscape Messenger
-======================================
-
-Suppose S/MIME Recipient uses Netscape Messenger. To enable Messenger to
-handle S/MIME messages from S/MIME Sender, S/MIME Recipient needs to
-configure Messenger with his private key and certificate, as well as
-S/MIME Sender's certificate.
-
- **Note:** Configuring Messenger's POP or IMAP settings so that it
- retrieves mail correctly is beyond the scope of this HOWTO.
-
-The following steps demonstrate how to import S/MIME Recipient's private
-key and certificate for Messenger:
-
-1. Transform S/MIME Recipient's private key and certificate into *PKCS
- #12* format::
-
- openssl pkcs12 -export -in recipient.pem -inkey recipient_key.pem \
- -name "S/MIME Recipient" -out recipient.p12
-
- Enter Export Password:<enter>
- Verifying password - Enter Export Password:<enter>
-
-2. Start Messenger.
-
-3. Click on the (open) "lock" icon at the bottom left corner of
- Messenger's window. This brings up the "Security Info" dialog box.
-
-4. Click on "Yours" under "Certificates".
-
-5. Select "Import a certificate", then pick ``recipient.p12`` from the
- ensuing file selection dialog box.
-
-Next, you need to import ``signer.pem`` as a CA certificate, so that
-Messenger will mark messages signed by S/MIME Sender as "trusted":
-
-1. Create a DER encoding of ``signer.pem``::
-
- openssl x509 -inform pem -outform der -in signer.pem -out signer.der
-
-2. Install ``signer.der`` into Messenger as MIME type
- ``application/x-x509-ca-cert``. You do this by downloading
- ``signer.der`` via Navigator from a HTTP or HTTPS server, with the
- correct MIME type mapping. (You may use ``demo/ssl/https_srv.py``,
- bundled with M2Crypto, for this purpose.) Follow the series of dialog
- boxes to accept ``signer.der`` as a CA for certifying email users.
-
-S/MIME Recipient is now able to decrypt and read S/MIME Sender's
-messages with Messenger. Messenger will indicate that S/MIME Sender's
-messages are signed, encrypted, or encrypted *and* signed, as the case
-may be, via the "stamp" icon on the message window's top right corner.
-
-Clicking on the "stamp" icon brings you to the Security Info dialog box.
-Messenger informs you that the message is, say, encrypted with 168-bit
-DES-EDE3-CBC and that it is digitally signed by the private key
-corresponding to the public key contained in the certificate
-``signer.pem``.
-
-Interoperating with Microsoft Outlook
-=====================================
-
-I do not know how to do this, as I do not use Outlook. (Nor do I use
-Netscape Messenger, actually. I use Mutt, top dog of MUAs. ;-)
-Information on how to configure Outlook with keys and certificates so
-that it handles S/MIME mail is gratefully accepted.
-
-ZSmime
-======
-
-ZSmime is a `Zope <http://www.zope.org>`__ *product* that enables Zope
-to generate S/MIME-signed/encrypted messages. ZSmime demonstrates how to
-invoke M2Crypto in a web application server extension.
-
-ZSmime has its own
-`HOWTO <http://sandbox.rulemaker.net/ngps/zope/zsmime/howto.html>`__
-explaining its usage. (That HOWTO has some overlap in content with this
-document.)
-
-Resources
-=========
-
-- IETF S/MIME Working Group - http://www.imc.org/ietf-smime
-
-- S/MIME and OpenPGP - http://www.imc.org/smime-pgpmime.html
-
-- S/MIME Freeware Library -
- http://www.getronicsgov.com/hot/sfl_home.htm
-
-- Mozilla Network Security Services -
- http://www.mozilla.org/projects/security/pkg/nss
-
-- S/MIME Cracking Screen Saver - http://www.counterpane.com/smime.html
diff --git a/doc/html/_sources/howto.ssl.txt b/doc/html/_sources/howto.ssl.txt
deleted file mode 100644
index 7f3278c..0000000
--- a/doc/html/_sources/howto.ssl.txt
+++ /dev/null
@@ -1,131 +0,0 @@
-:orphan:
-
-.. _howto-ssl:
-
-HOWTO: Programming SSL in Python with M2Crypto
-==============================================
-
-:author: Pheng Siong Ng <ngps@netmemetic.com> and Heikki Toivonen (heikki@osafoundation.org)
-:copyright: © 2000, 2001 by Ng Pheng Siong,
- portions © 2006 by Open Source Applications Foundation
-
-Introduction
-============
-
-`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ is a
-`Python <http://www.python.org>`__ interface to
-`OpenSSL <http://www.openssl.org>`__. It makes available to the Python
-programmer SSL functionality to implement clients and servers, S/MIME
-v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.
-
-This document demonstrates programming HTTPS with M2Crypto.
-
-A bit of history
-================
-
-M2Crypto was created during the time of Python 1.5, which features a
-module httplib providing client-side HTTP functionality. M2Crypto sports
-a httpslib based on httplib.
-
-Beginning with version 2.0, Python's socket module provided
-(rudimentary) SSL support. Also in the same version, httplib was
-enhanced with class HTTPConnection, which is more sophisticated than the
-old class HTTP, and HTTPSConnection, which does HTTPS.
-
-Subsequently, M2Crypto.httpslib grew a compatible (but not identical)
-class HTTPSConnection.
-
-The primary interface difference between the two HTTPSConnection classes
-is that M2Crypto's version accepts an M2Crypto.SSL.Context instance as a
-parameter, whereas Python 2.x's SSL support does not permit Pythonic
-control of the SSL context.
-
-Within the implementations, Python's ``HTTPSConnection`` employs a
-``FakeSocket`` object, which collects all input from the SSL connection
-before returning it to the application as a ``StringIO`` buffer, whereas
-M2Crypto's ``HTTPSConnection`` uses a buffering
-``M2Crypto.BIO.IOBuffer`` object that works over the underlying
-M2Crypto.SSL.Connection directly.
-
-Since then M2Crypto has gained a Twisted wrapper that allows securing
-Twisted SSL connections with M2Crypto.
-
-Secure SSL
-==========
-
-It is recommended that you read the book Network Security with OpenSSL
-by John Viega, Matt Messier and Pravir Chandra, ISBN 059600270X.
-
-Using M2Crypto does not automatically make an SSL connection secure.
-There are various steps that need to be made before we can make that
-claim. Let's see how a simple client can establish a secure
-connection::
-
- ctx = SSL.Context()
- ctx.set_verify(SSL.verify_peer | SSL.verify_fail_if_no_peer_cert, depth=9)
- if ctx.load_verify_locations('ca.pem') != 1: raise Exception('No CA certs')
- s = SSL.Connection(ctx)
- s.connect(server_address)
- # Normal protocol (for example HTTP) commands follow
-
-The first line creates an SSL context. The defaults allow any SSL
-version (except SSL version 2 which has known weaknesses) and sets the
-allowed ciphers to secure ones.
-
-The second line tells M2Crypto to perform certificate validation. The
-flags shown above are typical for clients, and requires the server to
-send a certificate. The depth parameter tells how long certificate
-chains are allowed - 9 is pretty common default, although probably too
-long in practice.
-
-The third line loads the allowed root (certificate authority or CA)
-certificates. Most Linux distributions come with CA certificates in
-suitable format. You could also download the
-`certdata.txt <http://mxr.mozilla.org/seamonkey/source//security/nss/lib/ckfw/builtins/certdata.txt?raw=1>`__
-file from the
-`NSS <http://www.mozilla.org/projects/security/pki/nss/>`__ project and
-convert it with the little M2Crypto utility script
-`demo/x509/certdata2pem.py <http://svn.osafoundation.org/m2crypto/trunk/demo/x509/certdata2pem.py>`__.
-
-The fourth line creates an SSL connection object with the secure
-context.
-
-The fifth line connects to the server. During this time we perform the
-last security step: just after connection, but before exchanging any
-data, we compare the commonName (or subjectAltName DNS field) field in
-the certificate the server returned to the server address we tried to
-connect to. This happens automatically with SSL.Connection and the
-Twisted wrapper class, and anything that uses those. In all other cases
-you must do the check manually. It is recommended you call the
-SSL.Checker to do the actual check.
-
-SSL servers are different in that they typically do not require the
-client to send a certificate, so there is usually no certificate
-checking. Also, it is typically useless to perform host name checking.
-
-Code Samples
-============
-
-The best samples of how to use the various SSL objects are in the tests
-directory, and the test\_ssl.py file specifically. There are additional
-samples in the demo directory, but they are not quaranteed to be up to
-date.
-
-NOTE: The tests and demos may not be secure as is. Use the information
-above on how to make them secure.
-
-ssldump
-=======
-
-ssldump "is an SSLv3/TLS network protocol analyser. It identifies TCP
-connections on the chosen network interface and attempts to interpret
-them as SSLv3/TLS traffic. When it identifies SSLv3/TLS traffic, it
-decodes the records and displays them in a textual form to stdout. If
-provided with the appropriate keying material, it will also decrypt the
-connections and display the application data traffic.
-
-If linked with OpenSSL, ssldump can display certificates in decoded form
-and decrypt traffic (provided that it has the appropriate keying
-material)."
-
-ssldump is written by Eric Rescorla.
diff --git a/doc/html/_sources/index.txt b/doc/html/_sources/index.txt
deleted file mode 100644
index a472668..0000000
--- a/doc/html/_sources/index.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Welcome to M2Crypto's documentation!
-====================================
-
-Contents:
-
-.. toctree::
- :maxdepth: 4
-
- M2Crypto
-
-
-HOWTOs
-======
-
-* :ref:`howto-ca`
-
-* :ref:`howto-ssl`
-
-* :ref:`howto-smime`
-
-* :ref:`zserverssl-howto`
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
diff --git a/doc/html/_static/alabaster.css b/doc/html/_static/alabaster.css
index a88ce29..0eddaeb 100644
--- a/doc/html/_static/alabaster.css
+++ b/doc/html/_static/alabaster.css
@@ -1,61 +1,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
- font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif;
+ font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
@@ -159,7 +107,7 @@ div.sphinxsidebarwrapper p.blurb {
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
- font-family: 'Garamond', 'Georgia', serif;
+ font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
@@ -203,7 +151,7 @@ div.sphinxsidebar ul li.toctree-l2 > a {
div.sphinxsidebar input {
border: 1px solid #CCC;
- font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif;
+ font-family: Georgia, serif;
font-size: 1em;
}
@@ -218,6 +166,19 @@ div.sphinxsidebar hr {
width: 50%;
}
+div.sphinxsidebar .badge {
+ border-bottom: none;
+}
+
+div.sphinxsidebar .badge:hover {
+ border-bottom: none;
+}
+
+/* To address an issue with donation coming after search */
+div.sphinxsidebar h3.donation {
+ margin-top: 10px;
+}
+
/* -- body styles ----------------------------------------------------------- */
a {
@@ -236,7 +197,7 @@ div.body h3,
div.body h4,
div.body h5,
div.body h6 {
- font-family: 'Garamond', 'Georgia', serif;
+ font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
@@ -272,17 +233,12 @@ div.admonition {
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
- background-color: ;
+ background-color: #FBFBFB;
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-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
@@ -371,7 +327,7 @@ p.admonition-title:after {
}
pre, tt, code {
- font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
@@ -443,6 +399,16 @@ table.field-list p {
margin-bottom: 0.8em;
}
+/* Cloned from
+ * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
+ */
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
@@ -488,11 +454,6 @@ dl pre, blockquote pre, li pre {
padding-left: 30px;
}
-dl dl pre {
- margin-left: -90px;
- padding-left: 90px;
-}
-
tt, code {
background-color: #ecf0f3;
color: #222;
@@ -690,4 +651,51 @@ table.docutils.citation, table.docutils.citation td, table.docutils.citation th
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
+}
+
+
+/* relbar */
+
+.related {
+ line-height: 30px;
+ width: 100%;
+ font-size: 0.9rem;
+}
+
+.related.top {
+ border-bottom: 1px solid #EEE;
+ margin-bottom: 20px;
+}
+
+.related.bottom {
+ border-top: 1px solid #EEE;
+}
+
+.related ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.related li {
+ display: inline;
+}
+
+nav#rellinks {
+ float: right;
+}
+
+nav#rellinks li+li:before {
+ content: "|";
+}
+
+nav#breadcrumbs li+li:before {
+ content: "\00BB";
+}
+
+/* Hide certain items when printing */
+@media print {
+ div.related {
+ display: none;
+ }
} \ No newline at end of file
diff --git a/doc/html/_static/basic.css b/doc/html/_static/basic.css
index 6df76b0..0807176 100644
--- a/doc/html/_static/basic.css
+++ b/doc/html/_static/basic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -81,10 +81,26 @@ div.sphinxsidebar input {
font-size: 1em;
}
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
div.sphinxsidebar #searchbox input[type="text"] {
- width: 170px;
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
}
+
img {
border: 0;
max-width: 100%;
@@ -199,6 +215,11 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */
+div.body {
+ min-width: 450px;
+ max-width: 800px;
+}
+
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
@@ -332,6 +353,11 @@ table.docutils {
border-collapse: collapse;
}
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
table caption span.caption-number {
font-style: italic;
}
@@ -405,6 +431,13 @@ table.field-list td, table.field-list th {
hyphens: manual;
}
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist td {
+ vertical-align: top;
+}
+
+
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
@@ -445,10 +478,14 @@ dd {
margin-left: 30px;
}
-dt:target, .highlighted {
+dt:target, span.highlighted {
background-color: #fbe54e;
}
+rect.highlighted {
+ fill: #fbe54e;
+}
+
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
diff --git a/doc/html/_static/default.css b/doc/html/_static/default.css
deleted file mode 100644
index 21f3f50..0000000
--- a/doc/html/_static/default.css
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * default.css_t
- * ~~~~~~~~~~~~~
- *
- * Sphinx stylesheet -- default theme.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-/* -- page layout ----------------------------------------------------------- */
-
-body {
- font-family: sans-serif;
- font-size: 100%;
- background-color: #11303d;
- color: #000;
- margin: 0;
- padding: 0;
-}
-
-div.document {
- background-color: #1c4e63;
-}
-
-div.documentwrapper {
- float: left;
- width: 100%;
-}
-
-div.bodywrapper {
- margin: 0 0 0 230px;
-}
-
-div.body {
- background-color: #ffffff;
- color: #000000;
- padding: 0 20px 30px 20px;
-}
-
-div.footer {
- color: #ffffff;
- width: 100%;
- padding: 9px 0 9px 0;
- text-align: center;
- font-size: 75%;
-}
-
-div.footer a {
- color: #ffffff;
- text-decoration: underline;
-}
-
-div.related {
- background-color: #133f52;
- line-height: 30px;
- color: #ffffff;
-}
-
-div.related a {
- color: #ffffff;
-}
-
-div.sphinxsidebar {
-}
-
-div.sphinxsidebar h3 {
- font-family: 'Trebuchet MS', sans-serif;
- color: #ffffff;
- font-size: 1.4em;
- font-weight: normal;
- margin: 0;
- padding: 0;
-}
-
-div.sphinxsidebar h3 a {
- color: #ffffff;
-}
-
-div.sphinxsidebar h4 {
- font-family: 'Trebuchet MS', sans-serif;
- color: #ffffff;
- font-size: 1.3em;
- font-weight: normal;
- margin: 5px 0 0 0;
- padding: 0;
-}
-
-div.sphinxsidebar p {
- color: #ffffff;
-}
-
-div.sphinxsidebar p.topless {
- margin: 5px 10px 10px 10px;
-}
-
-div.sphinxsidebar ul {
- margin: 10px;
- padding: 0;
- color: #ffffff;
-}
-
-div.sphinxsidebar a {
- color: #98dbcc;
-}
-
-div.sphinxsidebar input {
- border: 1px solid #98dbcc;
- font-family: sans-serif;
- font-size: 1em;
-}
-
-
-
-/* -- hyperlink styles ------------------------------------------------------ */
-
-a {
- color: #355f7c;
- text-decoration: none;
-}
-
-a:visited {
- color: #355f7c;
- text-decoration: none;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-
-
-/* -- body styles ----------------------------------------------------------- */
-
-div.body h1,
-div.body h2,
-div.body h3,
-div.body h4,
-div.body h5,
-div.body h6 {
- font-family: 'Trebuchet MS', sans-serif;
- background-color: #f2f2f2;
- font-weight: normal;
- color: #20435c;
- border-bottom: 1px solid #ccc;
- margin: 20px -20px 10px -20px;
- padding: 3px 0 3px 10px;
-}
-
-div.body h1 { margin-top: 0; font-size: 200%; }
-div.body h2 { font-size: 160%; }
-div.body h3 { font-size: 140%; }
-div.body h4 { font-size: 120%; }
-div.body h5 { font-size: 110%; }
-div.body h6 { font-size: 100%; }
-
-a.headerlink {
- color: #c60f0f;
- font-size: 0.8em;
- padding: 0 4px 0 4px;
- text-decoration: none;
-}
-
-a.headerlink:hover {
- background-color: #c60f0f;
- color: white;
-}
-
-div.body p, div.body dd, div.body li {
- text-align: justify;
- line-height: 130%;
-}
-
-div.admonition p.admonition-title + p {
- display: inline;
-}
-
-div.admonition p {
- margin-bottom: 5px;
-}
-
-div.admonition pre {
- margin-bottom: 5px;
-}
-
-div.admonition ul, div.admonition ol {
- margin-bottom: 5px;
-}
-
-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 {
- padding: 5px;
- background-color: #eeffcc;
- color: #333333;
- line-height: 120%;
- border: 1px solid #ac9;
- border-left: none;
- border-right: none;
-}
-
-tt {
- background-color: #ecf0f3;
- padding: 0 1px 0 1px;
- font-size: 0.95em;
-}
-
-th {
- background-color: #ede;
-}
-
-.warning tt {
- background: #efc2c2;
-}
-
-.note tt {
- background: #d6d6d6;
-}
-
-.viewcode-back {
- font-family: sans-serif;
-}
-
-div.viewcode-block:target {
- background-color: #f4debf;
- border-top: 1px solid #ac9;
- border-bottom: 1px solid #ac9;
-} \ No newline at end of file
diff --git a/doc/html/_static/doctools.js b/doc/html/_static/doctools.js
index 5654977..344db17 100644
--- a/doc/html/_static/doctools.js
+++ b/doc/html/_static/doctools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for all documentation.
*
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -45,7 +45,7 @@ jQuery.urlencode = encodeURIComponent;
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
- if (typeof s == 'undefined')
+ if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
@@ -66,29 +66,55 @@ jQuery.getQueryParameters = function(s) {
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
- function highlight(node) {
- if (node.nodeType == 3) {
+ function highlight(node, addItems) {
+ if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
- if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
- var span = document.createElement("span");
- span.className = className;
+ if (pos >= 0 &&
+ !jQuery(node.parentNode).hasClass(className) &&
+ !jQuery(node.parentNode).hasClass("nohighlight")) {
+ var span;
+ var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.className = className;
+ }
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
+ if (isInSVG) {
+ var bbox = span.getBBox();
+ var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute('class', className);
+ var parentOfText = node.parentNode.parentNode;
+ addItems.push({
+ "parent": node.parentNode,
+ "target": rect});
+ }
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
- highlight(this);
+ highlight(this, addItems);
});
}
}
- return this.each(function() {
- highlight(this);
+ var addItems = [];
+ var result = this.each(function() {
+ highlight(this, addItems);
});
+ for (var i = 0; i < addItems.length; ++i) {
+ jQuery(addItems[i].parent).before(addItems[i].target);
+ }
+ return result;
};
/*
@@ -124,28 +150,30 @@ var Documentation = {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
-
+ if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) {
+ this.initOnKeyListeners();
+ }
},
/**
* i18n support
*/
TRANSLATIONS : {},
- PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+ PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
- if (typeof translated == 'undefined')
+ if (typeof translated === 'undefined')
return string;
- return (typeof translated == 'string') ? translated : translated[0];
+ return (typeof translated === 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
- if (typeof translated == 'undefined')
+ if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
@@ -180,7 +208,7 @@ var Documentation = {
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
- if (document.location.hash)
+ if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
@@ -216,7 +244,7 @@ var Documentation = {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
- if (src.substr(-9) == 'minus.png')
+ if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
@@ -248,7 +276,7 @@ var Documentation = {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
- if (this == '..')
+ if (this === '..')
parts.pop();
});
var url = parts.join('/');
@@ -284,4 +312,4 @@ _ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
-}); \ No newline at end of file
+});
diff --git a/doc/html/_static/documentation_options.js b/doc/html/_static/documentation_options.js
new file mode 100644
index 0000000..d28647e
--- /dev/null
+++ b/doc/html/_static/documentation_options.js
@@ -0,0 +1,10 @@
+var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
+ VERSION: '',
+ LANGUAGE: 'None',
+ COLLAPSE_INDEX: false,
+ FILE_SUFFIX: '.html',
+ HAS_SOURCE: true,
+ SOURCELINK_SUFFIX: '.txt',
+ NAVIGATION_WITH_KEYS: false,
+}; \ No newline at end of file
diff --git a/doc/html/_static/jquery-3.1.0.js b/doc/html/_static/jquery-3.2.1.js
index f2fc274..d2d8ca4 100644
--- a/doc/html/_static/jquery-3.1.0.js
+++ b/doc/html/_static/jquery-3.2.1.js
@@ -1,16 +1,15 @@
-/*eslint-disable no-unused-vars*/
/*!
- * jQuery JavaScript Library v3.1.0
+ * jQuery JavaScript Library v3.2.1
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright jQuery Foundation and other contributors
+ * Copyright JS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2016-07-07T21:44Z
+ * Date: 2017-03-20T18:59Z
*/
( function( global, factory ) {
@@ -83,13 +82,13 @@ var support = {};
doc.head.appendChild( script ).parentNode.removeChild( script );
}
/* global Symbol */
-// Defining this global in .eslintrc would create a danger of using the global
+// Defining this global in .eslintrc.json would create a danger of using the global
// unguarded in another place, it seems safer to define global only for this module
var
- version = "3.1.0",
+ version = "3.2.1",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -129,13 +128,14 @@ jQuery.fn = jQuery.prototype = {
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function( num ) {
- return num != null ?
- // Return just the one element from the set
- ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
- // Return all the elements in a clean array
- slice.call( this );
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
},
// Take an array of elements and push it onto the stack
@@ -236,11 +236,11 @@ jQuery.extend = jQuery.fn.extend = function() {
// Recurse if we're merging plain objects or arrays
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
- ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
if ( copyIsArray ) {
copyIsArray = false;
- clone = src && jQuery.isArray( src ) ? src : [];
+ clone = src && Array.isArray( src ) ? src : [];
} else {
clone = src && jQuery.isPlainObject( src ) ? src : {};
@@ -279,8 +279,6 @@ jQuery.extend( {
return jQuery.type( obj ) === "function";
},
- isArray: Array.isArray,
-
isWindow: function( obj ) {
return obj != null && obj === obj.window;
},
@@ -355,10 +353,6 @@ jQuery.extend( {
return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
},
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
- },
-
each: function( obj, callback ) {
var length, i = 0;
@@ -543,14 +537,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.0
+ * Sizzle CSS Selector Engine v2.3.3
* https://sizzlejs.com/
*
* Copyright jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
- * Date: 2016-01-04
+ * Date: 2016-08-08
*/
(function( window ) {
@@ -696,7 +690,7 @@ var i,
// CSS string/identifier serialization
// https://drafts.csswg.org/cssom/#common-serializing-idioms
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
fcssescape = function( ch, asCodePoint ) {
if ( asCodePoint ) {
@@ -723,7 +717,7 @@ var i,
disabledAncestor = addCombinator(
function( elem ) {
- return elem.disabled === true;
+ return elem.disabled === true && ("form" in elem || "label" in elem);
},
{ dir: "parentNode", next: "legend" }
);
@@ -1009,26 +1003,54 @@ function createButtonPseudo( type ) {
* @param {Boolean} disabled true for :disabled; false for :enabled
*/
function createDisabledPseudo( disabled ) {
- // Known :disabled false positives:
- // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset)
- // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
return function( elem ) {
- // Check form elements and option elements for explicit disabling
- return "label" in elem && elem.disabled === disabled ||
- "form" in elem && elem.disabled === disabled ||
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
- // Check non-disabled form elements for fieldset[disabled] ancestors
- "form" in elem && elem.disabled === false && (
- // Support: IE6-11+
- // Ancestry is covered for us
- elem.isDisabled === disabled ||
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
- // Otherwise, assume any non-<option> under fieldset[disabled] is disabled
- /* jshint -W018 */
- elem.isDisabled !== !disabled &&
- ("label" in elem || !disabledAncestor( elem )) !== disabled
- );
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ disabledAncestor( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
};
}
@@ -1144,25 +1166,21 @@ setDocument = Sizzle.setDocument = function( node ) {
return !document.getElementsByName || !document.getElementsByName( expando ).length;
});
- // ID find and filter
+ // ID filter and find
if ( support.getById ) {
- Expr.find["ID"] = function( id, context ) {
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
- var m = context.getElementById( id );
- return m ? [ m ] : [];
- }
- };
Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
return elem.getAttribute("id") === attrId;
};
};
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
} else {
- // Support: IE6/7
- // getElementById is not reliable as a find shortcut
- delete Expr.find["ID"];
-
Expr.filter["ID"] = function( id ) {
var attrId = id.replace( runescape, funescape );
return function( elem ) {
@@ -1171,6 +1189,36 @@ setDocument = Sizzle.setDocument = function( node ) {
return node && node.value === attrId;
};
};
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( (elem = elems[i++]) ) {
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
}
// Tag
@@ -2211,6 +2259,7 @@ function addCombinator( matcher, combinator, base ) {
return matcher( elem, context, xml );
}
}
+ return false;
} :
// Check against all ancestor/preceding elements
@@ -2255,6 +2304,7 @@ function addCombinator( matcher, combinator, base ) {
}
}
}
+ return false;
};
}
@@ -2617,8 +2667,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
// Reduce context if the leading compound selector is an ID
tokens = match[0] = match[0].slice( 0 );
if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
- support.getById && context.nodeType === 9 && documentIsHTML &&
- Expr.relative[ tokens[1].type ] ) {
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
if ( !context ) {
@@ -2788,6 +2837,13 @@ var siblings = function( n, elem ) {
var rneedsContext = jQuery.expr.match.needsContext;
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -2800,24 +2856,29 @@ function winnow( elements, qualifier, not ) {
return jQuery.grep( elements, function( elem, i ) {
return !!qualifier.call( elem, i, elem ) !== not;
} );
-
}
+ // Single element
if ( qualifier.nodeType ) {
return jQuery.grep( elements, function( elem ) {
return ( elem === qualifier ) !== not;
} );
-
}
- if ( typeof qualifier === "string" ) {
- if ( risSimple.test( qualifier ) ) {
- return jQuery.filter( qualifier, elements, not );
- }
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
- qualifier = jQuery.filter( qualifier, elements );
+ // Simple selector that can be filtered directly, removing non-Elements
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
}
+ // Complex selector, compare the two sets, removing non-Elements
+ qualifier = jQuery.filter( qualifier, elements );
return jQuery.grep( elements, function( elem ) {
return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
} );
@@ -2830,11 +2891,13 @@ jQuery.filter = function( expr, elems, not ) {
expr = ":not(" + expr + ")";
}
- return elems.length === 1 && elem.nodeType === 1 ?
- jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
- jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
- return elem.nodeType === 1;
- } ) );
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
};
jQuery.fn.extend( {
@@ -3132,7 +3195,18 @@ jQuery.each( {
return siblings( elem.firstChild );
},
contents: function( elem ) {
- return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ if ( nodeName( elem, "iframe" ) ) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
@@ -3162,14 +3236,14 @@ jQuery.each( {
return this.pushStack( matched );
};
} );
-var rnotwhite = ( /\S+/g );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
var object = {};
- jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
object[ flag ] = true;
} );
return object;
@@ -3230,7 +3304,7 @@ jQuery.Callbacks = function( options ) {
fire = function() {
// Enforce single-firing
- locked = options.once;
+ locked = locked || options.once;
// Execute callbacks for all pending executions,
// respecting firingIndex overrides and runtime changes
@@ -3399,7 +3473,7 @@ function Thrower( ex ) {
throw ex;
}
-function adoptValue( value, resolve, reject ) {
+function adoptValue( value, resolve, reject, noValue ) {
var method;
try {
@@ -3415,9 +3489,10 @@ function adoptValue( value, resolve, reject ) {
// Other non-thenables
} else {
- // Support: Android 4.0 only
- // Strict mode functions invoked without .call/.apply get global-object context
- resolve.call( undefined, value );
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
}
// For Promises/A+, convert exceptions into rejections
@@ -3427,7 +3502,7 @@ function adoptValue( value, resolve, reject ) {
// Support: Android 4.0 only
// Strict mode functions invoked without .call/.apply get global-object context
- reject.call( undefined, value );
+ reject.apply( undefined, [ value ] );
}
}
@@ -3752,7 +3827,8 @@ jQuery.extend( {
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject );
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ !remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
if ( master.state() === "pending" ||
@@ -3824,15 +3900,6 @@ jQuery.extend( {
// the ready event fires. See #6781
readyWait: 1,
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
// Handle when the DOM is ready
ready: function( wait ) {
@@ -3934,13 +4001,16 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
}
}
- return chainable ?
- elems :
+ if ( chainable ) {
+ return elems;
+ }
- // Gets
- bulk ?
- fn.call( elems ) :
- len ? fn( elems[ 0 ], key ) : emptyGet;
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
};
var acceptData = function( owner ) {
@@ -4065,7 +4135,7 @@ Data.prototype = {
if ( key !== undefined ) {
// Support array or space separated string of keys
- if ( jQuery.isArray( key ) ) {
+ if ( Array.isArray( key ) ) {
// If key is an array of keys...
// We always set camelCase keys, so remove that.
@@ -4077,7 +4147,7 @@ Data.prototype = {
// Otherwise, create an array by matching non-whitespace
key = key in cache ?
[ key ] :
- ( key.match( rnotwhite ) || [] );
+ ( key.match( rnothtmlwhite ) || [] );
}
i = key.length;
@@ -4125,6 +4195,31 @@ var dataUser = new Data();
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash = /[A-Z]/g;
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
function dataAttr( elem, key, data ) {
var name;
@@ -4136,14 +4231,7 @@ function dataAttr( elem, key, data ) {
if ( typeof data === "string" ) {
try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
-
- // Only convert to a number if it doesn't change the string
- +data + "" === data ? +data :
- rbrace.test( data ) ? JSON.parse( data ) :
- data;
+ data = getData( data );
} catch ( e ) {}
// Make sure we set the data so it isn't changed later
@@ -4273,7 +4361,7 @@ jQuery.extend( {
// Speed up dequeue by getting out quickly if this is just a lookup
if ( data ) {
- if ( !queue || jQuery.isArray( data ) ) {
+ if ( !queue || Array.isArray( data ) ) {
queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
} else {
queue.push( data );
@@ -4520,7 +4608,7 @@ function getDefaultDisplay( elem ) {
return display;
}
- temp = doc.body.appendChild( doc.createElement( nodeName ) ),
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
display = jQuery.css( temp, "display" );
temp.parentNode.removeChild( temp );
@@ -4638,15 +4726,23 @@ function getAll( context, tag ) {
// Support: IE <=9 - 11 only
// Use typeof to avoid zero-argument method invocation on host objects (#15151)
- var ret = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( tag || "*" ) :
- typeof context.querySelectorAll !== "undefined" ?
- context.querySelectorAll( tag || "*" ) :
- [];
-
- return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
- jQuery.merge( [ context ], ret ) :
- ret;
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
}
@@ -4920,7 +5016,7 @@ jQuery.event = {
}
// Handle multiple events separated by a space
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
@@ -5002,7 +5098,7 @@ jQuery.event = {
}
// Once for each type.namespace in types; type may be omitted
- types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
t = types.length;
while ( t-- ) {
tmp = rtypenamespace.exec( types[ t ] ) || [];
@@ -5128,51 +5224,58 @@ jQuery.event = {
},
handlers: function( event, handlers ) {
- var i, matches, sel, handleObj,
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
handlerQueue = [],
delegateCount = handlers.delegateCount,
cur = event.target;
- // Support: IE <=9
// Find delegate handlers
- // Black-hole SVG <use> instance trees (#13180)
- //
- // Support: Firefox <=42
- // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
- if ( delegateCount && cur.nodeType &&
- ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG <use> instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
for ( ; cur !== this; cur = cur.parentNode || this ) {
// Don't check non-elements (#13208)
// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
- if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
- matches = [];
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
for ( i = 0; i < delegateCount; i++ ) {
handleObj = handlers[ i ];
// Don't conflict with Object.prototype properties (#13203)
sel = handleObj.selector + " ";
- if ( matches[ sel ] === undefined ) {
- matches[ sel ] = handleObj.needsContext ?
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
jQuery( sel, this ).index( cur ) > -1 :
jQuery.find( sel, this, null, [ cur ] ).length;
}
- if ( matches[ sel ] ) {
- matches.push( handleObj );
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
}
}
- if ( matches.length ) {
- handlerQueue.push( { elem: cur, handlers: matches } );
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
}
}
}
}
// Add the remaining (directly-bound) handlers
+ cur = this;
if ( delegateCount < handlers.length ) {
- handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
}
return handlerQueue;
@@ -5242,7 +5345,7 @@ jQuery.event = {
// For checkbox, fire native event so checked state will be right
trigger: function() {
- if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
this.click();
return false;
}
@@ -5250,7 +5353,7 @@ jQuery.event = {
// For cross-browser consistency, don't fire native .click() on links
_default: function( event ) {
- return jQuery.nodeName( event.target, "a" );
+ return nodeName( event.target, "a" );
}
},
@@ -5406,7 +5509,19 @@ jQuery.each( {
// Add which for click: 1 === left; 2 === middle; 3 === right
if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- return ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ if ( button & 1 ) {
+ return 1;
+ }
+
+ if ( button & 2 ) {
+ return 3;
+ }
+
+ if ( button & 4 ) {
+ return 2;
+ }
+
+ return 0;
}
return event.which;
@@ -5515,11 +5630,12 @@ var
rscriptTypeMasked = /^true\/(.*)/,
rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+// Prefer a tbody over its parent table for containing new rows
function manipulationTarget( elem, content ) {
- if ( jQuery.nodeName( elem, "table" ) &&
- jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+ if ( nodeName( elem, "table" ) &&
+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
- return elem.getElementsByTagName( "tbody" )[ 0 ] || elem;
+ return jQuery( ">tbody", elem )[ 0 ] || elem;
}
return elem;
@@ -6049,12 +6165,18 @@ var getStyles = function( elem ) {
function curCSS( elem, name, computed ) {
var width, minWidth, maxWidth, ret,
+
+ // Support: Firefox 51+
+ // Retrieving style before computed somehow
+ // fixes an issue with getting wrong values
+ // on detached elements
style = elem.style;
computed = computed || getStyles( elem );
- // Support: IE <=9 only
- // getPropertyValue is only needed for .css('filter') (#12537)
+ // getPropertyValue is needed for:
+ // .css('filter') (IE 9 only, #12537)
+ // .css('--customProperty) (#3144)
if ( computed ) {
ret = computed.getPropertyValue( name ) || computed[ name ];
@@ -6120,6 +6242,7 @@ var
// except "table", "table-cell", or "table-caption"
// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rcustomProp = /^--/,
cssShow = { position: "absolute", visibility: "hidden", display: "block" },
cssNormalTransform = {
letterSpacing: "0",
@@ -6149,6 +6272,16 @@ function vendorPropName( name ) {
}
}
+// Return a property mapped along what jQuery.cssProps suggests or to
+// a vendor prefixed property.
+function finalPropName( name ) {
+ var ret = jQuery.cssProps[ name ];
+ if ( !ret ) {
+ ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
+ }
+ return ret;
+}
+
function setPositiveNumber( elem, value, subtract ) {
// Any relative (+/-) values have already been
@@ -6162,15 +6295,17 @@ function setPositiveNumber( elem, value, subtract ) {
}
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
- var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
- // If we already have the right measurement, avoid augmentation
- 4 :
+ var i,
+ val = 0;
- // Otherwise initialize for horizontal or vertical properties
- name === "width" ? 1 : 0,
+ // If we already have the right measurement, avoid augmentation
+ if ( extra === ( isBorderBox ? "border" : "content" ) ) {
+ i = 4;
- val = 0;
+ // Otherwise initialize for horizontal or vertical properties
+ } else {
+ i = name === "width" ? 1 : 0;
+ }
for ( ; i < 4; i += 2 ) {
@@ -6207,44 +6342,31 @@ function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight( elem, name, extra ) {
- // Start with offset property, which is equivalent to the border-box value
- var val,
- valueIsBorderBox = true,
+ // Start with computed style
+ var valueIsBorderBox,
styles = getStyles( elem ),
+ val = curCSS( elem, name, styles ),
isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
- // Support: IE <=11 only
- // Running getBoundingClientRect on a disconnected node
- // in IE throws an error.
- if ( elem.getClientRects().length ) {
- val = elem.getBoundingClientRect()[ name ];
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test( val ) ) {
+ return val;
}
- // Some non-html elements return undefined for offsetWidth, so check for null/undefined
- // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
- // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
- if ( val <= 0 || val == null ) {
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, styles );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ];
- }
-
- // Computed unit is not pixels. Stop here and return.
- if ( rnumnonpx.test( val ) ) {
- return val;
- }
-
- // Check for style in case a browser which returns unreliable values
- // for getComputedStyle silently falls back to the reliable elem.style
- valueIsBorderBox = isBorderBox &&
- ( support.boxSizingReliable() || val === elem.style[ name ] );
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
+ // Fall back to offsetWidth/Height when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
+ if ( val === "auto" ) {
+ val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
}
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+
// Use the active box-sizing model to add/subtract irrelevant styles
return ( val +
augmentWidthOrHeight(
@@ -6308,10 +6430,15 @@ jQuery.extend( {
// Make sure that we're working with the right name
var ret, type, hooks,
origName = jQuery.camelCase( name ),
+ isCustomProp = rcustomProp.test( name ),
style = elem.style;
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+ // Make sure that we're working with the right name. We don't
+ // want to query the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
// Gets hook for the prefixed version, then unprefixed version
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
@@ -6347,7 +6474,11 @@ jQuery.extend( {
if ( !hooks || !( "set" in hooks ) ||
( value = hooks.set( elem, value, extra ) ) !== undefined ) {
- style[ name ] = value;
+ if ( isCustomProp ) {
+ style.setProperty( name, value );
+ } else {
+ style[ name ] = value;
+ }
}
} else {
@@ -6366,11 +6497,15 @@ jQuery.extend( {
css: function( elem, name, extra, styles ) {
var val, num, hooks,
- origName = jQuery.camelCase( name );
+ origName = jQuery.camelCase( name ),
+ isCustomProp = rcustomProp.test( name );
- // Make sure that we're working with the right name
- name = jQuery.cssProps[ origName ] ||
- ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+ // Make sure that we're working with the right name. We don't
+ // want to modify the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
// Try prefixed name followed by the unprefixed name
hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
@@ -6395,6 +6530,7 @@ jQuery.extend( {
num = parseFloat( val );
return extra === true || isFinite( num ) ? num || 0 : val;
}
+
return val;
}
} );
@@ -6494,7 +6630,7 @@ jQuery.fn.extend( {
map = {},
i = 0;
- if ( jQuery.isArray( name ) ) {
+ if ( Array.isArray( name ) ) {
styles = getStyles( elem );
len = name.length;
@@ -6632,13 +6768,18 @@ jQuery.fx.step = {};
var
- fxNow, timerId,
+ fxNow, inProgress,
rfxtypes = /^(?:toggle|show|hide)$/,
rrun = /queueHooks$/;
-function raf() {
- if ( timerId ) {
- window.requestAnimationFrame( raf );
+function schedule() {
+ if ( inProgress ) {
+ if ( document.hidden === false && window.requestAnimationFrame ) {
+ window.requestAnimationFrame( schedule );
+ } else {
+ window.setTimeout( schedule, jQuery.fx.interval );
+ }
+
jQuery.fx.tick();
}
}
@@ -6865,7 +7006,7 @@ function propFilter( props, specialEasing ) {
name = jQuery.camelCase( index );
easing = specialEasing[ name ];
value = props[ index ];
- if ( jQuery.isArray( value ) ) {
+ if ( Array.isArray( value ) ) {
easing = value[ 1 ];
value = props[ index ] = value[ 0 ];
}
@@ -6924,12 +7065,19 @@ function Animation( elem, properties, options ) {
deferred.notifyWith( elem, [ animation, percent, remaining ] );
+ // If there's more to do, yield
if ( percent < 1 && length ) {
return remaining;
- } else {
- deferred.resolveWith( elem, [ animation ] );
- return false;
}
+
+ // If this was an empty animation, synthesize a final progress notification
+ if ( !length ) {
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
+ }
+
+ // Resolve the animation and report its conclusion
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
},
animation = deferred.promise( {
elem: elem,
@@ -6994,6 +7142,13 @@ function Animation( elem, properties, options ) {
animation.opts.start.call( elem, animation );
}
+ // Attach callbacks from options
+ animation
+ .progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+
jQuery.fx.timer(
jQuery.extend( tick, {
elem: elem,
@@ -7002,11 +7157,7 @@ function Animation( elem, properties, options ) {
} )
);
- // attach callbacks from options
- return animation.progress( animation.opts.progress )
- .done( animation.opts.done, animation.opts.complete )
- .fail( animation.opts.fail )
- .always( animation.opts.always );
+ return animation;
}
jQuery.Animation = jQuery.extend( Animation, {
@@ -7024,7 +7175,7 @@ jQuery.Animation = jQuery.extend( Animation, {
callback = props;
props = [ "*" ];
} else {
- props = props.match( rnotwhite );
+ props = props.match( rnothtmlwhite );
}
var prop,
@@ -7057,14 +7208,19 @@ jQuery.speed = function( speed, easing, fn ) {
easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
};
- // Go to the end state if fx are off or if document is hidden
- if ( jQuery.fx.off || document.hidden ) {
+ // Go to the end state if fx are off
+ if ( jQuery.fx.off ) {
opt.duration = 0;
} else {
- opt.duration = typeof opt.duration === "number" ?
- opt.duration : opt.duration in jQuery.fx.speeds ?
- jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+ if ( typeof opt.duration !== "number" ) {
+ if ( opt.duration in jQuery.fx.speeds ) {
+ opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+ } else {
+ opt.duration = jQuery.fx.speeds._default;
+ }
+ }
}
// Normalize opt.queue - true/undefined/null -> "fx"
@@ -7245,7 +7401,7 @@ jQuery.fx.tick = function() {
for ( ; i < timers.length; i++ ) {
timer = timers[ i ];
- // Checks the timer has not already been removed
+ // Run the timer and safely remove it when done (allowing for external removal)
if ( !timer() && timers[ i ] === timer ) {
timers.splice( i--, 1 );
}
@@ -7259,30 +7415,21 @@ jQuery.fx.tick = function() {
jQuery.fx.timer = function( timer ) {
jQuery.timers.push( timer );
- if ( timer() ) {
- jQuery.fx.start();
- } else {
- jQuery.timers.pop();
- }
+ jQuery.fx.start();
};
jQuery.fx.interval = 13;
jQuery.fx.start = function() {
- if ( !timerId ) {
- timerId = window.requestAnimationFrame ?
- window.requestAnimationFrame( raf ) :
- window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ if ( inProgress ) {
+ return;
}
+
+ inProgress = true;
+ schedule();
};
jQuery.fx.stop = function() {
- if ( window.cancelAnimationFrame ) {
- window.cancelAnimationFrame( timerId );
- } else {
- window.clearInterval( timerId );
- }
-
- timerId = null;
+ inProgress = null;
};
jQuery.fx.speeds = {
@@ -7399,7 +7546,7 @@ jQuery.extend( {
type: {
set: function( elem, value ) {
if ( !support.radioValue && value === "radio" &&
- jQuery.nodeName( elem, "input" ) ) {
+ nodeName( elem, "input" ) ) {
var val = elem.value;
elem.setAttribute( "type", value );
if ( val ) {
@@ -7414,7 +7561,10 @@ jQuery.extend( {
removeAttr: function( elem, value ) {
var name,
i = 0,
- attrNames = value && value.match( rnotwhite );
+
+ // Attribute names can contain non-HTML whitespace characters
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ attrNames = value && value.match( rnothtmlwhite );
if ( attrNames && elem.nodeType === 1 ) {
while ( ( name = attrNames[ i++ ] ) ) {
@@ -7521,12 +7671,19 @@ jQuery.extend( {
// Use proper attribute retrieval(#12072)
var tabindex = jQuery.find.attr( elem, "tabindex" );
- return tabindex ?
- parseInt( tabindex, 10 ) :
+ if ( tabindex ) {
+ return parseInt( tabindex, 10 );
+ }
+
+ if (
rfocusable.test( elem.nodeName ) ||
- rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- -1;
+ rclickable.test( elem.nodeName ) &&
+ elem.href
+ ) {
+ return 0;
+ }
+
+ return -1;
}
}
},
@@ -7543,9 +7700,14 @@ jQuery.extend( {
// on the option
// The getter ensures a default option is selected
// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
if ( !support.optSelected ) {
jQuery.propHooks.selected = {
get: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
var parent = elem.parentNode;
if ( parent && parent.parentNode ) {
parent.parentNode.selectedIndex;
@@ -7553,6 +7715,9 @@ if ( !support.optSelected ) {
return null;
},
set: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;
@@ -7583,7 +7748,13 @@ jQuery.each( [
-var rclass = /[\t\r\n\f]/g;
+ // Strip and collapse whitespace according to HTML spec
+ // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
+ function stripAndCollapse( value ) {
+ var tokens = value.match( rnothtmlwhite ) || [];
+ return tokens.join( " " );
+ }
+
function getClass( elem ) {
return elem.getAttribute && elem.getAttribute( "class" ) || "";
@@ -7601,12 +7772,11 @@ jQuery.fn.extend( {
}
if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
+ classes = value.match( rnothtmlwhite ) || [];
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
@@ -7617,7 +7787,7 @@ jQuery.fn.extend( {
}
// Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
+ finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
@@ -7643,14 +7813,13 @@ jQuery.fn.extend( {
}
if ( typeof value === "string" && value ) {
- classes = value.match( rnotwhite ) || [];
+ classes = value.match( rnothtmlwhite ) || [];
while ( ( elem = this[ i++ ] ) ) {
curValue = getClass( elem );
// This expression is here for better compressibility (see addClass)
- cur = elem.nodeType === 1 &&
- ( " " + curValue + " " ).replace( rclass, " " );
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
if ( cur ) {
j = 0;
@@ -7663,7 +7832,7 @@ jQuery.fn.extend( {
}
// Only assign if different to avoid unneeded rendering.
- finalValue = jQuery.trim( cur );
+ finalValue = stripAndCollapse( cur );
if ( curValue !== finalValue ) {
elem.setAttribute( "class", finalValue );
}
@@ -7698,7 +7867,7 @@ jQuery.fn.extend( {
// Toggle individual class names
i = 0;
self = jQuery( this );
- classNames = value.match( rnotwhite ) || [];
+ classNames = value.match( rnothtmlwhite ) || [];
while ( ( className = classNames[ i++ ] ) ) {
@@ -7741,10 +7910,8 @@ jQuery.fn.extend( {
className = " " + selector + " ";
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
- ( " " + getClass( elem ) + " " ).replace( rclass, " " )
- .indexOf( className ) > -1
- ) {
- return true;
+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+ return true;
}
}
@@ -7755,8 +7922,7 @@ jQuery.fn.extend( {
-var rreturn = /\r/g,
- rspaces = /[\x20\t\r\n\f]+/g;
+var rreturn = /\r/g;
jQuery.fn.extend( {
val: function( value ) {
@@ -7777,13 +7943,13 @@ jQuery.fn.extend( {
ret = elem.value;
- return typeof ret === "string" ?
-
- // Handle most common string cases
- ret.replace( rreturn, "" ) :
+ // Handle most common string cases
+ if ( typeof ret === "string" ) {
+ return ret.replace( rreturn, "" );
+ }
- // Handle cases where value is null/undef or number
- ret == null ? "" : ret;
+ // Handle cases where value is null/undef or number
+ return ret == null ? "" : ret;
}
return;
@@ -7811,7 +7977,7 @@ jQuery.fn.extend( {
} else if ( typeof val === "number" ) {
val += "";
- } else if ( jQuery.isArray( val ) ) {
+ } else if ( Array.isArray( val ) ) {
val = jQuery.map( val, function( value ) {
return value == null ? "" : value + "";
} );
@@ -7840,20 +8006,24 @@ jQuery.extend( {
// option.text throws exceptions (#14686, #14858)
// Strip and collapse whitespace
// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
- jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
+ stripAndCollapse( jQuery.text( elem ) );
}
},
select: {
get: function( elem ) {
- var value, option,
+ var value, option, i,
options = elem.options,
index = elem.selectedIndex,
one = elem.type === "select-one",
values = one ? null : [],
- max = one ? index + 1 : options.length,
- i = index < 0 ?
- max :
- one ? index : 0;
+ max = one ? index + 1 : options.length;
+
+ if ( index < 0 ) {
+ i = max;
+
+ } else {
+ i = one ? index : 0;
+ }
// Loop through all the selected options
for ( ; i < max; i++ ) {
@@ -7866,7 +8036,7 @@ jQuery.extend( {
// Don't return options that are disabled or in a disabled optgroup
!option.disabled &&
( !option.parentNode.disabled ||
- !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+ !nodeName( option.parentNode, "optgroup" ) ) ) {
// Get the specific value for the option
value = jQuery( option ).val();
@@ -7918,7 +8088,7 @@ jQuery.extend( {
jQuery.each( [ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = {
set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
+ if ( Array.isArray( value ) ) {
return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
}
}
@@ -8213,7 +8383,7 @@ var
function buildParams( prefix, obj, traditional, add ) {
var name;
- if ( jQuery.isArray( obj ) ) {
+ if ( Array.isArray( obj ) ) {
// Serialize array item.
jQuery.each( obj, function( i, v ) {
@@ -8265,7 +8435,7 @@ jQuery.param = function( a, traditional ) {
};
// If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
// Serialize the form elements
jQuery.each( a, function() {
@@ -8307,13 +8477,17 @@ jQuery.fn.extend( {
.map( function( i, elem ) {
var val = jQuery( this ).val();
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val ) {
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- } ) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ if ( val == null ) {
+ return null;
+ }
+
+ if ( Array.isArray( val ) ) {
+ return jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } );
+ }
+
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
} ).get();
}
} );
@@ -8322,7 +8496,7 @@ jQuery.fn.extend( {
var
r20 = /%20/g,
rhash = /#.*$/,
- rts = /([?&])_=[^&]*/,
+ rantiCache = /([?&])_=[^&]*/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
// #7653, #8125, #8152: local protocol detection
@@ -8368,7 +8542,7 @@ function addToPrefiltersOrTransports( structure ) {
var dataType,
i = 0,
- dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+ dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
if ( jQuery.isFunction( func ) ) {
@@ -8836,7 +9010,7 @@ jQuery.extend( {
s.type = options.method || options.type || s.method || s.type;
// Extract dataTypes list
- s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+ s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
// A cross-domain request is in order when the origin doesn't match the current origin.
if ( s.crossDomain == null ) {
@@ -8908,9 +9082,9 @@ jQuery.extend( {
delete s.data;
}
- // Add anti-cache in uncached url if needed
+ // Add or update anti-cache param if needed
if ( s.cache === false ) {
- cacheURL = cacheURL.replace( rts, "" );
+ cacheURL = cacheURL.replace( rantiCache, "$1" );
uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
}
@@ -9649,7 +9823,7 @@ jQuery.fn.load = function( url, params, callback ) {
off = url.indexOf( " " );
if ( off > -1 ) {
- selector = jQuery.trim( url.slice( off ) );
+ selector = stripAndCollapse( url.slice( off ) );
url = url.slice( 0, off );
}
@@ -9732,13 +9906,6 @@ jQuery.expr.pseudos.animated = function( elem ) {
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
-}
-
jQuery.offset = {
setOffset: function( elem, options, i ) {
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
@@ -9803,13 +9970,14 @@ jQuery.fn.extend( {
} );
}
- var docElem, win, rect, doc,
+ var doc, docElem, rect, win,
elem = this[ 0 ];
if ( !elem ) {
return;
}
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
// Support: IE <=11 only
// Running getBoundingClientRect on a
// disconnected node in IE throws an error
@@ -9819,20 +9987,14 @@ jQuery.fn.extend( {
rect = elem.getBoundingClientRect();
- // Make sure element is not hidden (display: none)
- if ( rect.width || rect.height ) {
- doc = elem.ownerDocument;
- win = getWindow( doc );
- docElem = doc.documentElement;
+ doc = elem.ownerDocument;
+ docElem = doc.documentElement;
+ win = doc.defaultView;
- return {
- top: rect.top + win.pageYOffset - docElem.clientTop,
- left: rect.left + win.pageXOffset - docElem.clientLeft
- };
- }
-
- // Return zeros for disconnected and hidden elements (gh-2310)
- return rect;
+ return {
+ top: rect.top + win.pageYOffset - docElem.clientTop,
+ left: rect.left + win.pageXOffset - docElem.clientLeft
+ };
},
position: function() {
@@ -9858,7 +10020,7 @@ jQuery.fn.extend( {
// Get correct offsets
offset = this.offset();
- if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
parentOffset = offsetParent.offset();
}
@@ -9905,7 +10067,14 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
jQuery.fn[ method ] = function( val ) {
return access( this, function( elem, method, val ) {
- var win = getWindow( elem );
+
+ // Coalesce documents and windows
+ var win;
+ if ( jQuery.isWindow( elem ) ) {
+ win = elem;
+ } else if ( elem.nodeType === 9 ) {
+ win = elem.defaultView;
+ }
if ( val === undefined ) {
return win ? win[ prop ] : elem[ method ];
@@ -10014,7 +10183,16 @@ jQuery.fn.extend( {
}
} );
+jQuery.holdReady = function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+};
+jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
@@ -10041,7 +10219,6 @@ if ( typeof define === "function" && define.amd ) {
-
var
// Map over jQuery in case of overwrite
@@ -10070,5 +10247,7 @@ if ( !noGlobal ) {
}
+
+
return jQuery;
} );
diff --git a/doc/html/_static/jquery.js b/doc/html/_static/jquery.js
index f6a6a99..644d35e 100644
--- a/doc/html/_static/jquery.js
+++ b/doc/html/_static/jquery.js
@@ -1,4 +1,4 @@
-/*! jQuery v3.1.0 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?a<0?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,
-r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;c<h;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==va()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===va()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;l<i;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;d<e;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Ma(a,b,f),(d<0||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)})},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);f<g;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);
-if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i<h;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){if(c)return c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
+/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S),
+a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),
+null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r});
diff --git a/doc/html/_static/language_data.js b/doc/html/_static/language_data.js
new file mode 100644
index 0000000..5266fb1
--- /dev/null
+++ b/doc/html/_static/language_data.js
@@ -0,0 +1,297 @@
+/*
+ * language_data.js
+ * ~~~~~~~~~~~~~~~~
+ *
+ * This script contains the language-specific data used by searchtools.js,
+ * namely the list of stopwords, stemmer, scorer and splitter.
+ *
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
+
+
+/* Non-minified version JS is _stemmer.js if file is provided */
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+
+
+
+
+
+var splitChars = (function() {
+ var result = {};
+ var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
+ 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
+ 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
+ 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
+ 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
+ 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
+ 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
+ 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
+ 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
+ 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
+ var i, j, start, end;
+ for (i = 0; i < singles.length; i++) {
+ result[singles[i]] = true;
+ }
+ var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
+ [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
+ [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
+ [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
+ [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
+ [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
+ [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
+ [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
+ [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
+ [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
+ [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
+ [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
+ [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
+ [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
+ [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
+ [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
+ [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
+ [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
+ [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
+ [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
+ [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
+ [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
+ [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
+ [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
+ [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
+ [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
+ [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
+ [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
+ [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
+ [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
+ [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
+ [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
+ [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
+ [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
+ [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
+ [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
+ [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
+ [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
+ [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
+ [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
+ [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
+ [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
+ [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
+ [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
+ [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
+ [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
+ [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
+ [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
+ [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
+ for (i = 0; i < ranges.length; i++) {
+ start = ranges[i][0];
+ end = ranges[i][1];
+ for (j = start; j <= end; j++) {
+ result[j] = true;
+ }
+ }
+ return result;
+})();
+
+function splitQuery(query) {
+ var result = [];
+ var start = -1;
+ for (var i = 0; i < query.length; i++) {
+ if (splitChars[query.charCodeAt(i)]) {
+ if (start !== -1) {
+ result.push(query.slice(start, i));
+ start = -1;
+ }
+ } else if (start === -1) {
+ start = i;
+ }
+ }
+ if (start !== -1) {
+ result.push(query.slice(start));
+ }
+ return result;
+}
+
+
diff --git a/doc/html/_static/searchtools.js b/doc/html/_static/searchtools.js
index c821573..5ff3180 100644
--- a/doc/html/_static/searchtools.js
+++ b/doc/html/_static/searchtools.js
@@ -1,331 +1,52 @@
/*
- * searchtools.js_t
+ * searchtools.js
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilities for the full-text search.
*
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
-
-/* Non-minified version JS is _stemmer.js if file is provided */
-/**
- * Porter Stemmer
- */
-var Stemmer = function() {
-
- var step2list = {
- ational: 'ate',
- tional: 'tion',
- enci: 'ence',
- anci: 'ance',
- izer: 'ize',
- bli: 'ble',
- alli: 'al',
- entli: 'ent',
- eli: 'e',
- ousli: 'ous',
- ization: 'ize',
- ation: 'ate',
- ator: 'ate',
- alism: 'al',
- iveness: 'ive',
- fulness: 'ful',
- ousness: 'ous',
- aliti: 'al',
- iviti: 'ive',
- biliti: 'ble',
- logi: 'log'
- };
-
- var step3list = {
- icate: 'ic',
- ative: '',
- alize: 'al',
- iciti: 'ic',
- ical: 'ic',
- ful: '',
- ness: ''
+if (!Scorer) {
+ /**
+ * Simple result scoring code.
+ */
+ var Scorer = {
+ // Implement the following function to further tweak the score for each result
+ // The function takes a result array [filename, title, anchor, descr, score]
+ // and returns the new score.
+ /*
+ score: function(result) {
+ return result[4];
+ },
+ */
+
+ // query matches the full name of an object
+ objNameMatch: 11,
+ // or matches in the last dotted part of the object name
+ objPartialMatch: 6,
+ // Additive scores depending on the priority of the object
+ objPrio: {0: 15, // used to be importantResults
+ 1: 5, // used to be objectResults
+ 2: -5}, // used to be unimportantResults
+ // Used when the priority is not in the mapping.
+ objPrioDefault: 0,
+
+ // query found in title
+ title: 15,
+ // query found in terms
+ term: 5
};
-
- var c = "[^aeiou]"; // consonant
- var v = "[aeiouy]"; // vowel
- var C = c + "[^aeiouy]*"; // consonant sequence
- var V = v + "[aeiou]*"; // vowel sequence
-
- var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
- var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
- var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
- var s_v = "^(" + C + ")?" + v; // vowel in stem
-
- this.stemWord = function (w) {
- var stem;
- var suffix;
- var firstch;
- var origword = w;
-
- if (w.length < 3)
- return w;
-
- var re;
- var re2;
- var re3;
- var re4;
-
- firstch = w.substr(0,1);
- if (firstch == "y")
- w = firstch.toUpperCase() + w.substr(1);
-
- // Step 1a
- re = /^(.+?)(ss|i)es$/;
- re2 = /^(.+?)([^s])s$/;
-
- if (re.test(w))
- w = w.replace(re,"$1$2");
- else if (re2.test(w))
- w = w.replace(re2,"$1$2");
-
- // Step 1b
- re = /^(.+?)eed$/;
- re2 = /^(.+?)(ed|ing)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- re = new RegExp(mgr0);
- if (re.test(fp[1])) {
- re = /.$/;
- w = w.replace(re,"");
- }
- }
- else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1];
- re2 = new RegExp(s_v);
- if (re2.test(stem)) {
- w = stem;
- re2 = /(at|bl|iz)$/;
- re3 = new RegExp("([^aeiouylsz])\\1$");
- re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
- if (re2.test(w))
- w = w + "e";
- else if (re3.test(w)) {
- re = /.$/;
- w = w.replace(re,"");
- }
- else if (re4.test(w))
- w = w + "e";
- }
- }
-
- // Step 1c
- re = /^(.+?)y$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(s_v);
- if (re.test(stem))
- w = stem + "i";
- }
-
- // Step 2
- re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = new RegExp(mgr0);
- if (re.test(stem))
- w = stem + step2list[suffix];
- }
-
- // Step 3
- re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = new RegExp(mgr0);
- if (re.test(stem))
- w = stem + step3list[suffix];
- }
-
- // Step 4
- re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
- re2 = /^(.+?)(s|t)(ion)$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(mgr1);
- if (re.test(stem))
- w = stem;
- }
- else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1] + fp[2];
- re2 = new RegExp(mgr1);
- if (re2.test(stem))
- w = stem;
- }
-
- // Step 5
- re = /^(.+?)e$/;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = new RegExp(mgr1);
- re2 = new RegExp(meq1);
- re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
- if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
- w = stem;
- }
- re = /ll$/;
- re2 = new RegExp(mgr1);
- if (re.test(w) && re2.test(w)) {
- re = /.$/;
- w = w.replace(re,"");
- }
-
- // and turn initial Y back to y
- if (firstch == "y")
- w = firstch.toLowerCase() + w.substr(1);
- return w;
- }
}
-
-
-/**
- * Simple result scoring code.
- */
-var Scorer = {
- // Implement the following function to further tweak the score for each result
- // The function takes a result array [filename, title, anchor, descr, score]
- // and returns the new score.
- /*
- score: function(result) {
- return result[4];
- },
- */
-
- // query matches the full name of an object
- objNameMatch: 11,
- // or matches in the last dotted part of the object name
- objPartialMatch: 6,
- // Additive scores depending on the priority of the object
- objPrio: {0: 15, // used to be importantResults
- 1: 5, // used to be objectResults
- 2: -5}, // used to be unimportantResults
- // Used when the priority is not in the mapping.
- objPrioDefault: 0,
-
- // query found in title
- title: 15,
- // query found in terms
- term: 5
-};
-
-
-
-
-
-var splitChars = (function() {
- var result = {};
- var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
- 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
- 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
- 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
- 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
- 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
- 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
- 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
- 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
- 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
- var i, j, start, end;
- for (i = 0; i < singles.length; i++) {
- result[singles[i]] = true;
- }
- var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
- [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
- [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
- [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
- [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
- [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
- [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
- [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
- [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
- [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
- [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
- [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
- [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
- [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
- [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
- [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
- [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
- [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
- [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
- [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
- [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
- [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
- [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
- [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
- [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
- [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
- [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
- [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
- [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
- [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
- [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
- [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
- [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
- [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
- [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
- [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
- [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
- [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
- [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
- [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
- [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
- [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
- [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
- [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
- [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
- [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
- [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
- [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
- [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
- for (i = 0; i < ranges.length; i++) {
- start = ranges[i][0];
- end = ranges[i][1];
- for (j = start; j <= end; j++) {
- result[j] = true;
- }
- }
- return result;
-})();
-
-function splitQuery(query) {
- var result = [];
- var start = -1;
- for (var i = 0; i < query.length; i++) {
- if (splitChars[query.charCodeAt(i)]) {
- if (start !== -1) {
- result.push(query.slice(start, i));
- start = -1;
- }
- } else if (start === -1) {
- start = i;
- }
- }
- if (start !== -1) {
- result.push(query.slice(start));
- }
- return result;
+if (!splitQuery) {
+ function splitQuery(query) {
+ return query.split(/\s+/);
+ }
}
-
-
-
/**
* Search Module
*/
@@ -417,7 +138,6 @@ var Search = {
*/
query : function(query) {
var i;
- var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
// stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
@@ -540,6 +260,9 @@ var Search = {
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
var suffix = DOCUMENTATION_OPTIONS.SOURCELINK_SUFFIX;
+ if (suffix === undefined) {
+ suffix = '.txt';
+ }
$.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[5] + (item[5].slice(-suffix.length) === suffix ? '' : suffix),
dataType: "text",
complete: function(jqxhr, textstatus) {
@@ -755,4 +478,4 @@ var Search = {
$(document).ready(function() {
Search.init();
-}); \ No newline at end of file
+});
diff --git a/doc/html/_static/sidebar.js b/doc/html/_static/sidebar.js
deleted file mode 100644
index a45e192..0000000
--- a/doc/html/_static/sidebar.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * sidebar.js
- * ~~~~~~~~~~
- *
- * This script makes the Sphinx sidebar collapsible.
- *
- * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
- * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
- * used to collapse and expand the sidebar.
- *
- * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
- * and the width of the sidebar and the margin-left of the document
- * are decreased. When the sidebar is expanded the opposite happens.
- * This script saves a per-browser/per-session cookie used to
- * remember the position of the sidebar among the pages.
- * Once the browser is closed the cookie is deleted and the position
- * reset to the default (expanded).
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-$(function() {
- // global elements used by the functions.
- // the 'sidebarbutton' element is defined as global after its
- // creation, in the add_sidebar_button function
- var bodywrapper = $('.bodywrapper');
- var sidebar = $('.sphinxsidebar');
- var sidebarwrapper = $('.sphinxsidebarwrapper');
-
- // for some reason, the document has no sidebar; do not run into errors
- if (!sidebar.length) return;
-
- // original margin-left of the bodywrapper and width of the sidebar
- // with the sidebar expanded
- var bw_margin_expanded = bodywrapper.css('margin-left');
- var ssb_width_expanded = sidebar.width();
-
- // margin-left of the bodywrapper and width of the sidebar
- // with the sidebar collapsed
- var bw_margin_collapsed = '.8em';
- var ssb_width_collapsed = '.8em';
-
- // colors used by the current theme
- var dark_color = $('.related').css('background-color');
- var light_color = $('.document').css('background-color');
-
- function sidebar_is_collapsed() {
- return sidebarwrapper.is(':not(:visible)');
- }
-
- function toggle_sidebar() {
- if (sidebar_is_collapsed())
- expand_sidebar();
- else
- collapse_sidebar();
- }
-
- function collapse_sidebar() {
- sidebarwrapper.hide();
- sidebar.css('width', ssb_width_collapsed);
- bodywrapper.css('margin-left', bw_margin_collapsed);
- sidebarbutton.css({
- 'margin-left': '0',
- 'height': bodywrapper.height()
- });
- sidebarbutton.find('span').text('»');
- sidebarbutton.attr('title', _('Expand sidebar'));
- document.cookie = 'sidebar=collapsed';
- }
-
- function expand_sidebar() {
- bodywrapper.css('margin-left', bw_margin_expanded);
- sidebar.css('width', ssb_width_expanded);
- sidebarwrapper.show();
- sidebarbutton.css({
- 'margin-left': ssb_width_expanded-12,
- 'height': bodywrapper.height()
- });
- sidebarbutton.find('span').text('«');
- sidebarbutton.attr('title', _('Collapse sidebar'));
- document.cookie = 'sidebar=expanded';
- }
-
- function add_sidebar_button() {
- sidebarwrapper.css({
- 'float': 'left',
- 'margin-right': '0',
- 'width': ssb_width_expanded - 28
- });
- // create the button
- sidebar.append(
- '<div id="sidebarbutton"><span>&laquo;</span></div>'
- );
- var sidebarbutton = $('#sidebarbutton');
- light_color = sidebarbutton.css('background-color');
- // find the height of the viewport to center the '<<' in the page
- var viewport_height;
- if (window.innerHeight)
- viewport_height = window.innerHeight;
- else
- viewport_height = $(window).height();
- sidebarbutton.find('span').css({
- 'display': 'block',
- 'margin-top': (viewport_height - sidebar.position().top - 20) / 2
- });
-
- sidebarbutton.click(toggle_sidebar);
- sidebarbutton.attr('title', _('Collapse sidebar'));
- sidebarbutton.css({
- 'color': '#FFFFFF',
- 'border-left': '1px solid ' + dark_color,
- 'font-size': '1.2em',
- 'cursor': 'pointer',
- 'height': bodywrapper.height(),
- 'padding-top': '1px',
- 'margin-left': ssb_width_expanded - 12
- });
-
- sidebarbutton.hover(
- function () {
- $(this).css('background-color', dark_color);
- },
- function () {
- $(this).css('background-color', light_color);
- }
- );
- }
-
- function set_position_from_cookie() {
- if (!document.cookie)
- return;
- var items = document.cookie.split(';');
- for(var k=0; k<items.length; k++) {
- var key_val = items[k].split('=');
- var key = key_val[0];
- if (key == 'sidebar') {
- var value = key_val[1];
- if ((value == 'collapsed') && (!sidebar_is_collapsed()))
- collapse_sidebar();
- else if ((value == 'expanded') && (sidebar_is_collapsed()))
- expand_sidebar();
- }
- }
- }
-
- add_sidebar_button();
- var sidebarbutton = $('#sidebarbutton');
- set_position_from_cookie();
-});
diff --git a/doc/html/_static/websupport.js b/doc/html/_static/websupport.js
index 53f6a45..3b4999e 100644
--- a/doc/html/_static/websupport.js
+++ b/doc/html/_static/websupport.js
@@ -4,7 +4,7 @@
*
* sphinx.websupport utilities for all documentation.
*
- * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -301,7 +301,7 @@
li.hide();
// Determine where in the parents children list to insert this comment.
- for(i=0; i < siblings.length; i++) {
+ for(var i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
diff --git a/doc/html/genindex.html b/doc/html/genindex.html
index b24bf70..9cd9ca4 100644
--- a/doc/html/genindex.html
+++ b/doc/html/genindex.html
@@ -5,23 +5,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
@@ -30,13 +23,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
@@ -795,6 +789,8 @@
<li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.m2_bio_free">(M2Crypto.SSL.Connection.Connection method)</a>
</li>
</ul></li>
+ <li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.m2_bio_noclose">m2_bio_noclose (M2Crypto.SSL.Connection.Connection attribute)</a>
+</li>
<li><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.m2_bio_pop">m2_bio_pop() (M2Crypto.BIO.CipherStream method)</a>
<ul>
@@ -1029,14 +1025,14 @@
<li><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.private_decrypt">(M2Crypto.RSA.RSA_pub method)</a>
</li>
</ul></li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
<li><a href="M2Crypto.html#M2Crypto.RSA.RSA.private_encrypt">private_encrypt() (M2Crypto.RSA.RSA method)</a>
<ul>
<li><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.private_encrypt">(M2Crypto.RSA.RSA_pub method)</a>
</li>
</ul></li>
- </ul></td>
- <td style="width: 33%; vertical-align: top;"><ul>
<li><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_c">prot_c() (M2Crypto.ftpslib.FTP_TLS method)</a>
</li>
<li><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_p">prot_p() (M2Crypto.ftpslib.FTP_TLS method)</a>
@@ -1071,10 +1067,6 @@
</li>
<li><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.putrequest">putrequest() (M2Crypto.httpslib.ProxyHTTPSConnection method)</a>
</li>
- <li><a href="M2Crypto.html#M2Crypto.util.py3bytes">py3bytes() (in module M2Crypto.util)</a>
-</li>
- <li><a href="M2Crypto.html#M2Crypto.util.py3str">py3str() (in module M2Crypto.util)</a>
-</li>
</ul></td>
</tr></table>
@@ -1257,6 +1249,8 @@
</li>
<li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session">Session (class in M2Crypto.SSL.Session)</a>
</li>
+ <li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set1_host">set1_host() (M2Crypto.SSL.Connection.Connection method)</a>
+</li>
<li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_accept_state">set_accept_state() (M2Crypto.SSL.Connection.Connection method)</a>
</li>
<li><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_allow_unknown_ca">set_allow_unknown_ca() (M2Crypto.SSL.Context.Context method)</a>
@@ -1671,29 +1665,52 @@
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
- <div class="relations">
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
-
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -1702,8 +1719,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/howto.ca.html b/doc/html/howto.ca.html
index 8a30e5a..7f5bd21 100644
--- a/doc/html/howto.ca.html
+++ b/doc/html/howto.ca.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HOWTO: Creating your own CA with OpenSSL &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="howto-creating-your-own-ca-with-openssl">
@@ -67,19 +61,19 @@ decided to document the process, hence this HOWTO.</p>
</div>
<div class="section" id="the-procedure">
<h2>The Procedure<a class="headerlink" href="#the-procedure" title="Permalink to this headline">¶</a></h2>
-<p>I use <code class="docutils literal"><span class="pre">CA.pl</span></code>, a Perl program written by Steve Hanson and bundled with
+<p>I use <code class="docutils literal notranslate"><span class="pre">CA.pl</span></code>, a Perl program written by Steve Hanson and bundled with
OpenSSL.</p>
<p>The following are the steps to create a CA:</p>
<ol class="arabic">
<li><p class="first">Choose a directory to do your CA work. All commands are executed
-within this directory. Let’s call the directory <code class="docutils literal"><span class="pre">demo</span></code>.</p>
+within this directory. Let’s call the directory <code class="docutils literal notranslate"><span class="pre">demo</span></code>.</p>
</li>
-<li><p class="first">Copy <code class="docutils literal"><span class="pre">CA.pl</span></code> and <code class="docutils literal"><span class="pre">openssl.cnf</span></code> into <code class="docutils literal"><span class="pre">demo</span></code>.</p>
+<li><p class="first">Copy <code class="docutils literal notranslate"><span class="pre">CA.pl</span></code> and <code class="docutils literal notranslate"><span class="pre">openssl.cnf</span></code> into <code class="docutils literal notranslate"><span class="pre">demo</span></code>.</p>
</li>
-<li><p class="first">Apply the following patch to <code class="docutils literal"><span class="pre">CA.pl</span></code>, which allows it to generate a
+<li><p class="first">Apply the following patch to <code class="docutils literal notranslate"><span class="pre">CA.pl</span></code>, which allows it to generate a
CA certificate with a validity period of 1095 days, i.e.,
3 years:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span>--- CA.pl.org Sat Mar 31 12:40:13 2001
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>--- CA.pl.org Sat Mar 31 12:40:13 2001
+++ CA.pl Sat Mar 31 12:41:15 2001
@@ -97,7 +97,7 @@
} else {
@@ -94,7 +88,7 @@ CA certificate with a validity period of 1095 days, i.e.,
</div>
</li>
<li><p class="first">Create a new CA like this:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">CA</span><span class="o">.</span><span class="n">pl</span> <span class="o">-</span><span class="n">newca</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">CA</span><span class="o">.</span><span class="n">pl</span> <span class="o">-</span><span class="n">newca</span>
<span class="n">A</span> <span class="n">certificate</span> <span class="n">filename</span> <span class="p">(</span><span class="ow">or</span> <span class="n">enter</span> <span class="n">to</span> <span class="n">create</span><span class="p">)</span> <span class="o">&lt;</span><span class="n">enter</span><span class="o">&gt;</span>
@@ -123,11 +117,11 @@ CA certificate with a validity period of 1095 days, i.e.,
<span class="n">Email</span> <span class="n">Address</span> <span class="p">[]:</span><span class="n">certmaster</span><span class="nd">@democa</span><span class="o">.</span><span class="n">dom</span>
</pre></div>
</div>
-<p>This creates a new CA in the directory <code class="docutils literal"><span class="pre">demoCA</span></code>. The CA’s
-self-signed certificate is in <code class="docutils literal"><span class="pre">demoCA/cacert.pem</span></code> and its RSA key
-pair is in <code class="docutils literal"><span class="pre">demoCA/private/cakey.pem</span></code>.</p>
-<p><code class="docutils literal"><span class="pre">demoCA/private/cakey.pem</span></code> looks like this:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">demoCA</span><span class="o">/</span><span class="n">private</span><span class="o">/</span><span class="n">cakey</span><span class="o">.</span><span class="n">pem</span>
+<p>This creates a new CA in the directory <code class="docutils literal notranslate"><span class="pre">demoCA</span></code>. The CA’s
+self-signed certificate is in <code class="docutils literal notranslate"><span class="pre">demoCA/cacert.pem</span></code> and its RSA key
+pair is in <code class="docutils literal notranslate"><span class="pre">demoCA/private/cakey.pem</span></code>.</p>
+<p><code class="docutils literal notranslate"><span class="pre">demoCA/private/cakey.pem</span></code> looks like this:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">demoCA</span><span class="o">/</span><span class="n">private</span><span class="o">/</span><span class="n">cakey</span><span class="o">.</span><span class="n">pem</span>
<span class="o">-----</span><span class="n">BEGIN</span> <span class="n">RSA</span> <span class="n">PRIVATE</span> <span class="n">KEY</span><span class="o">-----</span>
<span class="n">Proc</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span><span class="n">ENCRYPTED</span>
@@ -151,7 +145,7 @@ pair is in <code class="docutils literal"><span class="pre">demoCA/private/cakey
</div>
</li>
<li><p class="first">Next, generate a certificate request:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">CA</span><span class="o">.</span><span class="n">pl</span> <span class="o">-</span><span class="n">newreq</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">./</span><span class="n">CA</span><span class="o">.</span><span class="n">pl</span> <span class="o">-</span><span class="n">newreq</span>
<span class="n">Using</span> <span class="n">configuration</span> <span class="kn">from</span> <span class="nn">openssl.cnf</span>
<span class="n">Generating</span> <span class="n">a</span> <span class="mi">1024</span> <span class="n">bit</span> <span class="n">RSA</span> <span class="n">private</span> <span class="n">key</span>
@@ -187,9 +181,9 @@ pair is in <code class="docutils literal"><span class="pre">demoCA/private/cakey
</ol>
<p></p>
<blockquote>
-<div><p>The certificate request and private key in <code class="docutils literal"><span class="pre">newreq.pem</span></code> looks like
+<div><p>The certificate request and private key in <code class="docutils literal notranslate"><span class="pre">newreq.pem</span></code> looks like
this:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newreq</span><span class="o">.</span><span class="n">pem</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newreq</span><span class="o">.</span><span class="n">pem</span>
<span class="o">-----</span><span class="n">BEGIN</span> <span class="n">RSA</span> <span class="n">PRIVATE</span> <span class="n">KEY</span><span class="o">-----</span>
<span class="n">Proc</span><span class="o">-</span><span class="n">Type</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span><span class="n">ENCRYPTED</span>
@@ -226,7 +220,7 @@ this:</p>
<p></p>
<blockquote>
<div><p>Decoding the certificate request gives the following:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">text</span> <span class="o">-</span><span class="n">noout</span> <span class="o">&lt;</span> <span class="n">newreq</span><span class="o">.</span><span class="n">pem</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">text</span> <span class="o">-</span><span class="n">noout</span> <span class="o">&lt;</span> <span class="n">newreq</span><span class="o">.</span><span class="n">pem</span>
<span class="n">Using</span> <span class="n">configuration</span> <span class="kn">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">pkg</span><span class="o">/</span><span class="n">openssl</span><span class="o">/</span><span class="n">openssl</span><span class="o">.</span><span class="n">cnf</span>
<span class="n">Certificate</span> <span class="n">Request</span><span class="p">:</span>
@@ -263,7 +257,7 @@ this:</p>
</div></blockquote>
<ol class="arabic" start="6">
<li><p class="first">Now, sign the certificate request:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span>./CA.pl -sign
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>./CA.pl -sign
Using configuration from openssl.cnf
Enter PEM pass phrase: &lt;CA&#39;s passphrase&gt;
@@ -288,8 +282,8 @@ Signed certificate is in newcert.pem
</ol>
<p></p>
<blockquote>
-<div><p><code class="docutils literal"><span class="pre">newcert.pem</span></code> looks like this:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newcert</span><span class="o">.</span><span class="n">pem</span>
+<div><p><code class="docutils literal notranslate"><span class="pre">newcert.pem</span></code> looks like this:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newcert</span><span class="o">.</span><span class="n">pem</span>
<span class="n">Certificate</span><span class="p">:</span>
<span class="n">Data</span><span class="p">:</span>
@@ -363,15 +357,15 @@ are to be used in an unattended SSL server, you may wish to not
encrypt the private key, i.e., leave the key in the clear. This
decision should be governed by your site’s security policy and threat
model, of course:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">rsa</span> <span class="o">&lt;</span> <span class="n">newkey</span><span class="o">.</span><span class="n">pem</span> <span class="o">&gt;</span> <span class="n">newkey2</span><span class="o">.</span><span class="n">pem</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">rsa</span> <span class="o">&lt;</span> <span class="n">newkey</span><span class="o">.</span><span class="n">pem</span> <span class="o">&gt;</span> <span class="n">newkey2</span><span class="o">.</span><span class="n">pem</span>
<span class="n">read</span> <span class="n">RSA</span> <span class="n">key</span>
<span class="n">Enter</span> <span class="n">PEM</span> <span class="k">pass</span> <span class="n">phrase</span><span class="p">:</span><span class="o">&lt;</span><span class="n">secret</span> <span class="n">passphrase</span> <span class="n">here</span><span class="o">&gt;</span>
<span class="n">writing</span> <span class="n">RSA</span> <span class="n">key</span>
</pre></div>
</div>
-<p><code class="docutils literal"><span class="pre">newkey2.pem</span></code> looks like this:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newkey2</span><span class="o">.</span><span class="n">pem</span>
+<p><code class="docutils literal notranslate"><span class="pre">newkey2.pem</span></code> looks like this:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="n">newkey2</span><span class="o">.</span><span class="n">pem</span>
<span class="o">-----</span><span class="n">BEGIN</span> <span class="n">RSA</span> <span class="n">PRIVATE</span> <span class="n">KEY</span><span class="o">-----</span>
<span class="n">MIICXgIBAAKBgQCvWdhjVCuWXWu4H8WqUJGuvme</span><span class="o">+</span><span class="mi">6</span><span class="n">l0g37fAXur3Xm28RChzvhue</span>
@@ -392,11 +386,11 @@ model, of course:</p>
</div>
</li>
</ol>
-<p>That’s it! The certificate, <code class="docutils literal"><span class="pre">newcert.pem</span></code>, and the private key -
-<code class="docutils literal"><span class="pre">newkey.pem</span></code> (encrypted) or <code class="docutils literal"><span class="pre">newkey2.pem</span></code> (unencrypted) - are now
+<p>That’s it! The certificate, <code class="docutils literal notranslate"><span class="pre">newcert.pem</span></code>, and the private key -
+<code class="docutils literal notranslate"><span class="pre">newkey.pem</span></code> (encrypted) or <code class="docutils literal notranslate"><span class="pre">newkey2.pem</span></code> (unencrypted) - are now
ready to be used. You may wish to rename the files to more intuitive
names.</p>
-<p>You should also keep the CA’s certificate <code class="docutils literal"><span class="pre">demo/cacert.pem</span></code> handy
+<p>You should also keep the CA’s certificate <code class="docutils literal notranslate"><span class="pre">demo/cacert.pem</span></code> handy
for use when developing and deploying SSL or S/MIME applications.</p>
</div>
<div class="section" id="conclusion">
@@ -415,19 +409,25 @@ developing SSL and S/MIME applications in
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">HOWTO: Creating your own CA with OpenSSL</a><ul>
-<li><a class="reference internal" href="#introduction">Introduction</a></li>
-<li><a class="reference internal" href="#the-procedure">The Procedure</a></li>
-<li><a class="reference internal" href="#conclusion">Conclusion</a></li>
-</ul>
-</li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -435,23 +435,26 @@ developing SSL and S/MIME applications in
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/howto.ca.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -460,8 +463,8 @@ developing SSL and S/MIME applications in
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/howto.ca.rst.txt"
diff --git a/doc/html/howto.smime.html b/doc/html/howto.smime.html
index 75a4ecf..7f77e00 100644
--- a/doc/html/howto.smime.html
+++ b/doc/html/howto.smime.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HOWTO: Programming S/MIME in Python with M2Crypto &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="howto-programming-s-mime-in-python-with-m2crypto">
@@ -89,7 +83,7 @@ this approach is cheap and effective.</p>
certificates. This assumes you have OpenSSL installed properly on your
system.</p>
<p>First, we generate an X.509 certificate to be used for signing:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">newkey</span> <span class="n">rsa</span><span class="p">:</span><span class="mi">1024</span> <span class="o">-</span><span class="n">nodes</span> <span class="o">-</span><span class="n">x509</span> <span class="o">-</span><span class="n">days</span> <span class="mi">365</span> <span class="o">-</span><span class="n">out</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">newkey</span> <span class="n">rsa</span><span class="p">:</span><span class="mi">1024</span> <span class="o">-</span><span class="n">nodes</span> <span class="o">-</span><span class="n">x509</span> <span class="o">-</span><span class="n">days</span> <span class="mi">365</span> <span class="o">-</span><span class="n">out</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span>
<span class="n">Using</span> <span class="n">configuration</span> <span class="kn">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">pkg</span><span class="o">/</span><span class="n">openssl</span><span class="o">/</span><span class="n">openssl</span><span class="o">.</span><span class="n">cnf</span>
<span class="n">Generating</span> <span class="n">a</span> <span class="mi">1024</span> <span class="n">bit</span> <span class="n">RSA</span> <span class="n">private</span> <span class="n">key</span>
@@ -114,16 +108,16 @@ system.</p>
</pre></div>
</div>
<p>This generates a 1024-bit RSA key pair, unencrypted, into
-<code class="docutils literal"><span class="pre">privkey.pem</span></code>; it also generates a self-signed X.509 certificate for
-the public key into <code class="docutils literal"><span class="pre">signer.pem</span></code>. The certificate is valid for 365
+<code class="docutils literal notranslate"><span class="pre">privkey.pem</span></code>; it also generates a self-signed X.509 certificate for
+the public key into <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code>. The certificate is valid for 365
days, i.e., a year.</p>
-<p>Let’s rename <code class="docutils literal"><span class="pre">privkey.pem</span></code> so that we know it is a companion of
-<code class="docutils literal"><span class="pre">signer.pem</span></code>’s:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">mv</span> <span class="n">privkey</span><span class="o">.</span><span class="n">pem</span> <span class="n">signer_key</span><span class="o">.</span><span class="n">pem</span>
+<p>Let’s rename <code class="docutils literal notranslate"><span class="pre">privkey.pem</span></code> so that we know it is a companion of
+<code class="docutils literal notranslate"><span class="pre">signer.pem</span></code>’s:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">mv</span> <span class="n">privkey</span><span class="o">.</span><span class="n">pem</span> <span class="n">signer_key</span><span class="o">.</span><span class="n">pem</span>
</pre></div>
</div>
-<p>To verify the content of <code class="docutils literal"><span class="pre">signer.pem</span></code>, execute the following:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">x509</span> <span class="o">-</span><span class="n">noout</span> <span class="o">-</span><span class="n">text</span> <span class="o">-</span><span class="ow">in</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span>
+<p>To verify the content of <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code>, execute the following:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">x509</span> <span class="o">-</span><span class="n">noout</span> <span class="o">-</span><span class="n">text</span> <span class="o">-</span><span class="ow">in</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span>
<span class="n">Certificate</span><span class="p">:</span>
<span class="n">Data</span><span class="p">:</span>
@@ -171,8 +165,8 @@ days, i.e., a year.</p>
</pre></div>
</div>
<p>Next, we generate a self-signed X.509 certificate for the recipient.
-Note that <code class="docutils literal"><span class="pre">privkey.pem</span></code> will be recreated:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">newkey</span> <span class="n">rsa</span><span class="p">:</span><span class="mi">1024</span> <span class="o">-</span><span class="n">nodes</span> <span class="o">-</span><span class="n">x509</span> <span class="o">-</span><span class="n">days</span> <span class="mi">365</span> <span class="o">-</span><span class="n">out</span> <span class="n">recipient</span><span class="o">.</span><span class="n">pem</span>
+Note that <code class="docutils literal notranslate"><span class="pre">privkey.pem</span></code> will be recreated:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">req</span> <span class="o">-</span><span class="n">newkey</span> <span class="n">rsa</span><span class="p">:</span><span class="mi">1024</span> <span class="o">-</span><span class="n">nodes</span> <span class="o">-</span><span class="n">x509</span> <span class="o">-</span><span class="n">days</span> <span class="mi">365</span> <span class="o">-</span><span class="n">out</span> <span class="n">recipient</span><span class="o">.</span><span class="n">pem</span>
<span class="n">Using</span> <span class="n">configuration</span> <span class="kn">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="n">pkg</span><span class="o">/</span><span class="n">openssl</span><span class="o">/</span><span class="n">openssl</span><span class="o">.</span><span class="n">cnf</span>
<span class="n">Generating</span> <span class="n">a</span> <span class="mi">1024</span> <span class="n">bit</span> <span class="n">RSA</span> <span class="n">private</span> <span class="n">key</span>
@@ -196,13 +190,13 @@ Note that <code class="docutils literal"><span class="pre">privkey.pem</span></c
<span class="n">Email</span> <span class="n">Address</span> <span class="p">[]:</span><span class="n">recipient</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
</pre></div>
</div>
-<p>Again, rename <code class="docutils literal"><span class="pre">privkey.pem</span></code>:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">mv</span> <span class="n">privkey</span><span class="o">.</span><span class="n">pem</span> <span class="n">recipient_key</span><span class="o">.</span><span class="n">pem</span>
+<p>Again, rename <code class="docutils literal notranslate"><span class="pre">privkey.pem</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">mv</span> <span class="n">privkey</span><span class="o">.</span><span class="n">pem</span> <span class="n">recipient_key</span><span class="o">.</span><span class="n">pem</span>
</pre></div>
</div>
-<p>In the examples to follow, S/MIME Sender, <code class="docutils literal"><span class="pre">&lt;sender&#64;example.dom&gt;</span></code>,
+<p>In the examples to follow, S/MIME Sender, <code class="docutils literal notranslate"><span class="pre">&lt;sender&#64;example.dom&gt;</span></code>,
shall be the sender of S/MIME messages, while S/MIME Recipient,
-<code class="docutils literal"><span class="pre">&lt;recipient&#64;example.dom&gt;</span></code>, shall be the recipient of S/MIME messages.</p>
+<code class="docutils literal notranslate"><span class="pre">&lt;recipient&#64;example.dom&gt;</span></code>, shall be the recipient of S/MIME messages.</p>
<p>Armed with the key pairs and certificates, we are now ready to begin
programming S/MIME in Python.</p>
<blockquote>
@@ -218,22 +212,22 @@ prompt the user for the passphrase when such a key is being loaded.</p>
<div class="section" id="m2crypto-smime">
<h1>M2Crypto.SMIME<a class="headerlink" href="#m2crypto-smime" title="Permalink to this headline">¶</a></h1>
<p>The Python programmer accesses M2Crypto’s S/MIME functionality through
-class <code class="docutils literal"><span class="pre">SMIME</span></code> in the module <code class="docutils literal"><span class="pre">M2Crypto.SMIME</span></code>. Typically, an
-<code class="docutils literal"><span class="pre">SMIME</span></code> object is instantiated; the object is then set up for the
+class <code class="docutils literal notranslate"><span class="pre">SMIME</span></code> in the module <code class="docutils literal notranslate"><span class="pre">M2Crypto.SMIME</span></code>. Typically, an
+<code class="docutils literal notranslate"><span class="pre">SMIME</span></code> object is instantiated; the object is then set up for the
intended operation: sign, encrypt, decrypt or verify; finally, the
operation is invoked on the object.</p>
-<p><code class="docutils literal"><span class="pre">M2Crypto.SMIME</span></code> makes extensive use of <code class="docutils literal"><span class="pre">M2Crypto.BIO</span></code>:
-<code class="docutils literal"><span class="pre">M2Crypto.BIO</span></code> is a Python abstraction of the <code class="docutils literal"><span class="pre">BIO</span></code> abstraction in
-OpenSSL. A commonly used <code class="docutils literal"><span class="pre">BIO</span></code> abstraction in M2Crypto is
-<code class="docutils literal"><span class="pre">M2Crypto.BIO.MemoryBuffer</span></code>, which implements a memory-based file-like
-object, similar to Python’s own <code class="docutils literal"><span class="pre">StringIO</span></code>.</p>
+<p><code class="docutils literal notranslate"><span class="pre">M2Crypto.SMIME</span></code> makes extensive use of <code class="docutils literal notranslate"><span class="pre">M2Crypto.BIO</span></code>:
+<code class="docutils literal notranslate"><span class="pre">M2Crypto.BIO</span></code> is a Python abstraction of the <code class="docutils literal notranslate"><span class="pre">BIO</span></code> abstraction in
+OpenSSL. A commonly used <code class="docutils literal notranslate"><span class="pre">BIO</span></code> abstraction in M2Crypto is
+<code class="docutils literal notranslate"><span class="pre">M2Crypto.BIO.MemoryBuffer</span></code>, which implements a memory-based file-like
+object, similar to Python’s own <code class="docutils literal notranslate"><span class="pre">StringIO</span></code>.</p>
</div>
<div class="section" id="sign">
<h1>Sign<a class="headerlink" href="#sign" title="Permalink to this headline">¶</a></h1>
<p>The following code demonstrates how to generate an S/MIME-signed
-message. <code class="docutils literal"><span class="pre">randpool.dat</span></code> contains random data which is used to seed
+message. <code class="docutils literal notranslate"><span class="pre">randpool.dat</span></code> contains random data which is used to seed
OpenSSL’s pseudo-random number generator via M2Crypto:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span>
<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
@@ -250,14 +244,14 @@ OpenSSL’s pseudo-random number generator via M2Crypto:</p>
<span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_DETACHED</span><span class="p">)</span>
</pre></div>
</div>
-<p><code class="docutils literal"><span class="pre">p7</span></code> now contains a <em>PKCS #7 signature blob</em> wrapped in an
-<code class="docutils literal"><span class="pre">M2Crypto.SMIME.PKCS7</span></code> object. Note that <code class="docutils literal"><span class="pre">buf</span></code> has been consumed by
-<code class="docutils literal"><span class="pre">sign()</span></code> and has to be recreated if it is to be used again.</p>
+<p><code class="docutils literal notranslate"><span class="pre">p7</span></code> now contains a <em>PKCS #7 signature blob</em> wrapped in an
+<code class="docutils literal notranslate"><span class="pre">M2Crypto.SMIME.PKCS7</span></code> object. Note that <code class="docutils literal notranslate"><span class="pre">buf</span></code> has been consumed by
+<code class="docutils literal notranslate"><span class="pre">sign()</span></code> and has to be recreated if it is to be used again.</p>
<p>We may now send the signed message via SMTP. In these examples, we shall
not do so; instead, we’ll render the S/MIME output in mail-friendly
format, and pretend that our messages are sent and received
correctly:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="c1"># Recreate buf.</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># Recreate buf.</span>
<span class="n">buf</span> <span class="o">=</span> <span class="n">makebuf</span><span class="p">(</span><span class="s1">&#39;a sign of our times&#39;</span><span class="p">)</span>
<span class="c1"># Output p7 in mail-friendly format.</span>
@@ -274,7 +268,7 @@ correctly:</p>
</pre></div>
</div>
<p>Here’s the output:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">To</span><span class="p">:</span> <span class="n">recipient</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">Subject</span><span class="p">:</span> <span class="n">M2Crypto</span> <span class="n">S</span><span class="o">/</span><span class="n">MIME</span> <span class="n">testing</span>
<span class="n">MIME</span><span class="o">-</span><span class="n">Version</span><span class="p">:</span> <span class="mf">1.0</span>
@@ -323,9 +317,9 @@ correctly:</p>
</div>
<div class="section" id="verify">
<h1>Verify<a class="headerlink" href="#verify" title="Permalink to this headline">¶</a></h1>
-<p>Assume the above output has been saved into <code class="docutils literal"><span class="pre">sign.p7</span></code>. Let’s now
+<p>Assume the above output has been saved into <code class="docutils literal notranslate"><span class="pre">sign.p7</span></code>. Let’s now
verify the signature:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="c1"># Instantiate an SMIME object.</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
@@ -351,16 +345,16 @@ verify the signature:</p>
</pre></div>
</div>
<p>Here’s the output of the above program:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
<span class="o">&lt;</span><span class="n">M2Crypto</span><span class="o">.</span><span class="n">BIO</span><span class="o">.</span><span class="n">BIO</span> <span class="n">instance</span> <span class="n">at</span> <span class="mh">0x822012c</span><span class="o">&gt;</span>
<span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
</pre></div>
</div>
-<p>Suppose, instead of loading <code class="docutils literal"><span class="pre">signer.pem</span></code> above, we load
-<code class="docutils literal"><span class="pre">recipient.pem</span></code>. That is, we do a global substitution of
-<code class="docutils literal"><span class="pre">recipient.pem</span></code> for <code class="docutils literal"><span class="pre">signer.pem</span></code> in the above program. Here’s the
+<p>Suppose, instead of loading <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code> above, we load
+<code class="docutils literal notranslate"><span class="pre">recipient.pem</span></code>. That is, we do a global substitution of
+<code class="docutils literal notranslate"><span class="pre">recipient.pem</span></code> for <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code> in the above program. Here’s the
modified program’s output:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span>Traceback (most recent call last):
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>Traceback (most recent call last):
File &quot;./verify.py&quot;, line 22, in ?
v = s.verify(p7)
File &quot;/usr/local/home/ngps/prog/m2/M2Crypto/SMIME.py&quot;, line 205, in verify
@@ -369,14 +363,14 @@ M2Crypto.SMIME.SMIME_Error: 312:error:21075075:PKCS7 routines:PKCS7_verify:certi
</pre></div>
</div>
<p>As displayed, the error is generated by line 213 of OpenSSL’s
-<code class="docutils literal"><span class="pre">pk7_smime.c</span></code> (as of OpenSSL 0.9.6); if you are a C programmer, you
+<code class="docutils literal notranslate"><span class="pre">pk7_smime.c</span></code> (as of OpenSSL 0.9.6); if you are a C programmer, you
may wish to look up the C source to explore OpenSSL’s S/MIME
implementation and understand why the error message is worded thus.</p>
</div>
<div class="section" id="encrypt">
<h1>Encrypt<a class="headerlink" href="#encrypt" title="Permalink to this headline">¶</a></h1>
<p>We now demonstrate how to generate an S/MIME-encrypted message:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
@@ -416,7 +410,7 @@ implementation and understand why the error message is worded thus.</p>
</pre></div>
</div>
<p>Here’s the output of the above program:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">To</span><span class="p">:</span> <span class="n">recipient</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">Subject</span><span class="p">:</span> <span class="n">M2Crypto</span> <span class="n">S</span><span class="o">/</span><span class="n">MIME</span> <span class="n">testing</span>
<span class="n">MIME</span><span class="o">-</span><span class="n">Version</span><span class="p">:</span> <span class="mf">1.0</span>
@@ -437,9 +431,9 @@ implementation and understand why the error message is worded thus.</p>
</div>
<div class="section" id="decrypt">
<h1>Decrypt<a class="headerlink" href="#decrypt" title="Permalink to this headline">¶</a></h1>
-<p>Assume the above output has been saved into <code class="docutils literal"><span class="pre">encrypt.p7</span></code>. Decrypt the
+<p>Assume the above output has been saved into <code class="docutils literal notranslate"><span class="pre">encrypt.p7</span></code>. Decrypt the
message thusly:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="c1"># Instantiate an SMIME object.</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
@@ -457,14 +451,14 @@ message thusly:</p>
</pre></div>
</div>
<p>Here’s the output:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
</pre></div>
</div>
</div>
<div class="section" id="sign-and-encrypt">
<h1>Sign and Encrypt<a class="headerlink" href="#sign-and-encrypt" title="Permalink to this headline">¶</a></h1>
<p>Here’s how to generate an S/MIME-signed/encrypted message:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
<span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
@@ -514,7 +508,7 @@ message thusly:</p>
</pre></div>
</div>
<p>Here’s the output of the above program:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">From</span><span class="p">:</span> <span class="n">sender</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">To</span><span class="p">:</span> <span class="n">recipient</span><span class="nd">@example</span><span class="o">.</span><span class="n">dom</span>
<span class="n">Subject</span><span class="p">:</span> <span class="n">M2Crypto</span> <span class="n">S</span><span class="o">/</span><span class="n">MIME</span> <span class="n">testing</span>
<span class="n">MIME</span><span class="o">-</span><span class="n">Version</span><span class="p">:</span> <span class="mf">1.0</span>
@@ -574,9 +568,9 @@ message thusly:</p>
</div>
<div class="section" id="decrypt-and-verify">
<h1>Decrypt and Verify<a class="headerlink" href="#decrypt-and-verify" title="Permalink to this headline">¶</a></h1>
-<p>Suppose the above output has been saved into <code class="docutils literal"><span class="pre">se.p7</span></code>. The following
+<p>Suppose the above output has been saved into <code class="docutils literal notranslate"><span class="pre">se.p7</span></code>. The following
demonstrates how to decrypt and verify it:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="c1"># Instantiate an SMIME object.</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
@@ -613,7 +607,7 @@ demonstrates how to decrypt and verify it:</p>
</pre></div>
</div>
<p>The output is as follows:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="n">sign</span> <span class="n">of</span> <span class="n">our</span> <span class="n">times</span>
</pre></div>
</div>
</div>
@@ -623,7 +617,7 @@ demonstrates how to decrypt and verify it:</p>
and received automagically. The following is a Python function that
generates S/MIME-signed/encrypted messages and sends them via
SMTP:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="k">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
<span class="kn">import</span> <span class="nn">smtplib</span><span class="o">,</span> <span class="nn">string</span><span class="o">,</span> <span class="nn">sys</span>
<span class="k">def</span> <span class="nf">sendsmime</span><span class="p">(</span><span class="n">from_addr</span><span class="p">,</span> <span class="n">to_addrs</span><span class="p">,</span> <span class="n">subject</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">from_key</span><span class="p">,</span> <span class="n">from_cert</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">to_certs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">smtpd</span><span class="o">=</span><span class="s1">&#39;localhost&#39;</span><span class="p">):</span>
@@ -676,22 +670,22 @@ SMTP:</p>
</div>
<p>This function sends plain, S/MIME-signed, S/MIME-encrypted, and
S/MIME-signed/encrypted messages, depending on the parameters
-<code class="docutils literal"><span class="pre">from_key</span></code> and <code class="docutils literal"><span class="pre">to_certs</span></code>. The function’s output interoperates with
+<code class="docutils literal notranslate"><span class="pre">from_key</span></code> and <code class="docutils literal notranslate"><span class="pre">to_certs</span></code>. The function’s output interoperates with
Netscape Messenger.</p>
</div>
<div class="section" id="verifying-origin-of-s-mime-messages">
<h1>Verifying origin of S/MIME messages<a class="headerlink" href="#verifying-origin-of-s-mime-messages" title="Permalink to this headline">¶</a></h1>
<p>In our examples above that decrypt or verify messages, we skipped a
-step: verifying that the <code class="docutils literal"><span class="pre">from</span></code> address of the message matches the
-<code class="docutils literal"><span class="pre">email</span> <span class="pre">address</span></code> attribute in the sender’s certificate.</p>
+step: verifying that the <code class="docutils literal notranslate"><span class="pre">from</span></code> address of the message matches the
+<code class="docutils literal notranslate"><span class="pre">email</span> <span class="pre">address</span></code> attribute in the sender’s certificate.</p>
<p>The premise of current X.509 certification practice is that the CA is
supposed to verify your identity, and to issue a certificate with
-<code class="docutils literal"><span class="pre">email</span> <span class="pre">address</span></code> that matches your actual mail address. (Verisign’s
+<code class="docutils literal notranslate"><span class="pre">email</span> <span class="pre">address</span></code> that matches your actual mail address. (Verisign’s
March 2001 failure in identity verification resulting in Microsoft
certificates being issued to spoofers notwithstanding.)</p>
<p>If you run your own CA, your certification practice is up to you, of
course, and it would probably be part of your security policy.</p>
-<p>Whether your S/MIME messaging application needs to verify the <code class="docutils literal"><span class="pre">from</span></code>
+<p>Whether your S/MIME messaging application needs to verify the <code class="docutils literal notranslate"><span class="pre">from</span></code>
addresses of S/MIME messages depends on your security policy and your
system’s threat model, as always.</p>
</div>
@@ -709,7 +703,7 @@ key and certificate for Messenger:</p>
<ol class="arabic">
<li><p class="first">Transform S/MIME Recipient’s private key and certificate into <em>PKCS
#12</em> format:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">pkcs12</span> <span class="o">-</span><span class="n">export</span> <span class="o">-</span><span class="ow">in</span> <span class="n">recipient</span><span class="o">.</span><span class="n">pem</span> <span class="o">-</span><span class="n">inkey</span> <span class="n">recipient_key</span><span class="o">.</span><span class="n">pem</span> \
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">pkcs12</span> <span class="o">-</span><span class="n">export</span> <span class="o">-</span><span class="ow">in</span> <span class="n">recipient</span><span class="o">.</span><span class="n">pem</span> <span class="o">-</span><span class="n">inkey</span> <span class="n">recipient_key</span><span class="o">.</span><span class="n">pem</span> \
<span class="o">-</span><span class="n">name</span> <span class="s2">&quot;S/MIME Recipient&quot;</span> <span class="o">-</span><span class="n">out</span> <span class="n">recipient</span><span class="o">.</span><span class="n">p12</span>
<span class="n">Enter</span> <span class="n">Export</span> <span class="n">Password</span><span class="p">:</span><span class="o">&lt;</span><span class="n">enter</span><span class="o">&gt;</span>
@@ -724,24 +718,24 @@ Messenger’s window. This brings up the “Security Info” dialog box.</p>
</li>
<li><p class="first">Click on “Yours” under “Certificates”.</p>
</li>
-<li><p class="first">Select “Import a certificate”, then pick <code class="docutils literal"><span class="pre">recipient.p12</span></code> from the
+<li><p class="first">Select “Import a certificate”, then pick <code class="docutils literal notranslate"><span class="pre">recipient.p12</span></code> from the
ensuing file selection dialog box.</p>
</li>
</ol>
-<p>Next, you need to import <code class="docutils literal"><span class="pre">signer.pem</span></code> as a CA certificate, so that
+<p>Next, you need to import <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code> as a CA certificate, so that
Messenger will mark messages signed by S/MIME Sender as “trusted”:</p>
<ol class="arabic">
-<li><p class="first">Create a DER encoding of <code class="docutils literal"><span class="pre">signer.pem</span></code>:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">x509</span> <span class="o">-</span><span class="n">inform</span> <span class="n">pem</span> <span class="o">-</span><span class="n">outform</span> <span class="n">der</span> <span class="o">-</span><span class="ow">in</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span> <span class="o">-</span><span class="n">out</span> <span class="n">signer</span><span class="o">.</span><span class="n">der</span>
+<li><p class="first">Create a DER encoding of <code class="docutils literal notranslate"><span class="pre">signer.pem</span></code>:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">openssl</span> <span class="n">x509</span> <span class="o">-</span><span class="n">inform</span> <span class="n">pem</span> <span class="o">-</span><span class="n">outform</span> <span class="n">der</span> <span class="o">-</span><span class="ow">in</span> <span class="n">signer</span><span class="o">.</span><span class="n">pem</span> <span class="o">-</span><span class="n">out</span> <span class="n">signer</span><span class="o">.</span><span class="n">der</span>
</pre></div>
</div>
</li>
-<li><p class="first">Install <code class="docutils literal"><span class="pre">signer.der</span></code> into Messenger as MIME type
-<code class="docutils literal"><span class="pre">application/x-x509-ca-cert</span></code>. You do this by downloading
-<code class="docutils literal"><span class="pre">signer.der</span></code> via Navigator from a HTTP or HTTPS server, with the
-correct MIME type mapping. (You may use <code class="docutils literal"><span class="pre">demo/ssl/https_srv.py</span></code>,
+<li><p class="first">Install <code class="docutils literal notranslate"><span class="pre">signer.der</span></code> into Messenger as MIME type
+<code class="docutils literal notranslate"><span class="pre">application/x-x509-ca-cert</span></code>. You do this by downloading
+<code class="docutils literal notranslate"><span class="pre">signer.der</span></code> via Navigator from a HTTP or HTTPS server, with the
+correct MIME type mapping. (You may use <code class="docutils literal notranslate"><span class="pre">demo/ssl/https_srv.py</span></code>,
bundled with M2Crypto, for this purpose.) Follow the series of dialog
-boxes to accept <code class="docutils literal"><span class="pre">signer.der</span></code> as a CA for certifying email users.</p>
+boxes to accept <code class="docutils literal notranslate"><span class="pre">signer.der</span></code> as a CA for certifying email users.</p>
</li>
</ol>
<p>S/MIME Recipient is now able to decrypt and read S/MIME Sender’s
@@ -752,7 +746,7 @@ may be, via the “stamp” icon on the message window’s top right corner.</p>
Messenger informs you that the message is, say, encrypted with 168-bit
DES-EDE3-CBC and that it is digitally signed by the private key
corresponding to the public key contained in the certificate
-<code class="docutils literal"><span class="pre">signer.pem</span></code>.</p>
+<code class="docutils literal notranslate"><span class="pre">signer.pem</span></code>.</p>
</div>
<div class="section" id="interoperating-with-microsoft-outlook">
<h1>Interoperating with Microsoft Outlook<a class="headerlink" href="#interoperating-with-microsoft-outlook" title="Permalink to this headline">¶</a></h1>
@@ -786,30 +780,25 @@ document.)</p>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">HOWTO: Programming S/MIME in Python with M2Crypto</a></li>
-<li><a class="reference internal" href="#introduction">Introduction</a></li>
-<li><a class="reference internal" href="#s-mime">S/MIME</a></li>
-<li><a class="reference internal" href="#keys-and-certificates">Keys and Certificates</a></li>
-<li><a class="reference internal" href="#m2crypto-smime">M2Crypto.SMIME</a></li>
-<li><a class="reference internal" href="#sign">Sign</a></li>
-<li><a class="reference internal" href="#verify">Verify</a></li>
-<li><a class="reference internal" href="#encrypt">Encrypt</a></li>
-<li><a class="reference internal" href="#decrypt">Decrypt</a></li>
-<li><a class="reference internal" href="#sign-and-encrypt">Sign and Encrypt</a></li>
-<li><a class="reference internal" href="#decrypt-and-verify">Decrypt and Verify</a></li>
-<li><a class="reference internal" href="#sending-s-mime-messages-via-smtp">Sending S/MIME messages via SMTP</a></li>
-<li><a class="reference internal" href="#verifying-origin-of-s-mime-messages">Verifying origin of S/MIME messages</a></li>
-<li><a class="reference internal" href="#interoperating-with-netscape-messenger">Interoperating with Netscape Messenger</a></li>
-<li><a class="reference internal" href="#interoperating-with-microsoft-outlook">Interoperating with Microsoft Outlook</a></li>
-<li><a class="reference internal" href="#zsmime">ZSmime</a></li>
-<li><a class="reference internal" href="#resources">Resources</a></li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -817,23 +806,26 @@ document.)</p>
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/howto.smime.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -842,8 +834,8 @@ document.)</p>
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/howto.smime.rst.txt"
diff --git a/doc/html/howto.ssl.html b/doc/html/howto.ssl.html
index f31f9db..759cb85 100644
--- a/doc/html/howto.ssl.html
+++ b/doc/html/howto.ssl.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HOWTO: Programming SSL in Python with M2Crypto &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -29,13 +22,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="howto-programming-ssl-in-python-with-m2crypto">
@@ -76,11 +70,11 @@ class HTTPSConnection.</p>
is that M2Crypto’s version accepts an M2Crypto.SSL.Context instance as a
parameter, whereas Python 2.x’s SSL support does not permit Pythonic
control of the SSL context.</p>
-<p>Within the implementations, Python’s <code class="docutils literal"><span class="pre">HTTPSConnection</span></code> employs a
-<code class="docutils literal"><span class="pre">FakeSocket</span></code> object, which collects all input from the SSL connection
-before returning it to the application as a <code class="docutils literal"><span class="pre">StringIO</span></code> buffer, whereas
-M2Crypto’s <code class="docutils literal"><span class="pre">HTTPSConnection</span></code> uses a buffering
-<code class="docutils literal"><span class="pre">M2Crypto.BIO.IOBuffer</span></code> object that works over the underlying
+<p>Within the implementations, Python’s <code class="docutils literal notranslate"><span class="pre">HTTPSConnection</span></code> employs a
+<code class="docutils literal notranslate"><span class="pre">FakeSocket</span></code> object, which collects all input from the SSL connection
+before returning it to the application as a <code class="docutils literal notranslate"><span class="pre">StringIO</span></code> buffer, whereas
+M2Crypto’s <code class="docutils literal notranslate"><span class="pre">HTTPSConnection</span></code> uses a buffering
+<code class="docutils literal notranslate"><span class="pre">M2Crypto.BIO.IOBuffer</span></code> object that works over the underlying
M2Crypto.SSL.Connection directly.</p>
<p>Since then M2Crypto has gained a Twisted wrapper that allows securing
Twisted SSL connections with M2Crypto.</p>
@@ -93,7 +87,7 @@ by John Viega, Matt Messier and Pravir Chandra, ISBN 059600270X.</p>
There are various steps that need to be made before we can make that
claim. Let’s see how a simple client can establish a secure
connection:</p>
-<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
<span class="n">ctx</span><span class="o">.</span><span class="n">set_verify</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">verify_peer</span> <span class="o">|</span> <span class="n">SSL</span><span class="o">.</span><span class="n">verify_fail_if_no_peer_cert</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ctx</span><span class="o">.</span><span class="n">load_verify_locations</span><span class="p">(</span><span class="s1">&#39;ca.pem&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No CA certs&#39;</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
@@ -156,19 +150,25 @@ material).”</p>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="index.html">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">HOWTO: Programming SSL in Python with M2Crypto</a></li>
-<li><a class="reference internal" href="#introduction">Introduction</a></li>
-<li><a class="reference internal" href="#a-bit-of-history">A bit of history</a></li>
-<li><a class="reference internal" href="#secure-ssl">Secure SSL</a></li>
-<li><a class="reference internal" href="#code-samples">Code Samples</a></li>
-<li><a class="reference internal" href="#ssldump">ssldump</a></li>
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -176,23 +176,26 @@ material).”</p>
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/howto.ssl.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -201,8 +204,8 @@ material).”</p>
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/howto.ssl.rst.txt"
diff --git a/doc/html/index.html b/doc/html/index.html
index cabf99c..6116ded 100644
--- a/doc/html/index.html
+++ b/doc/html/index.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome to M2Crypto’s documentation! &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="M2Crypto Package" href="M2Crypto.html" />
@@ -30,13 +23,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<div class="section" id="welcome-to-m2crypto-s-documentation">
@@ -45,45 +39,45 @@
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#id1"><code class="docutils literal"><span class="pre">M2Crypto</span></code> Package</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ASN1"><code class="docutils literal"><span class="pre">ASN1</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.AuthCookie"><code class="docutils literal"><span class="pre">AuthCookie</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BIO"><code class="docutils literal"><span class="pre">BIO</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BN"><code class="docutils literal"><span class="pre">BN</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DH"><code class="docutils literal"><span class="pre">DH</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DSA"><code class="docutils literal"><span class="pre">DSA</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EC"><code class="docutils literal"><span class="pre">EC</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EVP"><code class="docutils literal"><span class="pre">EVP</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Engine"><code class="docutils literal"><span class="pre">Engine</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Err"><code class="docutils literal"><span class="pre">Err</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RC4"><code class="docutils literal"><span class="pre">RC4</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RSA"><code class="docutils literal"><span class="pre">RSA</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Rand"><code class="docutils literal"><span class="pre">Rand</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.SMIME"><code class="docutils literal"><span class="pre">SMIME</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.X509"><code class="docutils literal"><span class="pre">X509</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.callback"><code class="docutils literal"><span class="pre">callback</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ftpslib"><code class="docutils literal"><span class="pre">ftpslib</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.httpslib"><code class="docutils literal"><span class="pre">httpslib</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2"><code class="docutils literal"><span class="pre">m2</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2crypto"><code class="docutils literal"><span class="pre">m2crypto</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib"><code class="docutils literal"><span class="pre">m2urllib</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib2"><code class="docutils literal"><span class="pre">m2urllib2</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2xmlrpclib"><code class="docutils literal"><span class="pre">m2xmlrpclib</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.threading"><code class="docutils literal"><span class="pre">threading</span></code> Module</a></li>
-<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.util"><code class="docutils literal"><span class="pre">util</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#id1"><code class="docutils literal notranslate"><span class="pre">M2Crypto</span></code> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ASN1"><code class="docutils literal notranslate"><span class="pre">ASN1</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.AuthCookie"><code class="docutils literal notranslate"><span class="pre">AuthCookie</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BIO"><code class="docutils literal notranslate"><span class="pre">BIO</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BN"><code class="docutils literal notranslate"><span class="pre">BN</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DH"><code class="docutils literal notranslate"><span class="pre">DH</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DSA"><code class="docutils literal notranslate"><span class="pre">DSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EC"><code class="docutils literal notranslate"><span class="pre">EC</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EVP"><code class="docutils literal notranslate"><span class="pre">EVP</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Engine"><code class="docutils literal notranslate"><span class="pre">Engine</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Err"><code class="docutils literal notranslate"><span class="pre">Err</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RC4"><code class="docutils literal notranslate"><span class="pre">RC4</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RSA"><code class="docutils literal notranslate"><span class="pre">RSA</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Rand"><code class="docutils literal notranslate"><span class="pre">Rand</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.SMIME"><code class="docutils literal notranslate"><span class="pre">SMIME</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.X509"><code class="docutils literal notranslate"><span class="pre">X509</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.callback"><code class="docutils literal notranslate"><span class="pre">callback</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ftpslib"><code class="docutils literal notranslate"><span class="pre">ftpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.httpslib"><code class="docutils literal notranslate"><span class="pre">httpslib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2"><code class="docutils literal notranslate"><span class="pre">m2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2crypto"><code class="docutils literal notranslate"><span class="pre">m2crypto</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib"><code class="docutils literal notranslate"><span class="pre">m2urllib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib2"><code class="docutils literal notranslate"><span class="pre">m2urllib2</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2xmlrpclib"><code class="docutils literal notranslate"><span class="pre">m2xmlrpclib</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.threading"><code class="docutils literal notranslate"><span class="pre">threading</span></code> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.util"><code class="docutils literal notranslate"><span class="pre">util</span></code> Module</a></li>
<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#subpackages">Subpackages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="M2Crypto.SSL.html">SSL Package</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#id1"><code class="docutils literal"><span class="pre">SSL</span></code> Package</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><code class="docutils literal"><span class="pre">Checker</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><code class="docutils literal"><span class="pre">Cipher</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><code class="docutils literal"><span class="pre">Connection</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><code class="docutils literal"><span class="pre">Context</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><code class="docutils literal"><span class="pre">SSLServer</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><code class="docutils literal"><span class="pre">Session</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><code class="docutils literal"><span class="pre">cb</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
-<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><code class="docutils literal"><span class="pre">timeout</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#id1"><code class="docutils literal notranslate"><span class="pre">SSL</span></code> Package</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><code class="docutils literal notranslate"><span class="pre">Checker</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><code class="docutils literal notranslate"><span class="pre">Cipher</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><code class="docutils literal notranslate"><span class="pre">Connection</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><code class="docutils literal notranslate"><span class="pre">Context</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><code class="docutils literal notranslate"><span class="pre">SSLServer</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><code class="docutils literal notranslate"><span class="pre">Session</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><code class="docutils literal notranslate"><span class="pre">TwistedProtocolWrapper</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><code class="docutils literal notranslate"><span class="pre">cb</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><code class="docutils literal notranslate"><span class="pre">ssl_dispatcher</span></code> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><code class="docutils literal notranslate"><span class="pre">timeout</span></code> Module</a></li>
</ul>
</li>
</ul>
@@ -113,16 +107,25 @@
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
- <h3><a href="#">Table Of Contents</a></h3>
- <ul>
-<li><a class="reference internal" href="#">Welcome to M2Crypto’s documentation!</a></li>
-<li><a class="reference internal" href="#howtos">HOWTOs</a></li>
-<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
+<h1 class="logo"><a href="#">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
</ul>
+
<div class="relations">
<h3>Related Topics</h3>
<ul>
@@ -131,23 +134,26 @@
</ul></li>
</ul>
</div>
- <div role="note" aria-label="source link">
- <h3>This Page</h3>
- <ul class="this-page-menu">
- <li><a href="_sources/index.rst.txt"
- rel="nofollow">Show Source</a></li>
- </ul>
- </div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -156,8 +162,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
|
<a href="_sources/index.rst.txt"
diff --git a/doc/html/objects.inv b/doc/html/objects.inv
index 82b7dd9..8955897 100644
--- a/doc/html/objects.inv
+++ b/doc/html/objects.inv
Binary files differ
diff --git a/doc/html/py-modindex.html b/doc/html/py-modindex.html
index 85d8c98..628e2c5 100644
--- a/doc/html/py-modindex.html
+++ b/doc/html/py-modindex.html
@@ -4,23 +4,16 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Python Module Index &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
@@ -32,13 +25,14 @@
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
@@ -247,10 +241,26 @@
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
@@ -259,14 +269,24 @@
</div>
<div id="searchbox" style="display: none" role="search">
<h3>Quick search</h3>
+ <div class="searchformwrapper">
<form class="search" action="search.html" method="get">
- <div><input type="text" name="q" /></div>
- <div><input type="submit" value="Go" /></div>
+ <input type="text" name="q" />
+ <input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
+ </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -275,8 +295,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/search.html b/doc/html/search.html
index ac23baf..5e59920 100644
--- a/doc/html/search.html
+++ b/doc/html/search.html
@@ -4,23 +4,17 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &#8212; M2Crypto documentation</title>
<link rel="stylesheet" href="_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
- <script type="text/javascript">
- var DOCUMENTATION_OPTIONS = {
- URL_ROOT: './',
- VERSION: '',
- COLLAPSE_INDEX: false,
- FILE_SUFFIX: '.html',
- HAS_SOURCE: true,
- SOURCELINK_SUFFIX: '.txt'
- };
- </script>
+
+ <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
+ <script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
@@ -37,13 +31,14 @@
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
- </head>
- <body>
+ </head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
+
+
<div class="body" role="main">
<h1 id="search-documentation">Search</h1>
@@ -71,16 +66,40 @@
</div>
</div>
+
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
- <div class="sphinxsidebarwrapper"><div class="relations">
+ <div class="sphinxsidebarwrapper">
+<h1 class="logo"><a href="index.html">M2Crypto</a></h1>
+
+
+
+
+
+
+
+
+<h3>Navigation</h3>
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a></li>
+</ul>
+
+<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="index.html">Documentation overview</a><ul>
</ul></li>
</ul>
</div>
+
+
+
+
+
+
+
+
</div>
</div>
<div class="clearer"></div>
@@ -89,8 +108,8 @@
&copy;2017, Matej Cepl <mcepl@cepl.eu>.
|
- Powered by <a href="http://sphinx-doc.org/">Sphinx 1.6.4</a>
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.8.5</a>
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js
index b55849b..d376536 100644
--- a/doc/html/searchindex.js
+++ b/doc/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["M2Crypto","M2Crypto.SSL","ZServerSSL-HOWTO","howto.ca","howto.smime","howto.ssl","index"],envversion:52,filenames:["M2Crypto.rst","M2Crypto.SSL.rst","ZServerSSL-HOWTO.rst","howto.ca.rst","howto.smime.rst","howto.ssl.rst","index.rst"],objects:{"M2Crypto.ASN1":{ASN1_Integer:[0,1,1,""],ASN1_Object:[0,1,1,""],ASN1_String:[0,1,1,""],ASN1_TIME:[0,1,1,""],ASN1_UTCTIME:[0,3,1,""],LocalTimezone:[0,1,1,""]},"M2Crypto.ASN1.ASN1_Integer":{m2_asn1_integer_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_Object":{m2_asn1_object_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_String":{as_text:[0,2,1,""],m2_asn1_string_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_TIME":{get_datetime:[0,2,1,""],m2_asn1_time_free:[0,2,1,""],set_datetime:[0,2,1,""],set_string:[0,2,1,""],set_time:[0,2,1,""]},"M2Crypto.ASN1.LocalTimezone":{dst:[0,2,1,""],tzname:[0,2,1,""],utcoffset:[0,2,1,""]},"M2Crypto.AuthCookie":{AuthCookie:[0,1,1,""],AuthCookieJar:[0,1,1,""],mix:[0,4,1,""],unmix3:[0,4,1,""],unmix:[0,4,1,""]},"M2Crypto.AuthCookie.AuthCookie":{data:[0,2,1,""],expiry:[0,2,1,""],headerValue:[0,2,1,""],isExpired:[0,2,1,""],mac:[0,2,1,""],name:[0,2,1,""],output:[0,2,1,""],value:[0,2,1,""]},"M2Crypto.AuthCookie.AuthCookieJar":{isGoodCookie:[0,2,1,""],isGoodCookieString:[0,2,1,""],makeCookie:[0,2,1,""]},"M2Crypto.BIO":{BIO:[0,1,1,""],BIOError:[0,5,1,""],CipherStream:[0,1,1,""],File:[0,1,1,""],IOBuffer:[0,1,1,""],MemoryBuffer:[0,1,1,""],SSLBio:[0,1,1,""],openfile:[0,4,1,""]},"M2Crypto.BIO.BIO":{bio_ptr:[0,2,1,""],close:[0,2,1,""],fileno:[0,2,1,""],flush:[0,2,1,""],m2_bio_free:[0,2,1,""],read:[0,2,1,""],readable:[0,2,1,""],readline:[0,2,1,""],readlines:[0,2,1,""],reset:[0,2,1,""],seek:[0,2,1,""],should_read:[0,2,1,""],should_retry:[0,2,1,""],should_write:[0,2,1,""],tell:[0,2,1,""],write:[0,2,1,""],write_close:[0,2,1,""],writeable:[0,2,1,""]},"M2Crypto.BIO.CipherStream":{SALT_LEN:[0,3,1,""],close:[0,2,1,""],m2_bio_free:[0,2,1,""],m2_bio_pop:[0,2,1,""],set_cipher:[0,2,1,""],write_close:[0,2,1,""]},"M2Crypto.BIO.File":{close:[0,2,1,""],flush:[0,2,1,""],reset:[0,2,1,""]},"M2Crypto.BIO.IOBuffer":{close:[0,2,1,""],m2_bio_free:[0,2,1,""],m2_bio_pop:[0,2,1,""]},"M2Crypto.BIO.MemoryBuffer":{close:[0,2,1,""],getvalue:[0,2,1,""],read:[0,2,1,""],read_all:[0,2,1,""],write_close:[0,2,1,""]},"M2Crypto.BIO.SSLBio":{do_handshake:[0,2,1,""],set_ssl:[0,2,1,""]},"M2Crypto.BN":{rand:[0,4,1,""],rand_range:[0,4,1,""],randfname:[0,4,1,""]},"M2Crypto.DH":{DH:[0,1,1,""],DHError:[0,5,1,""],gen_params:[0,4,1,""],load_params:[0,4,1,""],load_params_bio:[0,4,1,""],set_params:[0,4,1,""]},"M2Crypto.DH.DH":{check_params:[0,2,1,""],compute_key:[0,2,1,""],gen_key:[0,2,1,""],m2_dh_free:[0,2,1,""],print_params:[0,2,1,""]},"M2Crypto.DSA":{DSA:[0,1,1,""],DSAError:[0,5,1,""],DSA_pub:[0,1,1,""],gen_params:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_params:[0,4,1,""],load_params_bio:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],pub_key_from_params:[0,4,1,""],set_params:[0,4,1,""]},"M2Crypto.DSA.DSA":{check_key:[0,2,1,""],gen_key:[0,2,1,""],m2_dsa_free:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_params:[0,2,1,""],save_params_bio:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],set_params:[0,2,1,""],sign:[0,2,1,""],sign_asn1:[0,2,1,""],verify:[0,2,1,""],verify_asn1:[0,2,1,""]},"M2Crypto.DSA.DSA_pub":{check_key:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],sign:[0,2,1,""],sign_asn1:[0,2,1,""]},"M2Crypto.EC":{EC:[0,1,1,""],ECError:[0,5,1,""],EC_pub:[0,1,1,""],ec_error:[0,4,1,""],gen_params:[0,4,1,""],get_builtin_curves:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_string:[0,4,1,""],load_key_string_pubkey:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],pub_key_from_der:[0,4,1,""],pub_key_from_params:[0,4,1,""]},"M2Crypto.EC.EC":{as_pem:[0,2,1,""],check_key:[0,2,1,""],compute_dh_key:[0,2,1,""],gen_key:[0,2,1,""],m2_ec_key_free:[0,2,1,""],pub:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],sign_dsa:[0,2,1,""],sign_dsa_asn1:[0,2,1,""],verify_dsa:[0,2,1,""],verify_dsa_asn1:[0,2,1,""]},"M2Crypto.EC.EC_pub":{get_der:[0,2,1,""],get_key:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""]},"M2Crypto.EVP":{Cipher:[0,1,1,""],EVPError:[0,5,1,""],HMAC:[0,1,1,""],MessageDigest:[0,1,1,""],PKey:[0,1,1,""],hmac:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_bio_pubkey:[0,4,1,""],load_key_string:[0,4,1,""],load_key_string_pubkey:[0,4,1,""],pbkdf2:[0,4,1,""]},"M2Crypto.EVP.Cipher":{"final":[0,2,1,""],m2_cipher_ctx_free:[0,2,1,""],set_padding:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.HMAC":{"final":[0,2,1,""],digest:[0,2,1,""],m2_hmac_ctx_free:[0,2,1,""],reset:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.MessageDigest":{"final":[0,2,1,""],digest:[0,2,1,""],m2_md_ctx_free:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.PKey":{"final":[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],assign_rsa:[0,2,1,""],get_modulus:[0,2,1,""],get_rsa:[0,2,1,""],m2_md_ctx_free:[0,2,1,""],m2_pkey_free:[0,2,1,""],reset_context:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],sign_final:[0,2,1,""],sign_init:[0,2,1,""],sign_update:[0,2,1,""],size:[0,2,1,""],update:[0,2,1,""],verify_final:[0,2,1,""],verify_init:[0,2,1,""],verify_update:[0,2,1,""]},"M2Crypto.Engine":{Engine:[0,1,1,""],EngineError:[0,5,1,""],cleanup:[0,4,1,""],load_dynamic:[0,4,1,""],load_dynamic_engine:[0,4,1,""],load_openssl:[0,4,1,""]},"M2Crypto.Engine.Engine":{ctrl_cmd_string:[0,2,1,""],finish:[0,2,1,""],get_id:[0,2,1,""],get_name:[0,2,1,""],init:[0,2,1,""],load_certificate:[0,2,1,""],load_private_key:[0,2,1,""],load_public_key:[0,2,1,""],m2_engine_free:[0,2,1,""],set_default:[0,2,1,""]},"M2Crypto.Err":{M2CryptoError:[0,5,1,""],SSLError:[0,5,1,""],get_error:[0,4,1,""],get_error_code:[0,4,1,""],get_error_func:[0,4,1,""],get_error_lib:[0,4,1,""],get_error_message:[0,4,1,""],get_error_reason:[0,4,1,""],get_x509_verify_error:[0,4,1,""],peek_error_code:[0,4,1,""]},"M2Crypto.RC4":{RC4:[0,1,1,""]},"M2Crypto.RC4.RC4":{"final":[0,2,1,""],rc4_free:[0,2,1,""],set_key:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.RSA":{RSA:[0,1,1,""],RSAError:[0,5,1,""],RSA_pub:[0,1,1,""],gen_key:[0,4,1,""],keygen_callback:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_string:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],new_pub_key:[0,4,1,""],rsa_error:[0,4,1,""]},"M2Crypto.RSA.RSA":{as_pem:[0,2,1,""],check_key:[0,2,1,""],m2_rsa_free:[0,2,1,""],private_decrypt:[0,2,1,""],private_encrypt:[0,2,1,""],pub:[0,2,1,""],public_decrypt:[0,2,1,""],public_encrypt:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_key_der:[0,2,1,""],save_key_der_bio:[0,2,1,""],save_pem:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],sign:[0,2,1,""],sign_rsassa_pss:[0,2,1,""],verify:[0,2,1,""],verify_rsassa_pss:[0,2,1,""]},"M2Crypto.RSA.RSA_pub":{check_key:[0,2,1,""],private_decrypt:[0,2,1,""],private_encrypt:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""]},"M2Crypto.Rand":{load_file:[0,4,1,""],rand_add:[0,4,1,""],rand_bytes:[0,4,1,""],rand_file_name:[0,4,1,""],rand_pseudo_bytes:[0,4,1,""],rand_seed:[0,4,1,""],rand_status:[0,4,1,""],save_file:[0,4,1,""]},"M2Crypto.SMIME":{Cipher:[0,1,1,""],PKCS7:[0,1,1,""],PKCS7_Error:[0,5,1,""],SMIME:[0,1,1,""],SMIME_Error:[0,5,1,""],load_pkcs7:[0,4,1,""],load_pkcs7_bio:[0,4,1,""],load_pkcs7_bio_der:[0,4,1,""],load_pkcs7_der:[0,4,1,""],smime_load_pkcs7:[0,4,1,""],smime_load_pkcs7_bio:[0,4,1,""],text_crlf:[0,4,1,""],text_crlf_bio:[0,4,1,""]},"M2Crypto.SMIME.PKCS7":{get0_signers:[0,2,1,""],m2_pkcs7_free:[0,2,1,""],type:[0,2,1,""],write:[0,2,1,""],write_der:[0,2,1,""]},"M2Crypto.SMIME.SMIME":{decrypt:[0,2,1,""],encrypt:[0,2,1,""],load_key:[0,2,1,""],load_key_bio:[0,2,1,""],set_cipher:[0,2,1,""],set_x509_stack:[0,2,1,""],set_x509_store:[0,2,1,""],sign:[0,2,1,""],unset_cipher:[0,2,1,""],unset_key:[0,2,1,""],unset_x509_stack:[0,2,1,""],unset_x509_store:[0,2,1,""],verify:[0,2,1,""],write:[0,2,1,""]},"M2Crypto.SSL":{Checker:[1,0,0,"-"],Cipher:[1,0,0,"-"],Connection:[1,0,0,"-"],Context:[1,0,0,"-"],SSLError:[1,5,1,""],SSLServer:[1,0,0,"-"],SSLTimeoutError:[1,5,1,""],Session:[1,0,0,"-"],TwistedProtocolWrapper:[1,0,0,"-"],cb:[1,0,0,"-"],ssl_dispatcher:[1,0,0,"-"],timeout:[1,0,0,"-"]},"M2Crypto.SSL.Checker":{Checker:[1,1,1,""],NoCertificate:[1,5,1,""],SSLVerificationError:[1,5,1,""],WrongCertificate:[1,5,1,""],WrongHost:[1,5,1,""]},"M2Crypto.SSL.Checker.Checker":{numericIpMatch:[1,3,1,""]},"M2Crypto.SSL.Cipher":{Cipher:[1,1,1,""],Cipher_Stack:[1,1,1,""]},"M2Crypto.SSL.Cipher.Cipher":{name:[1,2,1,""],version:[1,2,1,""]},"M2Crypto.SSL.Connection":{Connection:[1,1,1,""]},"M2Crypto.SSL.Connection.Connection":{accept:[1,2,1,""],accept_ssl:[1,2,1,""],bind:[1,2,1,""],clear:[1,2,1,""],clientPostConnectionCheck:[1,3,1,""],close:[1,2,1,""],connect:[1,2,1,""],connect_ssl:[1,2,1,""],fileno:[1,2,1,""],get_cipher:[1,2,1,""],get_cipher_list:[1,2,1,""],get_ciphers:[1,2,1,""],get_context:[1,2,1,""],get_default_session_timeout:[1,2,1,""],get_peer_cert:[1,2,1,""],get_peer_cert_chain:[1,2,1,""],get_session:[1,2,1,""],get_shutdown:[1,2,1,""],get_socket_read_timeout:[1,2,1,""],get_socket_write_timeout:[1,2,1,""],get_state:[1,2,1,""],get_verify_depth:[1,2,1,""],get_verify_mode:[1,2,1,""],get_verify_result:[1,2,1,""],get_version:[1,2,1,""],getpeername:[1,2,1,""],getsockname:[1,2,1,""],getsockopt:[1,2,1,""],listen:[1,2,1,""],m2_bio_free:[1,2,1,""],m2_ssl_free:[1,2,1,""],makefile:[1,2,1,""],pending:[1,2,1,""],read:[1,2,1,""],recv:[1,2,1,""],recv_into:[1,2,1,""],renegotiate:[1,2,1,""],send:[1,2,1,""],sendall:[1,2,1,""],serverPostConnectionCheck:[1,2,1,""],set_accept_state:[1,2,1,""],set_bio:[1,2,1,""],set_cipher_list:[1,2,1,""],set_client_CA_list_from_context:[1,2,1,""],set_client_CA_list_from_file:[1,2,1,""],set_connect_state:[1,2,1,""],set_post_connection_check_callback:[1,2,1,""],set_session:[1,2,1,""],set_session_id_ctx:[1,2,1,""],set_shutdown:[1,2,1,""],set_socket_read_timeout:[1,2,1,""],set_socket_write_timeout:[1,2,1,""],set_ssl_close_flag:[1,2,1,""],set_tlsext_host_name:[1,2,1,""],setblocking:[1,2,1,""],setsockopt:[1,2,1,""],settimeout:[1,2,1,""],setup_addr:[1,2,1,""],setup_ssl:[1,2,1,""],shutdown:[1,2,1,""],ssl_get_error:[1,2,1,""],verify_ok:[1,2,1,""],write:[1,2,1,""]},"M2Crypto.SSL.Context":{Context:[1,1,1,""],ctxmap:[1,4,1,""],map:[1,4,1,""]},"M2Crypto.SSL.Context.Context":{add_session:[1,2,1,""],close:[1,2,1,""],get_allow_unknown_ca:[1,2,1,""],get_cert_store:[1,2,1,""],get_session_cache_mode:[1,2,1,""],get_session_timeout:[1,2,1,""],get_verify_depth:[1,2,1,""],get_verify_mode:[1,2,1,""],load_cert:[1,2,1,""],load_cert_chain:[1,2,1,""],load_client_CA:[1,2,1,""],load_client_ca:[1,2,1,""],load_verify_info:[1,2,1,""],load_verify_locations:[1,2,1,""],m2_ssl_ctx_free:[1,2,1,""],remove_session:[1,2,1,""],set_allow_unknown_ca:[1,2,1,""],set_cipher_list:[1,2,1,""],set_client_CA_list_from_file:[1,2,1,""],set_default_verify_paths:[1,2,1,""],set_info_callback:[1,2,1,""],set_options:[1,2,1,""],set_session_cache_mode:[1,2,1,""],set_session_id_ctx:[1,2,1,""],set_session_timeout:[1,2,1,""],set_tmp_dh:[1,2,1,""],set_tmp_dh_callback:[1,2,1,""],set_tmp_rsa:[1,2,1,""],set_tmp_rsa_callback:[1,2,1,""],set_verify:[1,2,1,""]},"M2Crypto.SSL.SSLServer":{ForkingSSLServer:[1,1,1,""],SSLServer:[1,1,1,""],ThreadingSSLServer:[1,1,1,""]},"M2Crypto.SSL.SSLServer.SSLServer":{handle_error:[1,2,1,""],handle_request:[1,2,1,""]},"M2Crypto.SSL.Session":{Session:[1,1,1,""],load_session:[1,4,1,""]},"M2Crypto.SSL.Session.Session":{as_der:[1,2,1,""],as_text:[1,2,1,""],get_time:[1,2,1,""],get_timeout:[1,2,1,""],m2_ssl_session_free:[1,2,1,""],set_time:[1,2,1,""],set_timeout:[1,2,1,""],write_bio:[1,2,1,""]},"M2Crypto.SSL.TwistedProtocolWrapper":{TLSProtocolWrapper:[1,1,1,""],connectSSL:[1,4,1,""],connectTCP:[1,4,1,""],listenSSL:[1,4,1,""],listenTCP:[1,4,1,""]},"M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper":{clear:[1,2,1,""],connectionLost:[1,2,1,""],connectionMade:[1,2,1,""],dataReceived:[1,2,1,""],loseConnection:[1,2,1,""],startTLS:[1,2,1,""],write:[1,2,1,""],writeSequence:[1,2,1,""]},"M2Crypto.SSL.cb":{ssl_info_callback:[1,4,1,""],ssl_verify_callback:[1,4,1,""],ssl_verify_callback_allow_unknown_ca:[1,4,1,""],ssl_verify_callback_stub:[1,4,1,""]},"M2Crypto.SSL.ssl_dispatcher":{ssl_dispatcher:[1,1,1,""]},"M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher":{connect:[1,2,1,""],create_socket:[1,2,1,""],recv:[1,2,1,""],send:[1,2,1,""]},"M2Crypto.SSL.timeout":{struct_size:[1,4,1,""],struct_to_timeout:[1,4,1,""],timeout:[1,1,1,""]},"M2Crypto.SSL.timeout.timeout":{pack:[1,2,1,""]},"M2Crypto.X509":{CRL:[0,1,1,""],Request:[0,1,1,""],X509:[0,1,1,""],X509Error:[0,5,1,""],X509_Extension:[0,1,1,""],X509_Extension_Stack:[0,1,1,""],X509_Name:[0,1,1,""],X509_Name_Entry:[0,1,1,""],X509_Stack:[0,1,1,""],X509_Store:[0,1,1,""],X509_Store_Context:[0,1,1,""],load_cert:[0,4,1,""],load_cert_bio:[0,4,1,""],load_cert_der_string:[0,4,1,""],load_cert_string:[0,4,1,""],load_crl:[0,4,1,""],load_request:[0,4,1,""],load_request_bio:[0,4,1,""],load_request_der_string:[0,4,1,""],load_request_string:[0,4,1,""],new_extension:[0,4,1,""],new_stack_from_der:[0,4,1,""],x509_store_default_cb:[0,4,1,""]},"M2Crypto.X509.CRL":{as_text:[0,2,1,""],m2_x509_crl_free:[0,2,1,""]},"M2Crypto.X509.Request":{add_extensions:[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],as_text:[0,2,1,""],get_pubkey:[0,2,1,""],get_subject:[0,2,1,""],get_version:[0,2,1,""],m2_x509_req_free:[0,2,1,""],save:[0,2,1,""],save_pem:[0,2,1,""],set_pubkey:[0,2,1,""],set_subject:[0,2,1,""],set_subject_name:[0,2,1,""],set_version:[0,2,1,""],sign:[0,2,1,""],verify:[0,2,1,""]},"M2Crypto.X509.X509":{add_ext:[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],as_text:[0,2,1,""],check_ca:[0,2,1,""],check_purpose:[0,2,1,""],get_ext:[0,2,1,""],get_ext_at:[0,2,1,""],get_ext_count:[0,2,1,""],get_fingerprint:[0,2,1,""],get_issuer:[0,2,1,""],get_not_after:[0,2,1,""],get_not_before:[0,2,1,""],get_pubkey:[0,2,1,""],get_serial_number:[0,2,1,""],get_subject:[0,2,1,""],get_version:[0,2,1,""],m2_x509_free:[0,2,1,""],save:[0,2,1,""],save_pem:[0,2,1,""],set_issuer:[0,2,1,""],set_issuer_name:[0,2,1,""],set_not_after:[0,2,1,""],set_not_before:[0,2,1,""],set_pubkey:[0,2,1,""],set_serial_number:[0,2,1,""],set_subject:[0,2,1,""],set_subject_name:[0,2,1,""],set_version:[0,2,1,""],sign:[0,2,1,""],verify:[0,2,1,""]},"M2Crypto.X509.X509_Extension":{get_critical:[0,2,1,""],get_name:[0,2,1,""],get_value:[0,2,1,""],m2_x509_extension_free:[0,2,1,""],set_critical:[0,2,1,""]},"M2Crypto.X509.X509_Extension_Stack":{m2_sk_x509_extension_free:[0,2,1,""],pop:[0,2,1,""],push:[0,2,1,""]},"M2Crypto.X509.X509_Name":{add_entry_by_txt:[0,2,1,""],as_der:[0,2,1,""],as_hash:[0,2,1,""],as_text:[0,2,1,""],entry_count:[0,2,1,""],get_entries_by_nid:[0,2,1,""],m2_x509_name_free:[0,2,1,""],nid:[0,3,1,""]},"M2Crypto.X509.X509_Name_Entry":{create_by_txt:[0,2,1,""],get_data:[0,2,1,""],get_object:[0,2,1,""],m2_x509_name_entry_free:[0,2,1,""],set_data:[0,2,1,""],set_object:[0,2,1,""]},"M2Crypto.X509.X509_Stack":{as_der:[0,2,1,""],m2_sk_x509_free:[0,2,1,""],pop:[0,2,1,""],push:[0,2,1,""]},"M2Crypto.X509.X509_Store":{add_cert:[0,2,1,""],add_x509:[0,2,1,""],load_info:[0,2,1,""],load_locations:[0,2,1,""],m2_x509_store_free:[0,2,1,""],set_verify_cb:[0,2,1,""]},"M2Crypto.X509.X509_Store_Context":{get1_chain:[0,2,1,""],get_current_cert:[0,2,1,""],get_error:[0,2,1,""],get_error_depth:[0,2,1,""],m2_x509_store_ctx_free:[0,2,1,""]},"M2Crypto.ftpslib":{FTP_TLS:[0,1,1,""]},"M2Crypto.ftpslib.FTP_TLS":{auth_ssl:[0,2,1,""],auth_tls:[0,2,1,""],ntransfercmd:[0,2,1,""],prot_c:[0,2,1,""],prot_p:[0,2,1,""]},"M2Crypto.httpslib":{HTTPSConnection:[0,1,1,""],ProxyHTTPSConnection:[0,1,1,""]},"M2Crypto.httpslib.HTTPSConnection":{close:[0,2,1,""],connect:[0,2,1,""],default_port:[0,3,1,""],get_session:[0,2,1,""],set_session:[0,2,1,""]},"M2Crypto.httpslib.ProxyHTTPSConnection":{connect:[0,2,1,""],endheaders:[0,2,1,""],putheader:[0,2,1,""],putrequest:[0,2,1,""]},"M2Crypto.m2urllib":{open_https:[0,4,1,""]},"M2Crypto.m2urllib2":{HTTPSHandler:[0,1,1,""],build_opener:[0,4,1,""]},"M2Crypto.m2urllib2.HTTPSHandler":{https_open:[0,2,1,""],https_request:[0,2,1,""]},"M2Crypto.m2xmlrpclib":{SSL_Transport:[0,1,1,""]},"M2Crypto.m2xmlrpclib.SSL_Transport":{request:[0,2,1,""],user_agent:[0,3,1,""]},"M2Crypto.threading":{cleanup:[0,4,1,""],init:[0,4,1,""]},"M2Crypto.util":{UtilError:[0,5,1,""],bin_to_hex:[0,4,1,""],genparam_callback:[0,4,1,""],no_passphrase_callback:[0,4,1,""],octx_to_num:[0,4,1,""],passphrase_callback:[0,4,1,""],pkcs5_pad:[0,4,1,""],pkcs7_pad:[0,4,1,""],py3bytes:[0,4,1,""],py3str:[0,4,1,""],quiet_genparam_callback:[0,4,1,""]},M2Crypto:{ASN1:[0,0,0,"-"],AuthCookie:[0,0,0,"-"],BIO:[0,0,0,"-"],BN:[0,0,0,"-"],DH:[0,0,0,"-"],DSA:[0,0,0,"-"],EC:[0,0,0,"-"],EVP:[0,0,0,"-"],Engine:[0,0,0,"-"],Err:[0,0,0,"-"],RC4:[0,0,0,"-"],RSA:[0,0,0,"-"],Rand:[0,0,0,"-"],SMIME:[0,0,0,"-"],SSL:[1,0,0,"-"],X509:[0,0,0,"-"],__init__:[0,0,0,"-"],callback:[0,0,0,"-"],ftpslib:[0,0,0,"-"],httpslib:[0,0,0,"-"],m2:[0,0,0,"-"],m2crypto:[0,0,0,"-"],m2urllib2:[0,0,0,"-"],m2urllib:[0,0,0,"-"],m2xmlrpclib:[0,0,0,"-"],threading:[0,0,0,"-"],util:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"],"5":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:function","5":"py:exception"},terms:{"059600270x":5,"0ipy80":4,"0jwuq":4,"0qjhp6hut7fso":4,"0x0":[3,4],"0x1":3,"0x10001":[3,4],"0x2":[3,4],"0x822012c":4,"19973a9dbbb601ba":3,"1bc9f3q":4,"1czdztgk7h9cdgx2qjsivymyytcfi3zsuzmjs8":3,"1dr9dy8l0naqh21y5fgss8b1wd":4,"1ezn9zmlryqzbtxnnrmp3dhj":4,"1g9epovswhpqr":4,"1hxxfyo88m":3,"1qk53c":3,"1t8luishhn9899imp2vyg0ub67fqfypymm2cm2":4,"1tcaqbmq":4,"1vsrcid":3,"217mrhyx2nswgrpkqndu3gespovml3jeqiaxuponbwq7rj42":3,"2aglpogdcfdioqblb2dcscohmbbvr":3,"2bconvert":1,"2bdqvfpffx5lsmitkzaobldssjfr6rojxoqrsgia2az":4,"2cjcbfzokmijci03kbtqxofiqglstwxgzknf":3,"2dnyol50zu0sdzst1":3,"2iwrpascbeid8saraql3ddcli":3,"2zz2g7x1hxrwh95a":4,"3c93156fc7b4ebf49fe9c7db7f503087":4,"3dizhtxigepfztiuyutxs3i2gnmx2pee3chtllywd3jneakz0iozpdphif2xhllq":4,"3pjiyfhaxk64iutmpsy393rhmeb4kn":4,"3wf7q915tveqoc74bnu6b8ibbgrmhzdzmvq4szffveaum":3,"41b2874df3d02dd4":3,"4ju6":4,"4mpgg20wd633d4z4dtlddz":3,"4oxll0bi":3,"509v3":2,"56vrpgppgut40hv8xqfbwiz2whwwlkpfahj8b79ztfuzuru6z2rnpvv8inhc":4,"5efdvbet":3,"6l0g37faxur3xm28rchzvhu":3,"76h5jiznpbdsf2fjghwqvvdgyw4owy3mu739lhvnblicn":3,"7ay4jsdhyibcmgsq":3,"7pvwhtszeyhn3oa9dhlmv9uqc4wy5md7j":3,"7zjt2r5cpikgkwofamduxeltx":3,"8caweaaaaama0gcsqgsib3dqebbauaa4gb":3,"8czydsolmyibujccabycaqewydbbmqswcqydvqqgewjtrzerma8ga1uechmittjd":4,"8levy0cllw":3,"8tsi3wo5enkg4qwbnarqc3vgcv":4,"8yhspd0caweaaaobtjcbszadbgnvhq4efgquxoyoll1t4jabwzfrm7ms8nblzuow":4,"974aklcjnk1gzigarz":4,"9gul1bxbckrtedtxenqtem7spzomtswd2lhb8z65grx90cyt":4,"9ij5z6mja7rm7ttbsjup":4,"9rsqkrc9urv9mrbisredgnyecnerak5r1yzpoowninxc":3,"9znlfejkjj67vembxbj":4,"abstract":[0,4],"break":2,"byte":[0,1],"case":[1,4,5],"class":[0,1,4,5],"default":[0,1,2,3,4,5],"export":[1,4],"final":[0,4],"float":0,"function":[0,1,2,4,5],"import":[0,1,2,4],"int":[0,1],"long":[1,5],"new":[0,1,2,3,4],"null":[0,1],"public":[0,3,4],"return":[0,1,4,5],"true":[0,1,4],"while":[0,1,2,4],AND:1,CAs:1,DES:[3,4],DNS:[0,5],Doing:0,For:[0,1,2,3,4],HAS:1,Its:0,NOT:[0,1],Not:[3,4],THE:1,TLS:[0,1,5],That:[3,4],The:[0,1,2,4,5],There:[1,3,4,5],These:[1,2],Use:[0,1,5],Using:[3,4,5],WILL:1,With:2,__del__:1,__init__:2,_alwayssucceedspostconnectioncheck:1,_close_cb:0,_debug:0,_mode_:1,_ptr:0,_pyfre:[0,1],_pyfree_x509:0,_sre:[0,1],_timeout_:1,_top:2,a4mgiy2kwwfie73qiyv7yyg8flrvr1iib:3,aaiavb8w:4,abl:4,about:[0,1,3,4],abov:[0,1,2,4,5],absent:1,absolut:0,abstracthttphandl:0,accept:[1,2,3,4,5],accept_ssl:1,access:[2,4],accord:[0,1],acl_us:2,acquir:0,action:1,actual:[0,1,4,5],actualhost:1,add:[0,1,2],add_cert:0,add_entry_by_txt:0,add_ext:0,add_extens:0,add_sess:1,add_x509:0,added:[0,1],addhead:2,addinfourl:0,adding:1,addit:[0,1,5],addr:1,address:[1,3,4,5],admin:3,administr:4,advanc:3,adversari:0,aes_128_cbc:0,aetir4v7sgxmepx7thq1pv:4,affect:1,afresh:3,after:[0,1,3,4,5],again:[0,3,4],against:0,agent:2,aggtjgplibexlzalhpwlz9laqyrqpvcvjywaovfmmvrav4nafnoz2:4,ago:3,ahau6kwk:4,ahporp5ys55czpi:3,aka:0,akbr4il1nkq8ecsmcr3wpa0i9n0ehi7zvpvahxc0sqapfl8ygdfhq:3,alert:1,alg:0,algo:0,algorigthm:0,algorithm:[0,3,4],alia:0,aliv:1,all:[0,1,3,5],allow:[0,1,3,5],almost:0,along:0,alreadi:1,also:[0,1,2,3,4,5],alt:2,altern:[1,2],although:5,alwai:[0,4],amyxludrk45acua:3,analys:5,ani:[0,1,5],anoth:[1,3],anyon:4,anyth:5,aogabaku8w3w1qu15hle1bjsl7gmreoreqeblobmmazz4by0l6sxzxjpjwxo86f:3,apach:2,api:[0,1],appear:2,append:0,appli:[0,2,3],applic:[0,1,3,4,5],approach:4,appropri:[0,1,5],aqh:4,arg:[0,1],argument:0,argv:0,arm:4,around:2,as_der:[0,1],as_hash:0,as_pem:0,as_text:[0,1],ask:[0,3,4],asn1:6,asn1_integ:0,asn1_object:0,asn1_str:0,asn1_string_print_ex:0,asn1_tim:0,asn1_utctim:0,asn1int:0,asn1obj:0,asn1str:0,assign:[0,1],assign_rsa:0,associ:1,assum:[1,2,4],asyncio:1,asyncor:[1,2],attach:4,attempt:[0,5],attribut:[0,3,4],auth:0,auth_ssl:0,auth_tl:0,authcooki:6,authcookiejar:0,authent:4,author:[0,2,3,4,5],autom:4,automag:[0,4],automat:[1,5],avail:[1,2,4,5],avoid:2,awai:[0,1],awfqq4jcc:4,awihma0gccqgsib3dqmcageoma0gcsqgsib3dqebaquabigaqpu8hfutlcf6ho2t:4,ax96lvs0:3,b4law8g59vtg6dykeetrg0rubx4bggc7pkbfuin423yjjodwchvvgnpozxmqt:3,b4txejzriyc8f3:4,b6gr5s8:4,b6ugcsqgsib3dqehataubggqhkig9w0dbwqirf525ufwszaaggea85rmx6axqmxb:4,b75:3,b877j9wbpbl:3,b9zjffauqtwzdnjgrkkyikhwjdojaac:4,backlog:1,bad:1,base64:4,base:[0,1,2,3,4,5],basi:1,basic:[3,4],bat:2,bdclcn8a:4,becaus:[0,1,4],been:[0,1,4],befor:[0,1,3,4,5],began:3,begin:[3,4,5],behav:1,behaviour:1,being:[0,1,4],below:2,best:5,better:0,between:5,beyond:4,bgbyj1dubkhzsc7dgxzdtuclgnxqnnsg:3,bgcolor:2,bgkqhkig9w0bbwewfayikozihvcnawcecmn:4,bgkqhkig9w0bbwewhayjkozihvcnaqkfmq8xdtaxmdmzmtexnduwmlowiwyjkozi:4,bhdelbr5jbpjcj5aid76mfr8:4,bhmcu0cxetapbgnvbaotce0yq3j5chrvmrkwfwydvqqdexbtl01jtuugumvjaxbp:4,big:0,bin_to_hex:0,binari:[0,1],bind:1,bind_and_activ:1,bindaddress:1,binstr:1,bio:[1,4,5,6],bio_clos:1,bio_f_buff:0,bio_f_ciph:0,bio_f_ssl:0,bio_fre:1,bio_in:0,bio_noclos:1,bio_ptr:0,bio_push:0,bio_s_mem:0,bio_s_pyfd:0,bioerror:0,bit:[0,1,3,4],bitmask:1,bitwis:0,bjq5hnxbouslq0rwbrkoxv64i:4,blank:[3,4],blklen:0,blob:[0,4],block:1,blwegdqhonaiwbk5z1l:4,bmrlckblegftcgxllmrvbqibadajbgurdgmcgguaoigxmbggcsqgsib3dqejazel:4,bmvnwbppufzpiaivalycjt6pyextbbszs7:3,bo2w7ei6iejbazk:3,bodi:2,book:5,bool:1,border:2,both:[0,1,2],bottom:[0,4],bound:[0,1],boundari:4,box:[2,4],br77:3,bring:4,brows:2,browser:2,browser_id_manag:2,buf:[0,4],buf_len:0,buff:1,buffer:[0,1,4,5],buffer_s:1,buffers:1,buflen:1,bufsiz:1,build_open:0,built:1,builtin:0,bundl:[2,3,4],bxwxkuuvt81vbjwdn9jst6:4,c6fi3n03rgfmkectijc:3,cacert:[1,3],cach:1,cadav:2,cafil:1,cakei:3,calcul:0,call:[0,1,3,4,5],callabl:[0,1],callback:[1,6],caller:1,can:[0,1,2,3,4,5],capath:1,captur:0,cat:3,catalog:2,catop:3,cbc:[3,4],ccrt2tfwkbbfleuifl7mb:3,ccvkzzl:3,cenfqfwc:4,cepl:0,cert:[0,1,4,5],certain:[0,1,3],certbio:0,certchainfil:1,certdata2pem:5,certdata:5,certfil:[0,1],certif:[0,1,2,3,5],certifi:[3,4],certmast:3,cgyikozihvcnawcwdgyikozihvcnawicagcama0gccqgsib3dqmcagfamacgbsso:4,chain:[0,1,5],challeng:3,chandra:5,chang:[0,1],channel:[1,2],charact:0,cheap:4,check:[0,1,2,3,5],check_ca:0,check_kei:0,check_param:0,check_purpos:0,checker:[0,5,6],choos:[3,4],chosen:5,cipher:[0,4,5,6],cipher_list:1,cipher_stack:1,cipherstream:0,citi:[3,4],claim:5,clbwev3ryfrlp4x8j9mdte0ykok3t0wqohqrettsifdtjnfp:3,clean:[0,1],cleanup:0,clear:[0,1,3,4],click:[2,4],client:[0,1,4,5],client_addr:0,client_address:1,clientpostconnectioncheck:1,close:[0,1,2,4],close_flag:0,close_pyfil:0,clutter:2,cmd:0,cnf:[3,4],cngeq1qxtyduiguda2nbgcl:4,cnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxixitafbgkqhkig9w0bcqewennl:4,code:[0,1,3,4],coll:2,collect:[2,5],com:[0,2,3,4,5],combin:1,come:[0,3,5],command:[3,5],comment:3,commerci:4,commit:3,common:[3,4,5],commonli:4,commonnam:[0,1,3,5],commun:[0,1],compani:[3,4],companion:4,compar:5,compat:5,compil:0,complet:[0,1],compos:2,composit:0,comput:0,compute_dh_kei:0,compute_kei:0,concaten:1,configur:[3,4],conn:0,connect:[0,2,4,5,6],connect_ssl:1,connectionlost:1,connectionmad:1,connectssl:1,connecttcp:1,consid:1,consist:[0,4],constant:[0,1],constrain:3,constraint:[3,4],consum:4,contain:[0,1,2,4],content:[0,1,4,6],context:[0,5,6],contextfactori:1,continu:1,control:[0,1,5],control_panel:2,conveni:1,convert:[0,5],cooki:0,cookie_str:0,copi:[1,2,3],copyright:[0,1,2,3,4,5],corner:4,correct:[1,4],correctli:4,correspond:4,could:[0,1,5],count:[0,2],counterpan:4,countri:[3,4],countrynam:3,cours:[3,4],cover:3,coz:4,cqydvqqgewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbt:4,cqzkt9:3,crack:4,crash:0,creat:[0,1,2,4,5,6],create_by_txt:0,create_socket:1,creation:[1,3],credit:2,critic:0,crl:0,cryptograph:[0,4],css:2,cstringio:0,ctrl_cmd_string:0,ctx:[0,1,5],ctxmap:1,current:[0,1,4],curv:0,custom:1,cvzrxakeaxno80arbgxpumr11ghg:3,cw8kzzwh:4,cxo23r9wwrnzem:4,d2i_ssl_sess:1,dai:[3,4],dasmytmpc4ztytv06n07afbjl:3,dat:[2,4],data:[0,1,2,3,4,5],data_bio:0,databas:3,datareceiv:1,date:[0,2,5],datetim:0,dav:2,dcwd:4,ddlzqbacuxwtv5xy8plmx7widaqab:3,dec:2,decid:[1,3],decis:3,decod:[1,3,5],decrypt:[0,5],def:4,default_port:0,defin:1,dek:3,delet:0,demo:[2,3,4,5],democa:3,demonstr:[3,4,5],depend:[0,1,2,4],deploi:3,depth:[0,1,5],der:[0,4],der_str:0,deriv:0,des_ede3_cbc:4,describ:[0,1],descript:0,desktop:2,detail:0,determin:0,dev:2,develop:3,dh1024:2,dherror:0,dhpfile:1,dialog:[2,4],did:[1,3],differ:[1,5],diffi:[0,2],digest:[0,4,5],digit:4,directli:[1,5],directori:[1,2,3,5],dirnam:[3,4],disabl:[0,1],discard:3,discuss:3,dispatch:1,displai:[4,5],dispos:1,disposit:4,distinguish:[1,3,4],distribut:[2,5],ditto:0,dnli0rvuvxiwt:3,do_handshak:0,document:[1,2,3,4,5],doe:[0,1,5],doesn:1,dog:4,dom:[3,4],don:0,done:[1,2],dough:0,down:1,download:[2,4,5],dqehaaavbbnhihnpz24gb2ygb3vyihrpbwvzoiic5zccaumwggjmoamcaqicaqaw:4,dqyjkozihvcnaqeebqawwzelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrv:4,dsa:[4,5,6],dsa_pub:0,dsaerror:0,dst:0,due:1,duhrqiml1tyi:3,duqhj2ygkkwdqq9v0xscjkgiyw:3,dure:[0,1,5],dw0boozhj8tc7co7lmyb0ye271b6:3,dyman:0,dynam:0,e9kybgki7vpojwbz27:3,e_n:0,each:[0,1,4],eawm5avuv7hnptt5zr:4,eaydvqqdewlsb2nhbghvc3qxjzalbgkqhkig9w0bcqewggfkbwluqhnlcnzlci5l:3,ebdz:4,ec9eyj:4,ec_error:0,ec_pub:0,ecdh:0,ecdsa:0,ecerror:0,ede3:[3,4],effect:4,egftcgxllmrvbtcbnzanbgkqhkig9w0baqefaaobjqawgykcgyear1nyy1qrll1r:3,either:[0,1],electron:4,els:[0,1,3,4],email:[0,3,4],emailaddress:[0,3],emmarsgyedf5h1afl1smkomskbqxe1d2jg:4,empir:0,emploi:5,enabl:[1,4],encod:[0,1,2,4],encrypt:[0,1,3],end:[0,1,3],endhead:0,endian:0,engin:[1,6],engine_ctrl_cmd_str:0,engine_method_:0,engineerror:0,enhanc:5,enough:0,ensu:4,ensur:[0,1],enter:[0,2,3,4],entri:[0,3],entropi:0,entry_count:0,environ:[0,1],eopzyno4mi:4,eoq9wfscnii4:3,eovbgs7ezalvvkdj4hnl:4,eozfol5i20ykiv6j:4,ephemer:1,epoch:0,epollreactor:1,equival:[0,1],eric:5,err:[4,6],err_get_error:0,errdepth:1,errnum:1,error:[0,1,4],error_log:2,establish:[0,1,5],estim:0,etag:2,etc:[0,1],etwitreft1heupnar:4,even:0,event:0,evp:6,evp_ciph:0,evperror:0,ewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxix:4,exampl:[0,1,2,3,4,5],except:[0,1,5],exchang:[0,5],execut:[3,4],exist:[2,3],exit:0,exiy8geir:4,exp:0,expect:0,expectedhost:1,expir:[0,1,3],expiri:0,explain:4,explan:1,explicitli:1,explor:4,expon:[0,3,4],ext:0,ext_stack:0,extens:[0,1,3,4],extern:1,extra:3,extract:1,facilit:3,factori:[0,1],fail:[0,1],failur:[0,1,4],fakesocket:5,fals:[0,1,3],famili:1,fancyurlopen:2,faq:0,farm:2,fashion:2,fatal:1,fcgiserv:2,fcmspp3auq1:4,featur:5,feed:0,feedback:0,few:[3,4],ffffff:2,fi1wdpphywke97pojizvqesfzopty5hjiyzux4u:3,field:[0,3,4,5],fieldnam:1,fifth:5,file:[0,1,2,3,4,5],filenam:[0,1,3,4],fileno:[0,1],find:1,fingerprint:0,finish:[0,1],first:[0,4,5],fixm:1,flag:[0,1,4,5],flndpcnkrtvqdx3rt6x6vbttcyom:4,flowinfo:1,flush:0,fmt7a120s3gd2jixgh06l:4,follow:[0,2,3,4,5],forgotten:3,forkingmixin:1,forkingsslserv:1,form:[0,1,5],format:[0,1,4,5],format_d:0,format_format_d:0,format_pem:0,found:[0,1],foundat:[1,5],four:1,fourth:5,fqlcrrr5nvupdin:3,freebsd:2,freed:1,freeli:4,freewar:4,friendli:4,frill:0,from:[0,1,2,3,4,5],from_addr:4,from_cert:4,from_kei:4,ftp:[0,2],ftp_tl:0,ftplib:0,ftpserver:2,ftpslib:6,full:[3,4],further:1,fv4sgm3jkr:4,g3bgsmvlxkefztfjkxo6xnjcbnf5i:4,g7ppoo:3,gain:5,gd58p4mpmhu5iknz4yh4nlhnaitevcs85tzuaxze9g:4,gen_kei:0,gen_param:0,gener:[0,1,3,4],genparam_callback:0,get0_sign:0,get1_chain:0,get:[0,1,2],get_allow_unknown_ca:1,get_builtin_curv:0,get_cert_stor:1,get_ciph:1,get_cipher_list:1,get_context:1,get_crit:0,get_current_cert:0,get_data:0,get_datetim:0,get_default_session_timeout:1,get_der:0,get_entries_by_nid:0,get_error:[0,1,4],get_error_cod:0,get_error_depth:0,get_error_func:0,get_error_lib:0,get_error_messag:0,get_error_reason:0,get_ext:0,get_ext_at:0,get_ext_count:0,get_fingerprint:0,get_id:0,get_issu:0,get_kei:0,get_modulu:0,get_nam:0,get_not_aft:0,get_not_befor:0,get_object:0,get_peer_cert:1,get_peer_cert_chain:1,get_pubkei:0,get_rsa:0,get_serial_numb:0,get_sess:[0,1],get_session_cache_mod:1,get_session_timeout:1,get_shutdown:1,get_socket_read_timeout:1,get_socket_write_timeout:1,get_stat:1,get_subject:0,get_tim:1,get_timeout:1,get_valu:0,get_verify_depth:1,get_verify_mod:1,get_verify_result:1,get_vers:[0,1],get_x509_verify_error:0,getpeernam:1,getproto:1,getronicsgov:4,getsocknam:1,getsockopt:1,geturl:0,getvalu:0,ggarfmmj4yuhewkys9jo1h8k4bdxugmauwni5:3,give:3,given:[0,1],givennam:0,gknqqdblotqt06f3oissdjetm2itllyhgzv:3,global:4,gmt:[2,3,4],goe:[0,1],good:0,govern:3,gpmpndsyvvceufpluwydim0vkwhgc2:4,gqnveov:3,gqzcvnzzcmx8uvrjqr8drwdsmpj0vxg1:4,gratefulli:4,grcgzeb9ymfcedxahtdufhjrkpdpsxzzvvgksbncbqu92obyqvnrq8m:4,grew:5,group:4,gucrblvd7n3ofnx5ujmpmcw9zwbu:4,gvyvi:4,gymga1udiwr8mhqaffzsqjs9bei2gcgrutozevjws81kov:4,h7nmicymi2wkz8h:4,h99suto:3,h9diul:3,hack:2,handi:3,handl:4,handle_error:1,handle_request:1,handler:[0,1],handshak:[0,1],hanson:3,happen:5,hard:0,hardwar:0,has:[0,1,4,5],hash:0,have:[1,3,4],hcyiukxujtaqtxboh:4,head:2,header:[0,2],headervalu:0,height:2,heikki:[1,5],hellman:[0,2],henc:3,henceforth:2,here:[0,3,4],hex:0,hihsrgwtnd7lnxuucpx8yv1id0dlmp0hz:4,his:4,hkig9w0baqefaaobjqawgykcgyea5c5tj1chtsoxa1q2q0fyiwmwyhptjpjcvtzm:4,hmac:[0,4,5],hold:0,home:[0,2,4],hook:1,host:[0,1,5],hostnam:1,hot:4,how:[0,1,4,5],howev:1,hpysvh:4,href:2,hrg6sai33usk8xpokjqa:3,htm:4,html:[2,4],http:[0,4,5],http_class:0,httpconnect:[0,5],httplib:[0,5],https_open:0,https_request:0,https_server:2,https_srv:4,httpsconnect:[0,5],httpserver:2,httpshandler:0,httpslib:[5,6],hu3qdmtcwjd:3,hvcnaqkemryefooerud8exiyxfqq8btfukwrsp3imfigcsqgsib3dqejdzffmemw:4,hyswpz1xvlprmv4:3,i2d_ssl_sess:1,ia5str:3,icon:4,ident:[1,2,4,5],identifi:[0,3,4,5],idx:1,ietf:4,ieucourgcxpyd1j65vt7ob3ziypu2f2nluicynqpg1sd:4,ignor:0,iihwd6gtv1uodf7urbxtl3hq9:4,imap:4,imc:4,imec:0,img:2,immedi:1,implement:[0,4,5],imqqiiw:4,includ:[0,3],incorpor:[3,4],increas:0,indent:0,index:[0,6],index_html:2,indic:[1,4],indirectli:0,info:[0,3,4],inform:[0,1,2,3,4,5],inherit:[0,1],init:0,initi:[0,1],initialis:[0,1],inkei:4,input:[0,1,5],insert:0,instal:4,instanc:[0,1,4,5],instanti:[0,4],instead:[2,4],instruct:2,integ:1,integr:4,intend:4,interact:0,interest:1,interfac:[0,1,4,5],intern:[0,1],internet:[1,3,4],interpret:[0,1,5],intuit:3,invalid:0,invok:[0,1,2,4],iobuff:[0,5],ioy0bdijcyn1jimohj:4,ipv4:1,ipv6:1,iqwxllnj:4,ir9fggophatzzq:4,ireactorssl:1,ireactortcp:1,isbn:5,isexpir:0,isgoodcooki:0,isgoodcookiestr:0,issu:[1,2,4],issuer:[0,3,4],itafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbyibadambgnvhrmebtad:4,item:0,iter:0,its:[0,1,2,3,4],itself:[0,4],iwq3n6j1suzs3uw6abq8bivynoucmkjaqqjbanqxfalu4b:3,j6wo9dzltioz3znvr3ljsskib4tip4ugqnjaluw7m3ftz3magxn68hbbjs8tz8tl:4,j9ftv3di:3,jan:2,jbt3ltgf743utyaas7hnguouobhoyt:3,jcyhx9vw4xvja7:4,jddsk:4,john:5,join:4,ju4:3,jun:2,just:[1,5],jvy5cif:4,jy5rd:3,jyvbd7acn35p5yx7ktqvqerwdijxycanbcnvmrtmysanw9kv1ujtxc5vx7ylwipk:3,kdfqdmtfzqkymhp1laq1ihbq1rhwsbh5n3ekq:3,kdjqodst7ovu62motgf3arcduppwuztfxolyone5nioo1apvhbrinqwcplkpotqr:3,kebfzs8asq7uc9axw6ti0eapj8evhtwhsbgzqrwekfbxs6hbbhmidc4n0m7oq:4,keep:3,kef21pgguqpf14gkgfwx3sv4bjc1vbrrwq6zlg3nmuyqr5mtjjy9eq:3,kei:[0,1,2,3,5],key_as_byt:0,keybio:0,keyfil:[0,1],keygen_callback:0,keyid:[3,4],keylen:0,keyout:3,keypair:0,kilroi:0,kind:1,kiy8jkpv8dr5po1ikaxjfudbygdenjwybsrspsk3p:3,kkst1mcj:3,know:4,known:5,kozihvcnaqebbqaegyblzlgupfphwhsgtiapvdexn61qisz3oem88xoxkuw0szor:4,kozihvcnaqebbqaegycbaxz:4,ktgtcixjl2nmw7j:3,kv95ymtgbisuwkj93grbvqoj:4,kwarg:0,kxtbbmqswcqydvqqg:4,l5trm4x6zjxwuxxmijcehmmd8tc8ybwwo4ao19b3ebffetvsugxsga:3,l6kn27mwzhe331vjttjsgl4:3,lamy57gkw4ondmrtqvq2ojqlvosbllpxzh:4,last:[1,3,4,5],later:[0,1],latter:1,lbow6ssdir6:4,lead:[0,1],leak:0,least:1,leav:[3,4],left:[3,4],legal:0,len:0,length:[0,1,2],less:0,let:[3,4,5],letter:[1,3,4],level:[1,2],lg4q5yezr1ejaw:4,librari:[1,4],licenc:0,licens:0,lifetim:1,like:[0,3,4],limit:0,line:[0,4,5],link:[2,5],linux:5,list:[0,1,2],listen:1,listenssl:1,listentcp:1,literatur:0,littl:[2,5],ljecgc3rqu1uwisbkmquis1s46ebbm5np75izpnujokj2hv:4,lkmac1dwb3dqgjt5xk4wjesinfdxecnegacyteagyztpiapu:3,lnzqowadmol:4,load:[0,1,2,4,5],load_cert:[0,1,4],load_cert_bio:0,load_cert_chain:1,load_cert_der_str:0,load_cert_str:0,load_certif:0,load_client_ca:1,load_crl:0,load_dynam:0,load_dynamic_engin:0,load_fil:[0,4],load_info:[0,4],load_kei:[0,4],load_key_bio:0,load_key_bio_pubkei:0,load_key_str:0,load_key_string_pubkei:0,load_loc:0,load_openssl:0,load_param:0,load_params_bio:0,load_pkcs7:0,load_pkcs7_bio:0,load_pkcs7_bio_d:0,load_pkcs7_der:0,load_private_kei:0,load_pub_kei:0,load_pub_key_bio:0,load_public_kei:0,load_request:0,load_request_bio:0,load_request_der_str:0,load_request_str:0,load_sess:1,load_verify_info:1,load_verify_loc:[1,5],loc:0,local:[2,3,4],localhost:[2,3,4],localitynam:0,localtimezon:0,locat:[1,2],lock:4,logger:2,logic:1,longer:0,look:[3,4],loseconnect:1,lower:0,ltd:[3,4],lwpbxzf2k3fuudnkrlfbakeampxoybuifr2s5bma:3,ly4tpl5:3,m1awhen3vir2zlaw:3,m1je:3,m2_asn1_integer_fre:0,m2_asn1_object_fre:0,m2_asn1_string_fre:0,m2_asn1_time_fre:0,m2_bio_fre:[0,1],m2_bio_pop:0,m2_cipher_ctx_fre:0,m2_dh_free:0,m2_dsa_fre:0,m2_ec_key_fre:0,m2_engine_fre:0,m2_hmac_ctx_fre:0,m2_md_ctx_free:0,m2_pkcs7_free:0,m2_pkey_fre:0,m2_rsa_fre:0,m2_sk_x509_extension_fre:0,m2_sk_x509_free:0,m2_ssl_ctx_free:1,m2_ssl_free:1,m2_ssl_session_fre:1,m2_x509_crl_free:0,m2_x509_extension_fre:0,m2_x509_free:0,m2_x509_name_entry_fre:0,m2_x509_name_fre:0,m2_x509_req_fre:0,m2_x509_store_ctx_fre:0,m2_x509_store_fre:0,m2crypto:[1,3],m2crypto_xmlrpc:0,m2cryptoerror:0,m2urllib2:6,m2urllib:[2,6],m2xmlrpclib:[2,6],ma0gcsqgsib3dqebbauaa4gbaho3drchr86fstvavfixdsswwqktcehuhrdc:4,mac:0,made:5,mai:[0,2,3,4,5],mail:4,maintain:1,make:[0,1,3,4,5],makebuf:4,makecooki:0,makefil:[0,1],malfunct:1,man:1,manag:2,mani:[0,2,4],manipul:[0,1],manpag:[0,1],manual:[0,5],map:[1,4],mar:[3,4],march:4,mark:[0,4],master:3,match:[0,3,4],matej:0,materi:[2,5],matt:5,max_byt:0,maximum:1,mbstring_asc:0,mbstring_utf8:0,md5:0,md5withrsaencrypt:[3,4],mean:0,meant:3,measur:0,medusa:2,memori:[0,4],memorybuff:[0,4],messag:[0,5],messagedigest:0,messier:5,method:[0,1],mg611eovkleoostv:3,mh2pz4lverxa:4,mhf6rqar:4,micalg:4,microsec:1,might:1,miibntccaqycaqawxtelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrvmriw:3,miibvwyjkozihvcnaqcdoiibsdccauqcaqaxggeamih9ageamgywytelmakga1u:4,miicxgibaakbgqcvwdhjvcuwxwu4h8wqujguvm:3,miie8ayjkozihvcnaqccoiie4tccbn0caqexczajbgurdgmcgguamcigcsqgsib3:4,miiiwwyjkozihvcnaqcdoiiitdccclacaqaxggeamih9ageamgywytelmakga1u:4,mime:[3,5,6],mimetool:0,minu:0,miss:1,mix:0,mkwcbi1nfvohcv3xdq2ela:4,mode:[0,1,2,4],model:[3,4],modifi:[0,2,4],modul:[4,5,6],modulu:[0,3,4],more:[0,1,3,5],most:[0,1,4,5],mous:0,movement:0,mozilla:[2,4],mpi:0,mpint:0,mrywfaydvqqdew1tl01jtuugu2vuzgvymsewhwyjkozihvcnaqkbfhjzzw5kzxja:4,msb:0,msg:4,msg_bio:4,msu:0,mua:4,much:0,multilin:0,multipart:4,multipurpos:4,multivalu:0,must:[0,1,5],mutheybpq5th7ydrtnizkkxobnqe2kyux9x22a1kh49sojjfg6kpb9mugizbimlv:3,mutt:4,mysteri:0,naccept:2,name:[0,1,3,4,5],navig:4,nbbba2yl0n5gs1tyiy9z:3,nbsp:2,nbyte:1,nconnect:2,necessari:0,necessarili:0,need:[0,1,3,4,5],neg:0,negoti:1,neither:1,nerx9zjgvrwuscqqcu:3,net:3,netmemet:5,netscap:3,network:[4,5],new_extens:0,new_pub_kei:0,new_stack_from_d:0,newca:3,newcert:3,newer:0,newkei:[3,4],newkey2:3,newli:0,newreq:3,next:[0,3,4],ngp:[2,3,4,5],nhost:2,nid:0,nihuwgujn:3,niqfytycdl9i5sk:4,nkasxekr8auhjsbvumrqrl6r0nnsfpzdr1w7pv:4,no_passphrase_callback:0,nocertif:1,node:4,non:[0,1,4],noncrit:0,none:[0,1,4],nonzero:0,noout:[3,4],nor:[1,4],normal:[1,5],note:[0,1,4,5],noth:0,notifi:1,notwithstand:4,now:[3,4],nqaodq3aobzpafp9l:3,nqxlmgj3jwq7x9:4,nss:[4,5],ntransfercmd:0,nueymfjdm0uvntg0icxgnufsfnjkntthpagykgetric3kgjz:3,num:0,number:[0,1,3,4],numer:2,numericipmatch:1,nuser:2,nyndufwi0qm92qlk0ui:3,obio:0,object:[0,1,4,5],obtain:[0,4],occur:[0,1],octet:[0,1],octx_to_num:0,od2m3lp7jbwjqbrtndhimqul2s4yu:4,odd:0,off:0,offset:0,oiqto:4,old:[3,5],onc:[0,1],one:[1,2,3],ones:5,onli:[0,1,3],onto:0,open:[0,1,2,4,5],open_http:0,openfil:0,openpgp:4,openssl:[0,1,2,4,5,6],oper:[0,1,2,4],option:[0,1,3],optnam:1,org:[2,3,4,5],organ:[3,4],organiz:[3,4],organizationnam:[0,3],organizationunitnam:0,origin:0,osafound:5,other:[0,1,3,5],otherwis:0,our:4,out:[0,1,2,3,4],out_bio:0,outform:4,output:[0,4],over:[0,1,5],overlap:4,overload:1,overrid:1,overwrit:2,own:[0,1,2,4,6],p12:4,p7_bio:[0,4],p7file:0,p7m:4,p7s:4,pack:1,packag:6,pad:0,page:[1,2,6],pair:[0,1,2,3,4],param:[0,1],paramet:[0,1,2,4,5],part:4,pass:[0,1,3],passphras:[0,1,3,4],passphrase_callback:[0,1],password:[0,3,4],patch:[2,3],path:0,pathnam:2,pavel:0,pbkdf2:0,pcgiserv:2,pdlrrliknknfmhkiacktlrcu59sca6adeiwuzqmuzp5cs6jrsro3nkfg1bd09d1k:3,peek_error_cod:0,peer:1,peercertdigest:1,peercerthash:1,pem:[0,1,2,3,4,5],pemfil:1,pend:1,pep484:1,per:[0,1,2],perform:[0,5],period:3,perl:3,permit:5,pfi:3,pfl1k5dyxrgtzlb36uljd:4,pgpmime:4,pheng:[0,1,2,3,4,5],phrase:3,pick:4,pin:0,pk7_smime:4,pkc:4,pkcs12:4,pkcs5_pad:0,pkcs7:[0,4],pkcs7_detach:4,pkcs7_error:0,pkcs7_pad:0,pkcs7_text:4,pkcs7_verifi:4,pkei:0,pkg:[3,4],plain:4,pleas:3,plen:0,pltnni25spyrcwfl6erd25u:4,plu:1,point:0,pointer:0,polici:[1,3,4],pool:0,pop:[0,4],popular:4,port:[0,1,2],portal0:2,portal:2,portion:[0,5],possibl:[0,1],post1:[2,3,4],post:0,post_connection_check:1,postconnectioncheck:1,power:2,practic:[0,4,5],pravir:5,predetermin:0,predict:0,prefix:0,premis:4,present:[1,2],press:0,pretend:4,pretti:5,previou:0,previous:1,primari:5,prime:0,princip:0,print:[0,1,2,3,4],print_param:0,printabl:3,privaci:4,privat:[0,1,3,4],private_decrypt:0,private_encrypt:0,privkei:4,prng:[0,2,4],probabl:[4,5],problem:0,proc:3,proce:1,process:[1,3,4],produc:0,product:4,prog:4,program:[3,6],programm:[4,5],project:[4,5],prompt1:0,prompt2:0,prompt:4,propag:0,proper:1,properli:4,propertymap:2,prot_c:0,prot_p:0,protect:[0,1,4],protocol:[0,1,2,4,5],protocolwrapp:1,provid:[0,1,2,4,5],provinc:[3,4],proxi:0,proxyhttpsconnect:0,pseudo:[0,4],pss:0,pty:[3,4],pub:0,pub_kei:0,pub_key_from_d:0,pub_key_from_param:0,pubkei:0,public_decrypt:0,public_encrypt:0,purpos:[0,4],push:[0,4],puthead:0,putrequest:0,py3byt:0,py3str:0,pyfil:0,pystack:0,python3:1,python:[0,1,3,6],pythonwar:0,q1z7g:3,q7s4tn1z:4,qbcrdaoxdj0ulwytauev:4,qin7ujpkou61cn7h8dvhr8yw9:4,qjpbezwdp7gjfzfatqitesymwo3i:4,qlen:1,qppdzt3ykfmg2lzytaam1czvb6rbnrjjp2zrpbwn:3,qtm0ddmm:3,quarante:5,queri:1,quiet_genparam_callback:0,quit:[2,3,4],quvxinaxygqco9lzdw6hudk8:4,qya6adywgbghr9jkhwn5gsdu7bwx:4,rais:[0,1,4,5],rand:[2,4,6],rand_add:0,rand_byt:0,rand_file_nam:0,rand_pseudo_byt:0,rand_rang:0,rand_se:0,rand_statu:0,randfil:0,randfnam:0,random:[0,4],randpool:[2,4],rang:0,rather:1,rc4:6,rc4_free:0,rdn:0,reactor:1,read:[0,1,2,3,4,5],read_al:0,readabl:0,readbio:1,readi:[1,3,4],readlin:0,real:0,realiz:1,reason:[0,1],recal:4,receiv:[1,4],recent:4,recipi:4,recipient_kei:4,recommend:[0,5],record:5,recreat:4,recv:1,recv_into:1,refcount:[0,1],refer:[0,2],regex:0,regular:0,reject:1,relativedistinguishednam:0,releas:0,reli:[0,1],remot:1,remov:1,remove_sess:1,renam:[3,4],render:4,renegoti:1,repli:2,repres:[0,1],represent:0,repudi:4,req:[0,3,4],request:[0,1,3,4],request_bodi:0,requesthandlerclass:1,requir:[0,1,5],rescorla:5,reserv:[0,1],reset:0,reset_context:0,resid:1,resolv:2,respect:[0,1],rest:0,result:[0,1,4],ret:[1,3],retriev:[0,4],reus:1,revoc:0,rfc:[0,4],rgwnkxpj:4,right:[0,1,4],ripemd160:0,rm2htgotm2lmore4geotypi5f1fbi:3,rn9vpy0suy8:3,rnd:0,root:5,routin:[1,4],rsa:[1,2,3,4,5,6],rsa_error:0,rsa_pub:0,rsaencrypt:[3,4],rsaerror:0,rsassa:0,rudimentari:5,run:[0,2,4],rwb:0,rwniyh0aw4xyyhhit:4,s0ovoc041cerazqfm2tl:4,safe:0,sai:4,said:[0,4],salt:0,salt_len:0,salt_length:0,same:[0,1,5],sat:[2,3],save:[0,4],save_fil:[0,4],save_kei:0,save_key_bio:0,save_key_d:0,save_key_der_bio:0,save_param:0,save_params_bio:0,save_pem:0,save_pub_kei:0,save_pub_key_bio:0,saver:4,sc3lsmhugu9xc26ogstjmkquiah:3,sc51hkebgckl1:4,scope:4,scopeid:1,screen:[2,4],script:5,search:6,sec:1,second:[0,1,5],secret:3,section:[3,4],secur:[0,1,3,4],see:[0,1,2,5],seed:[0,2,4],seek:0,seldom:0,select:[1,2,4],self:[0,1,3,4],send:[1,2,5],sendal:1,sender:4,sendmail:4,sendsmim:4,sens:1,sent:[0,1,3,4],sequenc:0,seri:4,serial:[0,3,4],serialnumb:0,serv:2,server:[1,2,3,4,5],server_address:[1,5],serverpostconnectioncheck:1,servic:[1,4],session:[0,6],session_data_manag:2,set:[0,1,3,4,5],set_accept_st:1,set_allow_unknown_ca:1,set_bio:1,set_ciph:[0,4],set_cipher_list:1,set_client_ca_list_from_context:1,set_client_ca_list_from_fil:1,set_connect_st:1,set_crit:0,set_data:0,set_datetim:0,set_default:0,set_default_verify_path:1,set_info_callback:1,set_issu:0,set_issuer_nam:0,set_kei:0,set_mod:1,set_not_aft:0,set_not_befor:0,set_object:0,set_opt:1,set_pad:0,set_param:0,set_post_connection_check_callback:1,set_pubkei:0,set_serial_numb:0,set_sess:[0,1],set_session_cache_mod:1,set_session_id_ctx:1,set_session_timeout:1,set_shutdown:1,set_socket_read_timeout:1,set_socket_write_timeout:1,set_ssl:0,set_ssl_close_flag:1,set_str:0,set_subject:0,set_subject_nam:0,set_tim:[0,1],set_timeout:1,set_tlsext_host_nam:1,set_tmp_dh:1,set_tmp_dh_callback:1,set_tmp_rsa:1,set_tmp_rsa_callback:1,set_verifi:[1,5],set_verify_cb:0,set_vers:0,set_x509_stack:[0,4],set_x509_stor:[0,4],setblock:1,setsockopt:1,settimeout:1,setup_addr:1,setup_ssl:1,sever:[0,1,3],sfl_home:4,sfqo6lc9mtsj7fjydq:4,sha1:[0,1,4],sha224:0,sha256:0,sha:0,shall:[2,4],share:0,should:[0,1,3],should_read:0,should_retri:0,should_writ:0,shown:[2,5],shramov:0,shut:1,shutdown:1,sid_ctx:1,side:[0,1,5],sign:[0,3],sign_asn1:0,sign_dsa:0,sign_dsa_asn1:0,sign_fin:0,sign_init:0,sign_rsassa_pss:0,sign_upd:0,signal:0,signatur:[0,3,4],signer:4,signer_kei:4,signific:[0,1],similar:[1,2,3,4],simpl:[0,1,5],simpli:0,sinc:[0,3,5],singl:0,siong:[0,1,2,3,4,5],sipba4ik5xcrlt9e0s2qjgrvo9gyfaqz:4,site:3,situat:3,size:[0,1],sizehint:0,sjai4kpfvt00xfnvgluywyeks9sygto7hihnqkcf44f5lyv6ntfwmfqb11daty9v:4,skip:4,skip_accept_encod:0,skip_host:0,skunk:2,smartcard:0,smime:6,smime_error:[0,4],smime_load_pkcs7:[0,4],smime_load_pkcs7_bio:[0,4],smtpd:4,smtplib:4,sni:1,sntelhcawulwtifz:4,so_:1,sock:1,socket:[0,1,5],socketserv:1,softwar:4,sol_socket:1,sol_tcp:1,some:[1,3,4],sopath:0,sophist:5,sourc:[0,1,4,5],space:0,specif:[1,3,5],specifi:[0,1],spoofer:4,sport:5,src:2,sre_pattern:[0,1],ssl:[0,2,3,4,6],ssl_:1,ssl_cert_dir:1,ssl_cert_fil:1,ssl_connect:1,ssl_context:[0,1],ssl_ctx:0,ssl_ctx_flush_sess:1,ssl_ctx_ptr:1,ssl_ctx_set_opt:1,ssl_ctx_set_session_cache_mod:1,ssl_ctx_set_timeout:1,ssl_dispatch:[0,6],ssl_get_default_timeout:1,ssl_get_error:1,ssl_info_callback:1,ssl_ptr:1,ssl_received_shutdown:1,ssl_sent_shutdown:1,ssl_sess_cache_:1,ssl_transport:[0,2],ssl_verify_callback:1,ssl_verify_callback_allow_unknown_ca:1,ssl_verify_callback_stub:1,sslbio:0,sslerror:[0,1],sslserver:[0,6],ssltimeouterror:1,sslv3:[1,5],sslverificationerror:1,stack:[0,1],stack_of:1,stamp:4,standard:[0,4],standard_error_messag:2,standard_html_foot:2,standard_html_head:2,standard_templ:2,start:[0,1,2,3,4],startpassthrough:1,starttl:1,state:[0,1,3,4],stateorprovincenam:0,statu:[0,1],stderr:1,stdout:[0,5],step:[3,4,5],steve:3,still:1,stop:2,store:[0,1],str:1,stream:0,strict:0,string:[0,1,2,4],stringio:[4,5],strong:0,struct:1,struct_siz:1,struct_to_timeout:1,structur:[0,1],style:1,subclass:0,subject:[0,3,4],subjectaltnam:[0,5],subjectnam:0,subpackag:6,subsequ:5,substitut:4,succeed:[0,1,2],success:[0,1],successfulli:1,suffici:0,suggest:0,suit:1,suitabl:[0,5],sun:2,suppli:[0,1],support:[0,1,5],suppos:4,sure:0,surnam:0,symbol:1,symmetr:[0,4,5],sync:0,sys:4,system:[1,2,3,4],sztm5jrp2zw:4,t6lqehb32wfyxqbkfxfjsxzsxox3r:4,take:1,target:[0,2,4],tb7k3chfgw5wagwnll8lb:3,tcp:[1,5],tcpserver:1,tell:[0,5],temp_fold:2,temporari:[1,4],termin:1,test:[0,4,5],test_ssl:5,text:[0,2,3,4],text_crlf:0,text_crlf_bio:0,text_nam:0,textual:5,than:[0,1,5],thei:[0,1,4,5],them:[0,4,5],therefor:1,thi:[0,1,2,3,4,5],third:5,those:5,thread:6,threadingmixin:1,threadingsslserv:1,threat:[3,4],through:[0,1,3,4],thu:[0,4],thusli:[2,4],time:[0,1,2,4,5],timeo:1,timeout:[0,6],titl:2,tlfgl4hdk2gyzxafuqzwiurz:4,tls:1,tlsprotocolwrapp:1,tmp:4,tmp_bio:4,to_addr:4,to_cert:4,tob:4,togeth:1,toivonen:[1,5],too:5,tool:3,top:[0,2,4],topic:3,trace:0,traceback:4,traffic:5,transfer:[0,4],transform:4,transport:0,treat:1,tri:[1,5],tripl:4,trust:4,tue:2,tunnel:0,tupl:[0,1],tvtk:4,twice:1,twist:[1,5],twistedprotocolwrapp:[0,6],two:[0,1,5],tws5k:3,txt:5,type:[0,1,2,3,4],typic:[1,4,5],tzinfo:0,tzname:0,tzsznk2qwgvsspos9mhuaepbnjmnbffbrulhrutsglm:4,u4dmyq9uxs421en3v2hkvhvdy8ut2ot29:4,u4j2f34u0xktwcp:4,u7rqbwpc9hr34saprs3ubbculet748kecbx247imbtidctzxcc1o86:4,ubowzitegtyli52:4,uifxaf6s4n2uihvp6tqxthejtpzoc7pc:4,ukidkhst60v2q9kegpzgfpoztskm:4,ull4d2cldx9ovynykwdezb5dyv0r:4,unattend:3,uncertainti:0,under:4,under_bio:0,underli:[0,1,5],understand:4,unencrypt:[3,4],uniqu:0,unit:[3,4],unix:1,unknow:0,unknown:[0,1],unless:0,unlock:0,unmix3:0,unmix:0,unpack:2,unpredict:0,unsaf:0,unset_ciph:0,unset_kei:0,unset_x509_stack:0,unset_x509_stor:0,until:[1,3],untouch:1,untrust:2,updat:[0,3],upper:0,urandom:2,urbfke2mocdxvdzxbmd:4,url:[0,2],urllib2:0,urllib:2,uryvak7vfoldaz6z3nosoi6nonnehpr:4,usag:4,use:[0,1,2,3,4,5],used:[0,1,3,4],useful:1,useless:5,user:[0,4],user_ag:0,usernam:0,uses:[0,4,5],using:[0,1,3,4],usr:[3,4],usual:[0,5],utc:0,utcoffset:0,utifsh4jkkm:4,util:[5,6],utilerror:0,uweuasngtkpjv2jyumd3hwqox2q3cd4zgqvjj6gf3exa5126ckf:3,uwrgu5shra8oncm0cdxej0kpf3cfnjhffb8hwmzi4uegnmfxqnsxogz:4,v_asn1_ia5str:0,valid:[0,1,3,4,5],valu:[0,1,3,4],valueerror:0,variabl:[0,1],variou:[1,5],verbos:0,veri:[0,1],verif:[0,1,4],verifi:[0,1,2,3],verify_asn1:0,verify_dsa:0,verify_dsa_asn1:0,verify_fail_if_no_peer_cert:[1,5],verify_fin:0,verify_init:0,verify_ok:1,verify_p:[1,5],verify_rsassa_pss:0,verify_upd:0,verisign:4,version:[0,1,3,4,5],vhgdittnelgthbaezu5rhdswgdelvbp:4,vi4roin:3,via:[0,1],viega:5,vihhfc1zzp:3,visual:0,vkwwecqqdkeu:3,vsgprqx2:4,vsxc7xx7xo:4,vtajp:3,vuzalydffdfutiqqzys4z:4,w4d1nnwu8agcpyshsexhc:3,w81xodtq2ecjxc8fn2wpa9y5vd1lt7ojksoul1:3,wai:[1,4],wait:1,walk:3,warn:[0,1,2],wbal2p:4,wdd1ar2k4k3gai7kkgobwt0:4,wdigqewjl:3,weak:5,weak_crypto:1,web:[2,4],well:[0,1,2,4],were:[0,1],what:[0,3,4],when:[0,1,3,4,5],whenev:1,where:[0,1,3],wherea:[0,5],whether:[0,4],which:[0,1,3,4,5],who:4,whose:0,why:4,widgit:[3,4],width:2,window:[2,4],wish:[2,3,4],within:[1,3,5],without:0,wjtpvp0yobmju4vmkezi405r7o8oewi:3,wkat:4,wmbgsclvwsfzcccjhavw9nhfmucnrdwxaymvetnuon:4,word:4,work:[0,1,2,3,4,5],world:1,would:[0,1,4],wrap:4,wrappedprotocol:1,wrapper:[0,1,5],write:[0,1,3,4],write_bio:1,write_clos:0,write_d:0,writeabl:0,writebio:1,writesequ:1,written:[0,3,5],wrongcertif:1,wronghost:1,wrylp3:4,wsluvo:3,www:[0,2,4],wyhfg8g3biehurpj2v:4,x509:[3,4,5,6],x509_ext:0,x509_ext_ptr:0,x509_extens:0,x509_extension_stack:0,x509_name:[0,1],x509_name_entri:0,x509_ptr:1,x509_purpose_:0,x509_stack:[0,4],x509_store:[0,4],x509_store_context:0,x509_store_ctx:0,x509_store_default_cb:0,x509_store_set_verify_cb:0,x509error:0,x509v3:[3,4],xc9dtimuutxtxlgytb0ujkbnsoaenolm:4,xekaxcmzegp0b6camwfmuqrbvgxbbncqkc:4,xgffb0okilylmwv2bf6:4,xisnot:4,xlcqyvk1tzhd:4,xlyg6hhzzgbfyyngj2y7ymz1rl1m8snrnmkcyskgtrudenf6wt9:4,xmlrpclib:0,xmtdg:4,y3klvhk09yl6d:4,y9mh7efw:4,year:[3,4],yet:1,yl9qevh1pp2zvswq12p7gjt3t:4,you:[0,1,2,3,4,5],your:[0,2,4,6],ypfxy:3,yqor8jggsuzroyjqhj:4,yrpzcwq3gxahuj:3,yubj33ylmpjgngijlnolfy0hnw7tmwqr:4,ywmxnjz8:4,z04ovaeue4x0swm17hlbm2kvt:3,z2s:2,z6ebh:3,z6uxrm:4,zbq:3,zbxscvldasmckg:3,zero:0,zhttp_handler:2,zhttp_server:2,zhttps_handler:2,zhttps_server:2,zip:2,zope:[2,4],zopebutton:2,zovnycmv1cintpalaw4bwtxnhcdvthavdy34okhemzncg:3,zpecllwhxd4b1auaiaargkl935u:4,zpqqqzkq:3,zserver:2,zserverssl:6,zssl:2,zsyncer:2,ztf6mpxjsixi6l4zyxebs6yhf:4,zw50msqwigyjkozihvcnaqkbfhvyzwnpcgllbnrazxhhbxbszs5kb20caqawdqyj:4,zw5kzxixitafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbtcbnzanbgkq:4,zwxy:4,zxhhbxbszs5kb20whhcnmdewmzmxmte0mdmzwhcnmdiwmzmxmte0mdmzwjbbmqsw:4},titles:["M2Crypto Package","SSL Package","1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO","HOWTO: Creating your own CA with OpenSSL","HOWTO: Programming S/MIME in Python with M2Crypto","HOWTO: Programming SSL in Python with M2Crypto","Welcome to M2Crypto\u2019s documentation!"],titleterms:{The:3,asn1:0,authcooki:0,bio:0,bit:5,callback:0,certif:4,checker:1,cipher:1,code:5,conclus:[2,3],connect:1,content:2,context:1,creat:3,decrypt:4,document:6,dsa:0,encrypt:4,engin:0,err:0,evp:0,ftpslib:0,histori:5,howto:[2,3,4,5,6],http:2,httpslib:0,indic:6,instal:2,interoper:4,introduct:[2,3,4,5],kei:4,m2crypto:[0,2,4,5,6],m2urllib2:0,m2urllib:0,m2xmlrpclib:0,messag:4,messeng:4,microsoft:4,mime:4,modul:[0,1],netscap:4,openssl:3,origin:4,outlook:4,over:2,own:3,packag:[0,1],prepar:2,procedur:3,program:[4,5],python:[2,4,5],rand:0,rc4:0,resourc:4,rsa:0,sampl:5,secur:5,send:4,session:1,sign:4,smime:[0,4],smtp:4,sourc:2,ssl:[1,5],ssl_dispatch:1,ssldump:5,sslserver:1,subpackag:0,tabl:6,test:2,thread:0,timeout:1,twistedprotocolwrapp:1,util:0,verifi:4,via:4,webdav:2,welcom:6,x509:0,xmlrpc:2,your:3,zserverssl:2,zsmime:4}}) \ No newline at end of file
+Search.setIndex({docnames:["M2Crypto","M2Crypto.SSL","ZServerSSL-HOWTO","howto.ca","howto.smime","howto.ssl","index"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.viewcode":1,sphinx:55},filenames:["M2Crypto.rst","M2Crypto.SSL.rst","ZServerSSL-HOWTO.rst","howto.ca.rst","howto.smime.rst","howto.ssl.rst","index.rst"],objects:{"M2Crypto.ASN1":{ASN1_Integer:[0,1,1,""],ASN1_Object:[0,1,1,""],ASN1_String:[0,1,1,""],ASN1_TIME:[0,1,1,""],ASN1_UTCTIME:[0,3,1,""],LocalTimezone:[0,1,1,""]},"M2Crypto.ASN1.ASN1_Integer":{m2_asn1_integer_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_Object":{m2_asn1_object_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_String":{as_text:[0,2,1,""],m2_asn1_string_free:[0,2,1,""]},"M2Crypto.ASN1.ASN1_TIME":{get_datetime:[0,2,1,""],m2_asn1_time_free:[0,2,1,""],set_datetime:[0,2,1,""],set_string:[0,2,1,""],set_time:[0,2,1,""]},"M2Crypto.ASN1.LocalTimezone":{dst:[0,2,1,""],tzname:[0,2,1,""],utcoffset:[0,2,1,""]},"M2Crypto.AuthCookie":{AuthCookie:[0,1,1,""],AuthCookieJar:[0,1,1,""],mix:[0,4,1,""],unmix3:[0,4,1,""],unmix:[0,4,1,""]},"M2Crypto.AuthCookie.AuthCookie":{data:[0,2,1,""],expiry:[0,2,1,""],headerValue:[0,2,1,""],isExpired:[0,2,1,""],mac:[0,2,1,""],name:[0,2,1,""],output:[0,2,1,""],value:[0,2,1,""]},"M2Crypto.AuthCookie.AuthCookieJar":{isGoodCookie:[0,2,1,""],isGoodCookieString:[0,2,1,""],makeCookie:[0,2,1,""]},"M2Crypto.BIO":{BIO:[0,1,1,""],BIOError:[0,5,1,""],CipherStream:[0,1,1,""],File:[0,1,1,""],IOBuffer:[0,1,1,""],MemoryBuffer:[0,1,1,""],SSLBio:[0,1,1,""],openfile:[0,4,1,""]},"M2Crypto.BIO.BIO":{bio_ptr:[0,2,1,""],close:[0,2,1,""],fileno:[0,2,1,""],flush:[0,2,1,""],m2_bio_free:[0,2,1,""],read:[0,2,1,""],readable:[0,2,1,""],readline:[0,2,1,""],readlines:[0,2,1,""],reset:[0,2,1,""],seek:[0,2,1,""],should_read:[0,2,1,""],should_retry:[0,2,1,""],should_write:[0,2,1,""],tell:[0,2,1,""],write:[0,2,1,""],write_close:[0,2,1,""],writeable:[0,2,1,""]},"M2Crypto.BIO.CipherStream":{SALT_LEN:[0,3,1,""],close:[0,2,1,""],m2_bio_free:[0,2,1,""],m2_bio_pop:[0,2,1,""],set_cipher:[0,2,1,""],write_close:[0,2,1,""]},"M2Crypto.BIO.File":{close:[0,2,1,""],flush:[0,2,1,""],reset:[0,2,1,""]},"M2Crypto.BIO.IOBuffer":{close:[0,2,1,""],m2_bio_free:[0,2,1,""],m2_bio_pop:[0,2,1,""]},"M2Crypto.BIO.MemoryBuffer":{close:[0,2,1,""],getvalue:[0,2,1,""],read:[0,2,1,""],read_all:[0,2,1,""],write_close:[0,2,1,""]},"M2Crypto.BIO.SSLBio":{do_handshake:[0,2,1,""],set_ssl:[0,2,1,""]},"M2Crypto.BN":{rand:[0,4,1,""],rand_range:[0,4,1,""],randfname:[0,4,1,""]},"M2Crypto.DH":{DH:[0,1,1,""],DHError:[0,5,1,""],gen_params:[0,4,1,""],load_params:[0,4,1,""],load_params_bio:[0,4,1,""],set_params:[0,4,1,""]},"M2Crypto.DH.DH":{check_params:[0,2,1,""],compute_key:[0,2,1,""],gen_key:[0,2,1,""],m2_dh_free:[0,2,1,""],print_params:[0,2,1,""]},"M2Crypto.DSA":{DSA:[0,1,1,""],DSAError:[0,5,1,""],DSA_pub:[0,1,1,""],gen_params:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_params:[0,4,1,""],load_params_bio:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],pub_key_from_params:[0,4,1,""],set_params:[0,4,1,""]},"M2Crypto.DSA.DSA":{check_key:[0,2,1,""],gen_key:[0,2,1,""],m2_dsa_free:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_params:[0,2,1,""],save_params_bio:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],set_params:[0,2,1,""],sign:[0,2,1,""],sign_asn1:[0,2,1,""],verify:[0,2,1,""],verify_asn1:[0,2,1,""]},"M2Crypto.DSA.DSA_pub":{check_key:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],sign:[0,2,1,""],sign_asn1:[0,2,1,""]},"M2Crypto.EC":{EC:[0,1,1,""],ECError:[0,5,1,""],EC_pub:[0,1,1,""],ec_error:[0,4,1,""],gen_params:[0,4,1,""],get_builtin_curves:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_string:[0,4,1,""],load_key_string_pubkey:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],pub_key_from_der:[0,4,1,""],pub_key_from_params:[0,4,1,""]},"M2Crypto.EC.EC":{as_pem:[0,2,1,""],check_key:[0,2,1,""],compute_dh_key:[0,2,1,""],gen_key:[0,2,1,""],m2_ec_key_free:[0,2,1,""],pub:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],sign_dsa:[0,2,1,""],sign_dsa_asn1:[0,2,1,""],verify_dsa:[0,2,1,""],verify_dsa_asn1:[0,2,1,""]},"M2Crypto.EC.EC_pub":{get_der:[0,2,1,""],get_key:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""]},"M2Crypto.EVP":{Cipher:[0,1,1,""],EVPError:[0,5,1,""],HMAC:[0,1,1,""],MessageDigest:[0,1,1,""],PKey:[0,1,1,""],hmac:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_bio_pubkey:[0,4,1,""],load_key_string:[0,4,1,""],load_key_string_pubkey:[0,4,1,""],pbkdf2:[0,4,1,""]},"M2Crypto.EVP.Cipher":{"final":[0,2,1,""],m2_cipher_ctx_free:[0,2,1,""],set_padding:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.HMAC":{"final":[0,2,1,""],digest:[0,2,1,""],m2_hmac_ctx_free:[0,2,1,""],reset:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.MessageDigest":{"final":[0,2,1,""],digest:[0,2,1,""],m2_md_ctx_free:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.EVP.PKey":{"final":[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],assign_rsa:[0,2,1,""],get_modulus:[0,2,1,""],get_rsa:[0,2,1,""],m2_md_ctx_free:[0,2,1,""],m2_pkey_free:[0,2,1,""],reset_context:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],sign_final:[0,2,1,""],sign_init:[0,2,1,""],sign_update:[0,2,1,""],size:[0,2,1,""],update:[0,2,1,""],verify_final:[0,2,1,""],verify_init:[0,2,1,""],verify_update:[0,2,1,""]},"M2Crypto.Engine":{Engine:[0,1,1,""],EngineError:[0,5,1,""],cleanup:[0,4,1,""],load_dynamic:[0,4,1,""],load_dynamic_engine:[0,4,1,""],load_openssl:[0,4,1,""]},"M2Crypto.Engine.Engine":{ctrl_cmd_string:[0,2,1,""],finish:[0,2,1,""],get_id:[0,2,1,""],get_name:[0,2,1,""],init:[0,2,1,""],load_certificate:[0,2,1,""],load_private_key:[0,2,1,""],load_public_key:[0,2,1,""],m2_engine_free:[0,2,1,""],set_default:[0,2,1,""]},"M2Crypto.Err":{M2CryptoError:[0,5,1,""],SSLError:[0,5,1,""],get_error:[0,4,1,""],get_error_code:[0,4,1,""],get_error_func:[0,4,1,""],get_error_lib:[0,4,1,""],get_error_message:[0,4,1,""],get_error_reason:[0,4,1,""],get_x509_verify_error:[0,4,1,""],peek_error_code:[0,4,1,""]},"M2Crypto.RC4":{RC4:[0,1,1,""]},"M2Crypto.RC4.RC4":{"final":[0,2,1,""],rc4_free:[0,2,1,""],set_key:[0,2,1,""],update:[0,2,1,""]},"M2Crypto.RSA":{RSA:[0,1,1,""],RSAError:[0,5,1,""],RSA_pub:[0,1,1,""],gen_key:[0,4,1,""],keygen_callback:[0,4,1,""],load_key:[0,4,1,""],load_key_bio:[0,4,1,""],load_key_string:[0,4,1,""],load_pub_key:[0,4,1,""],load_pub_key_bio:[0,4,1,""],new_pub_key:[0,4,1,""],rsa_error:[0,4,1,""]},"M2Crypto.RSA.RSA":{as_pem:[0,2,1,""],check_key:[0,2,1,""],m2_rsa_free:[0,2,1,""],private_decrypt:[0,2,1,""],private_encrypt:[0,2,1,""],pub:[0,2,1,""],public_decrypt:[0,2,1,""],public_encrypt:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""],save_key_der:[0,2,1,""],save_key_der_bio:[0,2,1,""],save_pem:[0,2,1,""],save_pub_key:[0,2,1,""],save_pub_key_bio:[0,2,1,""],sign:[0,2,1,""],sign_rsassa_pss:[0,2,1,""],verify:[0,2,1,""],verify_rsassa_pss:[0,2,1,""]},"M2Crypto.RSA.RSA_pub":{check_key:[0,2,1,""],private_decrypt:[0,2,1,""],private_encrypt:[0,2,1,""],save_key:[0,2,1,""],save_key_bio:[0,2,1,""]},"M2Crypto.Rand":{load_file:[0,4,1,""],rand_add:[0,4,1,""],rand_bytes:[0,4,1,""],rand_file_name:[0,4,1,""],rand_pseudo_bytes:[0,4,1,""],rand_seed:[0,4,1,""],rand_status:[0,4,1,""],save_file:[0,4,1,""]},"M2Crypto.SMIME":{Cipher:[0,1,1,""],PKCS7:[0,1,1,""],PKCS7_Error:[0,5,1,""],SMIME:[0,1,1,""],SMIME_Error:[0,5,1,""],load_pkcs7:[0,4,1,""],load_pkcs7_bio:[0,4,1,""],load_pkcs7_bio_der:[0,4,1,""],load_pkcs7_der:[0,4,1,""],smime_load_pkcs7:[0,4,1,""],smime_load_pkcs7_bio:[0,4,1,""],text_crlf:[0,4,1,""],text_crlf_bio:[0,4,1,""]},"M2Crypto.SMIME.PKCS7":{get0_signers:[0,2,1,""],m2_pkcs7_free:[0,2,1,""],type:[0,2,1,""],write:[0,2,1,""],write_der:[0,2,1,""]},"M2Crypto.SMIME.SMIME":{decrypt:[0,2,1,""],encrypt:[0,2,1,""],load_key:[0,2,1,""],load_key_bio:[0,2,1,""],set_cipher:[0,2,1,""],set_x509_stack:[0,2,1,""],set_x509_store:[0,2,1,""],sign:[0,2,1,""],unset_cipher:[0,2,1,""],unset_key:[0,2,1,""],unset_x509_stack:[0,2,1,""],unset_x509_store:[0,2,1,""],verify:[0,2,1,""],write:[0,2,1,""]},"M2Crypto.SSL":{Checker:[1,0,0,"-"],Cipher:[1,0,0,"-"],Connection:[1,0,0,"-"],Context:[1,0,0,"-"],SSLError:[1,5,1,""],SSLServer:[1,0,0,"-"],SSLTimeoutError:[1,5,1,""],Session:[1,0,0,"-"],TwistedProtocolWrapper:[1,0,0,"-"],cb:[1,0,0,"-"],ssl_dispatcher:[1,0,0,"-"],timeout:[1,0,0,"-"]},"M2Crypto.SSL.Checker":{Checker:[1,1,1,""],NoCertificate:[1,5,1,""],SSLVerificationError:[1,5,1,""],WrongCertificate:[1,5,1,""],WrongHost:[1,5,1,""]},"M2Crypto.SSL.Checker.Checker":{numericIpMatch:[1,3,1,""]},"M2Crypto.SSL.Cipher":{Cipher:[1,1,1,""],Cipher_Stack:[1,1,1,""]},"M2Crypto.SSL.Cipher.Cipher":{name:[1,2,1,""],version:[1,2,1,""]},"M2Crypto.SSL.Connection":{Connection:[1,1,1,""]},"M2Crypto.SSL.Connection.Connection":{accept:[1,2,1,""],accept_ssl:[1,2,1,""],bind:[1,2,1,""],clear:[1,2,1,""],clientPostConnectionCheck:[1,3,1,""],close:[1,2,1,""],connect:[1,2,1,""],connect_ssl:[1,2,1,""],fileno:[1,2,1,""],get_cipher:[1,2,1,""],get_cipher_list:[1,2,1,""],get_ciphers:[1,2,1,""],get_context:[1,2,1,""],get_default_session_timeout:[1,2,1,""],get_peer_cert:[1,2,1,""],get_peer_cert_chain:[1,2,1,""],get_session:[1,2,1,""],get_shutdown:[1,2,1,""],get_socket_read_timeout:[1,2,1,""],get_socket_write_timeout:[1,2,1,""],get_state:[1,2,1,""],get_verify_depth:[1,2,1,""],get_verify_mode:[1,2,1,""],get_verify_result:[1,2,1,""],get_version:[1,2,1,""],getpeername:[1,2,1,""],getsockname:[1,2,1,""],getsockopt:[1,2,1,""],listen:[1,2,1,""],m2_bio_free:[1,2,1,""],m2_bio_noclose:[1,3,1,""],m2_ssl_free:[1,2,1,""],makefile:[1,2,1,""],pending:[1,2,1,""],read:[1,2,1,""],recv:[1,2,1,""],recv_into:[1,2,1,""],renegotiate:[1,2,1,""],send:[1,2,1,""],sendall:[1,2,1,""],serverPostConnectionCheck:[1,2,1,""],set1_host:[1,2,1,""],set_accept_state:[1,2,1,""],set_bio:[1,2,1,""],set_cipher_list:[1,2,1,""],set_client_CA_list_from_context:[1,2,1,""],set_client_CA_list_from_file:[1,2,1,""],set_connect_state:[1,2,1,""],set_post_connection_check_callback:[1,2,1,""],set_session:[1,2,1,""],set_session_id_ctx:[1,2,1,""],set_shutdown:[1,2,1,""],set_socket_read_timeout:[1,2,1,""],set_socket_write_timeout:[1,2,1,""],set_ssl_close_flag:[1,2,1,""],set_tlsext_host_name:[1,2,1,""],setblocking:[1,2,1,""],setsockopt:[1,2,1,""],settimeout:[1,2,1,""],setup_addr:[1,2,1,""],setup_ssl:[1,2,1,""],shutdown:[1,2,1,""],ssl_get_error:[1,2,1,""],verify_ok:[1,2,1,""],write:[1,2,1,""]},"M2Crypto.SSL.Context":{Context:[1,1,1,""],ctxmap:[1,4,1,""],map:[1,4,1,""]},"M2Crypto.SSL.Context.Context":{add_session:[1,2,1,""],close:[1,2,1,""],get_allow_unknown_ca:[1,2,1,""],get_cert_store:[1,2,1,""],get_session_cache_mode:[1,2,1,""],get_session_timeout:[1,2,1,""],get_verify_depth:[1,2,1,""],get_verify_mode:[1,2,1,""],load_cert:[1,2,1,""],load_cert_chain:[1,2,1,""],load_client_CA:[1,2,1,""],load_client_ca:[1,2,1,""],load_verify_info:[1,2,1,""],load_verify_locations:[1,2,1,""],m2_ssl_ctx_free:[1,2,1,""],remove_session:[1,2,1,""],set_allow_unknown_ca:[1,2,1,""],set_cipher_list:[1,2,1,""],set_client_CA_list_from_file:[1,2,1,""],set_default_verify_paths:[1,2,1,""],set_info_callback:[1,2,1,""],set_options:[1,2,1,""],set_session_cache_mode:[1,2,1,""],set_session_id_ctx:[1,2,1,""],set_session_timeout:[1,2,1,""],set_tmp_dh:[1,2,1,""],set_tmp_dh_callback:[1,2,1,""],set_tmp_rsa:[1,2,1,""],set_tmp_rsa_callback:[1,2,1,""],set_verify:[1,2,1,""]},"M2Crypto.SSL.SSLServer":{ForkingSSLServer:[1,1,1,""],SSLServer:[1,1,1,""],ThreadingSSLServer:[1,1,1,""]},"M2Crypto.SSL.SSLServer.SSLServer":{handle_error:[1,2,1,""],handle_request:[1,2,1,""]},"M2Crypto.SSL.Session":{Session:[1,1,1,""],load_session:[1,4,1,""]},"M2Crypto.SSL.Session.Session":{as_der:[1,2,1,""],as_text:[1,2,1,""],get_time:[1,2,1,""],get_timeout:[1,2,1,""],m2_ssl_session_free:[1,2,1,""],set_time:[1,2,1,""],set_timeout:[1,2,1,""],write_bio:[1,2,1,""]},"M2Crypto.SSL.TwistedProtocolWrapper":{TLSProtocolWrapper:[1,1,1,""],connectSSL:[1,4,1,""],connectTCP:[1,4,1,""],listenSSL:[1,4,1,""],listenTCP:[1,4,1,""]},"M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper":{clear:[1,2,1,""],connectionLost:[1,2,1,""],connectionMade:[1,2,1,""],dataReceived:[1,2,1,""],loseConnection:[1,2,1,""],startTLS:[1,2,1,""],write:[1,2,1,""],writeSequence:[1,2,1,""]},"M2Crypto.SSL.cb":{ssl_info_callback:[1,4,1,""],ssl_verify_callback:[1,4,1,""],ssl_verify_callback_allow_unknown_ca:[1,4,1,""],ssl_verify_callback_stub:[1,4,1,""]},"M2Crypto.SSL.ssl_dispatcher":{ssl_dispatcher:[1,1,1,""]},"M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher":{connect:[1,2,1,""],create_socket:[1,2,1,""],recv:[1,2,1,""],send:[1,2,1,""]},"M2Crypto.SSL.timeout":{struct_size:[1,4,1,""],struct_to_timeout:[1,4,1,""],timeout:[1,1,1,""]},"M2Crypto.SSL.timeout.timeout":{pack:[1,2,1,""]},"M2Crypto.X509":{CRL:[0,1,1,""],Request:[0,1,1,""],X509:[0,1,1,""],X509Error:[0,5,1,""],X509_Extension:[0,1,1,""],X509_Extension_Stack:[0,1,1,""],X509_Name:[0,1,1,""],X509_Name_Entry:[0,1,1,""],X509_Stack:[0,1,1,""],X509_Store:[0,1,1,""],X509_Store_Context:[0,1,1,""],load_cert:[0,4,1,""],load_cert_bio:[0,4,1,""],load_cert_der_string:[0,4,1,""],load_cert_string:[0,4,1,""],load_crl:[0,4,1,""],load_request:[0,4,1,""],load_request_bio:[0,4,1,""],load_request_der_string:[0,4,1,""],load_request_string:[0,4,1,""],new_extension:[0,4,1,""],new_stack_from_der:[0,4,1,""],x509_store_default_cb:[0,4,1,""]},"M2Crypto.X509.CRL":{as_text:[0,2,1,""],m2_x509_crl_free:[0,2,1,""]},"M2Crypto.X509.Request":{add_extensions:[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],as_text:[0,2,1,""],get_pubkey:[0,2,1,""],get_subject:[0,2,1,""],get_version:[0,2,1,""],m2_x509_req_free:[0,2,1,""],save:[0,2,1,""],save_pem:[0,2,1,""],set_pubkey:[0,2,1,""],set_subject:[0,2,1,""],set_subject_name:[0,2,1,""],set_version:[0,2,1,""],sign:[0,2,1,""],verify:[0,2,1,""]},"M2Crypto.X509.X509":{add_ext:[0,2,1,""],as_der:[0,2,1,""],as_pem:[0,2,1,""],as_text:[0,2,1,""],check_ca:[0,2,1,""],check_purpose:[0,2,1,""],get_ext:[0,2,1,""],get_ext_at:[0,2,1,""],get_ext_count:[0,2,1,""],get_fingerprint:[0,2,1,""],get_issuer:[0,2,1,""],get_not_after:[0,2,1,""],get_not_before:[0,2,1,""],get_pubkey:[0,2,1,""],get_serial_number:[0,2,1,""],get_subject:[0,2,1,""],get_version:[0,2,1,""],m2_x509_free:[0,2,1,""],save:[0,2,1,""],save_pem:[0,2,1,""],set_issuer:[0,2,1,""],set_issuer_name:[0,2,1,""],set_not_after:[0,2,1,""],set_not_before:[0,2,1,""],set_pubkey:[0,2,1,""],set_serial_number:[0,2,1,""],set_subject:[0,2,1,""],set_subject_name:[0,2,1,""],set_version:[0,2,1,""],sign:[0,2,1,""],verify:[0,2,1,""]},"M2Crypto.X509.X509_Extension":{get_critical:[0,2,1,""],get_name:[0,2,1,""],get_value:[0,2,1,""],m2_x509_extension_free:[0,2,1,""],set_critical:[0,2,1,""]},"M2Crypto.X509.X509_Extension_Stack":{m2_sk_x509_extension_free:[0,2,1,""],pop:[0,2,1,""],push:[0,2,1,""]},"M2Crypto.X509.X509_Name":{add_entry_by_txt:[0,2,1,""],as_der:[0,2,1,""],as_hash:[0,2,1,""],as_text:[0,2,1,""],entry_count:[0,2,1,""],get_entries_by_nid:[0,2,1,""],m2_x509_name_free:[0,2,1,""],nid:[0,3,1,""]},"M2Crypto.X509.X509_Name_Entry":{create_by_txt:[0,2,1,""],get_data:[0,2,1,""],get_object:[0,2,1,""],m2_x509_name_entry_free:[0,2,1,""],set_data:[0,2,1,""],set_object:[0,2,1,""]},"M2Crypto.X509.X509_Stack":{as_der:[0,2,1,""],m2_sk_x509_free:[0,2,1,""],pop:[0,2,1,""],push:[0,2,1,""]},"M2Crypto.X509.X509_Store":{add_cert:[0,2,1,""],add_x509:[0,2,1,""],load_info:[0,2,1,""],load_locations:[0,2,1,""],m2_x509_store_free:[0,2,1,""],set_verify_cb:[0,2,1,""]},"M2Crypto.X509.X509_Store_Context":{get1_chain:[0,2,1,""],get_current_cert:[0,2,1,""],get_error:[0,2,1,""],get_error_depth:[0,2,1,""],m2_x509_store_ctx_free:[0,2,1,""]},"M2Crypto.ftpslib":{FTP_TLS:[0,1,1,""]},"M2Crypto.ftpslib.FTP_TLS":{auth_ssl:[0,2,1,""],auth_tls:[0,2,1,""],ntransfercmd:[0,2,1,""],prot_c:[0,2,1,""],prot_p:[0,2,1,""]},"M2Crypto.httpslib":{HTTPSConnection:[0,1,1,""],ProxyHTTPSConnection:[0,1,1,""]},"M2Crypto.httpslib.HTTPSConnection":{close:[0,2,1,""],connect:[0,2,1,""],default_port:[0,3,1,""],get_session:[0,2,1,""],set_session:[0,2,1,""]},"M2Crypto.httpslib.ProxyHTTPSConnection":{connect:[0,2,1,""],endheaders:[0,2,1,""],putheader:[0,2,1,""],putrequest:[0,2,1,""]},"M2Crypto.m2urllib":{open_https:[0,4,1,""]},"M2Crypto.m2urllib2":{HTTPSHandler:[0,1,1,""],build_opener:[0,4,1,""]},"M2Crypto.m2urllib2.HTTPSHandler":{https_open:[0,2,1,""],https_request:[0,2,1,""]},"M2Crypto.m2xmlrpclib":{SSL_Transport:[0,1,1,""]},"M2Crypto.m2xmlrpclib.SSL_Transport":{request:[0,2,1,""],user_agent:[0,3,1,""]},"M2Crypto.threading":{cleanup:[0,4,1,""],init:[0,4,1,""]},"M2Crypto.util":{UtilError:[0,5,1,""],bin_to_hex:[0,4,1,""],genparam_callback:[0,4,1,""],no_passphrase_callback:[0,4,1,""],octx_to_num:[0,4,1,""],passphrase_callback:[0,4,1,""],pkcs5_pad:[0,4,1,""],pkcs7_pad:[0,4,1,""],quiet_genparam_callback:[0,4,1,""]},M2Crypto:{ASN1:[0,0,0,"-"],AuthCookie:[0,0,0,"-"],BIO:[0,0,0,"-"],BN:[0,0,0,"-"],DH:[0,0,0,"-"],DSA:[0,0,0,"-"],EC:[0,0,0,"-"],EVP:[0,0,0,"-"],Engine:[0,0,0,"-"],Err:[0,0,0,"-"],RC4:[0,0,0,"-"],RSA:[0,0,0,"-"],Rand:[0,0,0,"-"],SMIME:[0,0,0,"-"],SSL:[1,0,0,"-"],X509:[0,0,0,"-"],__init__:[0,0,0,"-"],callback:[0,0,0,"-"],ftpslib:[0,0,0,"-"],httpslib:[0,0,0,"-"],m2:[0,0,0,"-"],m2crypto:[0,0,0,"-"],m2urllib2:[0,0,0,"-"],m2urllib:[0,0,0,"-"],m2xmlrpclib:[0,0,0,"-"],threading:[0,0,0,"-"],util:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","attribute","Python attribute"],"4":["py","function","Python function"],"5":["py","exception","Python exception"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:attribute","4":"py:function","5":"py:exception"},terms:{"059600270x":5,"0ipy80":4,"0jwuq":4,"0qjhp6hut7fso":4,"0x0":[3,4],"0x1":3,"0x10001":[3,4],"0x2":[3,4],"0x822012c":4,"19973a9dbbb601ba":3,"1bc9f3q":4,"1czdztgk7h9cdgx2qjsivymyytcfi3zsuzmjs8":3,"1dr9dy8l0naqh21y5fgss8b1wd":4,"1ezn9zmlryqzbtxnnrmp3dhj":4,"1g9epovswhpqr":4,"1hxxfyo88m":3,"1qk53c":3,"1t8luishhn9899imp2vyg0ub67fqfypymm2cm2":4,"1tcaqbmq":4,"1vsrcid":3,"217mrhyx2nswgrpkqndu3gespovml3jeqiaxuponbwq7rj42":3,"2aglpogdcfdioqblb2dcscohmbbvr":3,"2bconvert":1,"2bdqvfpffx5lsmitkzaobldssjfr6rojxoqrsgia2az":4,"2cjcbfzokmijci03kbtqxofiqglstwxgzknf":3,"2dnyol50zu0sdzst1":3,"2iwrpascbeid8saraql3ddcli":3,"2zz2g7x1hxrwh95a":4,"3c93156fc7b4ebf49fe9c7db7f503087":4,"3dizhtxigepfztiuyutxs3i2gnmx2pee3chtllywd3jneakz0iozpdphif2xhllq":4,"3pjiyfhaxk64iutmpsy393rhmeb4kn":4,"3wf7q915tveqoc74bnu6b8ibbgrmhzdzmvq4szffveaum":3,"41b2874df3d02dd4":3,"4ju6":4,"4mpgg20wd633d4z4dtlddz":3,"4oxll0bi":3,"509v3":2,"56vrpgppgut40hv8xqfbwiz2whwwlkpfahj8b79ztfuzuru6z2rnpvv8inhc":4,"5efdvbet":3,"6l0g37faxur3xm28rchzvhu":3,"76h5jiznpbdsf2fjghwqvvdgyw4owy3mu739lhvnblicn":3,"7ay4jsdhyibcmgsq":3,"7pvwhtszeyhn3oa9dhlmv9uqc4wy5md7j":3,"7zjt2r5cpikgkwofamduxeltx":3,"8caweaaaaama0gcsqgsib3dqebbauaa4gb":3,"8czydsolmyibujccabycaqewydbbmqswcqydvqqgewjtrzerma8ga1uechmittjd":4,"8levy0cllw":3,"8tsi3wo5enkg4qwbnarqc3vgcv":4,"8yhspd0caweaaaobtjcbszadbgnvhq4efgquxoyoll1t4jabwzfrm7ms8nblzuow":4,"974aklcjnk1gzigarz":4,"9gul1bxbckrtedtxenqtem7spzomtswd2lhb8z65grx90cyt":4,"9ij5z6mja7rm7ttbsjup":4,"9rsqkrc9urv9mrbisredgnyecnerak5r1yzpoowninxc":3,"9znlfejkjj67vembxbj":4,"abstract":[0,4],"break":2,"byte":[0,1],"case":[1,4,5],"class":[0,1,4,5],"default":[0,1,2,3,4,5],"export":[1,4],"final":[0,4],"float":0,"function":[0,1,2,4,5],"import":[0,1,2,4],"int":[0,1],"long":[1,5],"new":[0,1,2,3,4],"null":[0,1],"public":[0,3,4],"return":[0,1,4,5],"true":[0,1,4],"while":[0,1,2,4],AND:1,CAs:1,DES:[3,4],DNS:[0,5],Doing:0,For:[0,1,2,3,4],HAS:1,Its:0,NOT:[0,1],Not:[3,4],THE:1,TLS:[0,1,5],That:[3,4],The:[0,1,2,4,5],There:[1,3,4,5],These:[1,2],Use:[0,1,5],Using:[3,4,5],WILL:1,With:2,__del__:1,__init__:[0,2],_alwayssucceedspostconnectioncheck:1,_close_cb:0,_debug:0,_io:0,_mode_:1,_ptr:0,_pyfre:[0,1],_pyfree_x509:0,_timeout_:1,_top:2,a4mgiy2kwwfie73qiyv7yyg8flrvr1iib:3,aaiavb8w:4,abl:4,about:[0,1,3,4],abov:[0,1,2,4,5],absent:1,absolut:0,abstracthttphandl:0,accept:[0,1,2,3,4,5],accept_ssl:1,access:[2,4],accord:[0,1],acl_us:2,acquir:0,action:1,actual:[0,1,4,5],actualhost:1,add:[0,1,2],add_cert:0,add_entry_by_txt:0,add_ext:0,add_extens:0,add_sess:1,add_x509:0,added:[0,1],addhead:2,addinfourl:0,adding:1,addit:[0,1,5],addr:1,address:[1,3,4,5],addressfamili:1,admin:3,administr:4,advanc:3,adversari:0,aes_128_cbc:0,aetir4v7sgxmepx7thq1pv:4,af_inet:1,affect:1,afresh:3,after:[0,1,3,4,5],again:[0,3,4],against:0,agent:2,aggtjgplibexlzalhpwlz9laqyrqpvcvjywaovfmmvrav4nafnoz2:4,ago:3,ahau6kwk:4,ahporp5ys55czpi:3,aka:0,akbr4il1nkq8ecsmcr3wpa0i9n0ehi7zvpvahxc0sqapfl8ygdfhq:3,alert:1,alg:0,algo:0,algorigthm:0,algorithm:[0,3,4],alia:0,aliv:1,all:[0,1,3,5],allow:[0,1,3,5],almost:0,along:0,alreadi:1,also:[0,1,2,3,4,5],alt:2,altern:[1,2],although:5,alwai:[0,4],amyxludrk45acua:3,analys:5,ani:[0,1,5],anoth:[1,3],anyon:4,anyth:5,aogabaku8w3w1qu15hle1bjsl7gmreoreqeblobmmazz4by0l6sxzxjpjwxo86f:3,apach:2,api:[0,1],appear:2,append:0,appli:[0,2,3],applic:[0,1,3,4,5],approach:4,appropri:[0,1,5],aqh:4,arg:0,argument:0,argv:0,arm:4,around:2,as_der:[0,1],as_hash:0,as_pem:0,as_text:[0,1],ask:[0,3,4],asn1:6,asn1_integ:0,asn1_object:0,asn1_str:0,asn1_string_print_ex:0,asn1_tim:0,asn1_utctim:0,asn1int:0,asn1obj:0,asn1str:0,assign:[0,1],assign_rsa:0,associ:[0,1],assum:[1,2,4],asyncio:1,asyncor:[1,2],attach:4,attempt:[0,5],attribut:[0,3,4],auth:0,auth_ssl:0,auth_tl:0,authcooki:6,authcookiejar:0,authent:4,author:[0,2,3,4,5],autom:4,automag:[0,4],automat:[1,5],avail:[1,2,4,5],avoid:2,awai:[0,1],awfqq4jcc:4,awihma0gccqgsib3dqmcageoma0gcsqgsib3dqebaquabigaqpu8hfutlcf6ho2t:4,ax96lvs0:3,b4law8g59vtg6dykeetrg0rubx4bggc7pkbfuin423yjjodwchvvgnpozxmqt:3,b4txejzriyc8f3:4,b6gr5s8:4,b6ugcsqgsib3dqehataubggqhkig9w0dbwqirf525ufwszaaggea85rmx6axqmxb:4,b75:3,b877j9wbpbl:3,b9zjffauqtwzdnjgrkkyikhwjdojaac:4,backlog:1,bad:1,base64:4,base:[0,1,2,3,4,5],basi:1,basic:[3,4],bat:2,bdclcn8a:4,becaus:[0,1,4],been:[0,1,4],befor:[0,1,3,4,5],began:3,begin:[3,4,5],behav:1,behaviour:1,being:[0,1,4],below:2,best:5,better:0,between:5,beyond:4,bgbyj1dubkhzsc7dgxzdtuclgnxqnnsg:3,bgcolor:2,bgkqhkig9w0bbwewfayikozihvcnawcecmn:4,bgkqhkig9w0bbwewhayjkozihvcnaqkfmq8xdtaxmdmzmtexnduwmlowiwyjkozi:4,bhdelbr5jbpjcj5aid76mfr8:4,bhmcu0cxetapbgnvbaotce0yq3j5chrvmrkwfwydvqqdexbtl01jtuugumvjaxbp:4,big:0,bin_to_hex:0,binari:[0,1],bind:1,bind_and_activ:1,bindaddress:1,binstr:1,bio:[1,4,5,6],bio_clos:1,bio_f_buff:0,bio_f_ciph:0,bio_f_ssl:0,bio_fre:1,bio_in:0,bio_noclos:1,bio_ptr:0,bio_push:0,bio_s_mem:0,bio_s_pyfd:0,bioerror:0,bit:[0,1,3,4],bitmask:1,bitwis:0,bjq5hnxbouslq0rwbrkoxv64i:4,blank:[3,4],blklen:0,blob:[0,4],block:1,blwegdqhonaiwbk5z1l:4,bmrlckblegftcgxllmrvbqibadajbgurdgmcgguaoigxmbggcsqgsib3dqejazel:4,bmvnwbppufzpiaivalycjt6pyextbbszs7:3,bo2w7ei6iejbazk:3,bodi:[0,2],book:5,bool:1,border:2,both:[0,1,2],bottom:[0,4],bound:[0,1],boundari:4,box:[2,4],br77:3,bring:4,brows:2,browser:2,browser_id_manag:2,buf:[0,4],buf_len:0,buff:1,buffer:[0,1,4,5],buffer_s:1,buffers:1,buflen:1,bufsiz:1,build_open:0,built:1,builtin:0,bundl:[2,3,4],bxwxkuuvt81vbjwdn9jst6:4,bytearrai:1,c6fi3n03rgfmkectijc:3,cacert:[1,3],cach:1,cadav:2,cafil:1,cakei:3,calcul:0,call:[0,1,3,4,5],callabl:[0,1],callback:[1,6],caller:1,can:[0,1,2,3,4,5],cannot:1,capath:1,captur:0,cat:3,catalog:2,catop:3,cbc:[3,4],ccrt2tfwkbbfleuifl7mb:3,ccvkzzl:3,cenfqfwc:4,cepl:0,cert:[0,1,4,5],certain:[0,1,3],certbio:0,certchainfil:1,certdata2pem:5,certdata:5,certfil:[0,1],certif:[0,1,2,3,5],certifi:[3,4],certmast:3,cgyikozihvcnawcwdgyikozihvcnawicagcama0gccqgsib3dqmcagfamacgbsso:4,chain:[0,1,5],challeng:3,chandra:5,chang:[0,1],channel:[1,2],charact:0,cheap:4,check:[0,1,2,3,5],check_ca:0,check_kei:0,check_param:0,check_purpos:0,checker:[0,5,6],choos:[3,4],chosen:5,chunk:1,cipher:[0,4,5,6],cipher_list:1,cipher_stack:1,cipherstream:0,circular:1,citi:[3,4],claim:5,clbwev3ryfrlp4x8j9mdte0ykok3t0wqohqrettsifdtjnfp:3,clean:[0,1],cleanup:0,clear:[0,1,3,4],click:[2,4],client:[0,1,4,5],client_addr:0,client_address:1,clientpostconnectioncheck:1,close:[0,1,2,4],close_flag:0,close_pyfil:0,clutter:2,cmd:0,cnf:[3,4],cngeq1qxtyduiguda2nbgcl:4,cnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxixitafbgkqhkig9w0bcqewennl:4,code:[0,1,3,4],coll:2,collect:[2,5],com:[0,2,3,4,5],combin:1,come:[0,3,5],command:[3,5],comment:3,commerci:4,commit:3,common:[3,4,5],commonli:4,commonnam:[0,1,3,5],commun:[0,1],compani:[3,4],companion:4,compar:5,compat:5,compil:[0,1],complet:[0,1],compos:2,composit:0,comput:0,compute_dh_kei:0,compute_kei:0,concaten:1,configur:[3,4],conn:0,connect:[0,2,4,5,6],connect_ssl:1,connectionlost:1,connectionmad:1,connectssl:1,connecttcp:1,consid:1,consist:[0,4],constant:[0,1],constrain:3,constraint:[3,4],consum:4,contain:[0,1,2,4],content:[0,1,4,6],context:[0,5,6],contextfactori:1,continu:1,control:[0,1,5],control_panel:2,conveni:1,convert:[0,5],cooki:0,cookie_str:0,copi:[1,2,3],copyright:[0,1,2,3,4,5],corner:4,correct:[1,4],correctli:4,correspond:4,could:[0,1,5],count:[0,2],counterpan:4,countri:[3,4],countrynam:3,cours:[3,4],cover:3,coz:4,cqydvqqgewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbt:4,cqzkt9:3,crack:4,crash:0,creat:[0,1,2,4,5,6],create_by_txt:0,create_socket:1,creation:[1,3],credit:2,critic:0,crl:0,cryptograph:[0,4],css:2,cstringio:0,ctrl_cmd_string:0,ctx:[0,1,5],ctxmap:1,current:[0,1,4],curv:0,custom:1,cvzrxakeaxno80arbgxpumr11ghg:3,cw8kzzwh:4,cxo23r9wwrnzem:4,d2i_ssl_sess:1,dai:[3,4],dasmytmpc4ztytv06n07afbjl:3,dat:[2,4],data:[0,1,2,3,4,5],data_bio:0,databas:3,datareceiv:1,date:[0,2,5],datetim:0,dav:2,dcwd:4,ddlzqbacuxwtv5xy8plmx7widaqab:3,dec:2,decid:[1,3],decis:3,decod:[1,3,5],decrypt:[0,5],def:4,default_port:0,defin:1,dek:3,delet:0,demo:[2,3,4,5],democa:3,demonstr:[3,4,5],depend:[0,1,2,4],deploi:3,depth:[0,1,5],der:[0,4],der_str:0,deriv:0,des_ede3_cbc:4,describ:[0,1],descript:0,desktop:2,detail:0,determin:0,dev:2,develop:3,dh1024:2,dherror:0,dhpfile:1,dialog:[2,4],did:[1,3],differ:[1,5],diffi:[0,2],digest:[0,4,5],digit:4,directli:[1,5],directori:[1,2,3,5],dirnam:[3,4],disabl:[0,1],discard:3,discuss:3,dispatch:1,displai:[4,5],dispos:1,disposit:4,distinguish:[1,3,4],distribut:[2,5],ditto:0,dnli0rvuvxiwt:3,do_handshak:0,document:[1,2,3,4,5],doe:[0,1,5],doesn:1,dog:4,dom:[3,4],don:0,done:[1,2],dough:0,down:1,download:[2,4,5],dqehaaavbbnhihnpz24gb2ygb3vyihrpbwvzoiic5zccaumwggjmoamcaqicaqaw:4,dqyjkozihvcnaqeebqawwzelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrv:4,dsa:[4,5,6],dsa_pub:0,dsaerror:0,dst:0,due:1,duhrqiml1tyi:3,duqhj2ygkkwdqq9v0xscjkgiyw:3,dure:[0,1,5],dw0boozhj8tc7co7lmyb0ye271b6:3,dyman:0,dynam:0,e9kybgki7vpojwbz27:3,e_n:0,each:[0,1,4],east:0,eawm5avuv7hnptt5zr:4,eaydvqqdewlsb2nhbghvc3qxjzalbgkqhkig9w0bcqewggfkbwluqhnlcnzlci5l:3,ebdz:4,ec9eyj:4,ec_error:0,ec_pub:0,ecdh:0,ecdsa:0,ecerror:0,ede3:[3,4],effect:4,egftcgxllmrvbtcbnzanbgkqhkig9w0baqefaaobjqawgykcgyear1nyy1qrll1r:3,either:[0,1],electron:4,els:[0,1,3,4],email:[0,3,4],emailaddress:[0,3],emmarsgyedf5h1afl1smkomskbqxe1d2jg:4,empir:0,emploi:5,enabl:[1,4],encod:[0,1,2,4],encrypt:[0,1,3],end:[0,1,3],endhead:0,endian:0,engin:[1,6],engine_ctrl_cmd_str:0,engine_method_:0,engineerror:0,enhanc:5,enough:0,ensu:4,ensur:[0,1],enter:[0,2,3,4],entri:[0,3],entropi:0,entry_count:0,environ:[0,1],eopzyno4mi:4,eoq9wfscnii4:3,eovbgs7ezalvvkdj4hnl:4,eozfol5i20ykiv6j:4,ephemer:1,epoch:0,epollreactor:1,equival:[0,1],eric:5,err:[4,6],err_get_error:0,errdepth:1,errnum:1,error:[0,1,4],error_log:2,establish:[0,1,5],estim:0,etag:2,etc:[0,1],etwitreft1heupnar:4,even:0,event:0,evp:6,evp_ciph:0,evperror:0,ewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxix:4,exampl:[0,1,2,3,4,5],except:[0,1,5],exchang:[0,5],execut:[3,4],exist:[2,3],exit:0,exiy8geir:4,exp:0,expect:0,expectedhost:1,expir:[0,1,3],expiri:0,explain:4,explan:1,explicitli:1,explor:4,expon:[0,3,4],ext:0,ext_stack:0,extens:[0,1,3,4],extern:1,extra:3,extract:1,facilit:3,fact:0,factori:[0,1],fail:[0,1],failur:[0,1,4],fakesocket:5,fals:[0,1,3],famili:1,fancyurlopen:2,faq:0,farm:2,fashion:2,fatal:1,fcgiserv:2,fcmspp3auq1:4,featur:5,feed:0,feedback:0,few:[3,4],ffffff:2,fi1wdpphywke97pojizvqesfzopty5hjiyzux4u:3,field:[0,3,4,5],fieldnam:1,fifth:5,file:[0,1,2,3,4,5],filenam:[0,1,3,4],fileno:[0,1],find:1,fingerprint:0,finish:[0,1],first:[0,4,5],fixm:1,flag:[0,1,4,5],flndpcnkrtvqdx3rt6x6vbttcyom:4,flowinfo:1,flush:0,fmt7a120s3gd2jixgh06l:4,follow:[0,2,3,4,5],forgotten:3,forkingmixin:1,forkingsslserv:1,form:[0,1,5],format:[0,1,4,5],format_d:0,format_format_d:0,format_pem:0,found:[0,1],foundat:[1,5],four:1,fourth:5,fqlcrrr5nvupdin:3,freebsd:2,freed:1,freeli:4,freewar:4,friendli:4,frill:0,from:[0,1,2,3,4,5],from_addr:4,from_cert:4,from_kei:4,ftp:[0,2],ftp_tl:0,ftplib:0,ftpserver:2,ftpslib:6,full:[3,4],further:1,fv4sgm3jkr:4,g3bgsmvlxkefztfjkxo6xnjcbnf5i:4,g7ppoo:3,gain:5,gd58p4mpmhu5iknz4yh4nlhnaitevcs85tzuaxze9g:4,gen_kei:0,gen_param:0,gener:[0,1,3,4],genparam_callback:0,get0_sign:0,get1_chain:0,get:[0,1,2],get_allow_unknown_ca:1,get_builtin_curv:0,get_cert_stor:1,get_ciph:1,get_cipher_list:1,get_context:1,get_crit:0,get_current_cert:0,get_data:0,get_datetim:0,get_default_session_timeout:1,get_der:0,get_entries_by_nid:0,get_error:[0,1,4],get_error_cod:0,get_error_depth:0,get_error_func:0,get_error_lib:0,get_error_messag:0,get_error_reason:0,get_ext:0,get_ext_at:0,get_ext_count:0,get_fingerprint:0,get_id:0,get_issu:0,get_kei:0,get_modulu:0,get_nam:0,get_not_aft:0,get_not_befor:0,get_object:0,get_peer_cert:1,get_peer_cert_chain:1,get_pubkei:0,get_rsa:0,get_serial_numb:0,get_sess:[0,1],get_session_cache_mod:1,get_session_timeout:1,get_shutdown:1,get_socket_read_timeout:1,get_socket_write_timeout:1,get_stat:1,get_subject:0,get_tim:1,get_timeout:1,get_valu:0,get_verify_depth:1,get_verify_mod:1,get_verify_result:1,get_vers:[0,1],get_x509_verify_error:0,getpeernam:1,getproto:1,getronicsgov:4,getsocknam:1,getsockopt:1,geturl:0,getvalu:0,ggarfmmj4yuhewkys9jo1h8k4bdxugmauwni5:3,give:3,given:[0,1],givennam:0,gknqqdblotqt06f3oissdjetm2itllyhgzv:3,global:4,gmt:[2,3,4],goe:[0,1],good:0,govern:3,gpmpndsyvvceufpluwydim0vkwhgc2:4,gqnveov:3,gqzcvnzzcmx8uvrjqr8drwdsmpj0vxg1:4,gracefulli:1,gratefulli:4,grcgzeb9ymfcedxahtdufhjrkpdpsxzzvvgksbncbqu92obyqvnrq8m:4,greet:1,grew:5,group:4,gucrblvd7n3ofnx5ujmpmcw9zwbu:4,gvyvi:4,gymga1udiwr8mhqaffzsqjs9bei2gcgrutozevjws81kov:4,h7nmicymi2wkz8h:4,h99suto:3,h9diul:3,hack:2,handi:3,handl:[1,4],handle_error:1,handle_request:1,handler:[0,1],handshak:[0,1],hanson:3,happen:5,hard:0,hardwar:0,has:[0,1,4,5],hash:0,have:[1,3,4],hcyiukxujtaqtxboh:4,head:2,header:[0,2],headervalu:0,height:2,heikki:[1,5],hellman:[0,2],henc:3,henceforth:2,here:[0,1,3,4],hex:0,higher:1,hihsrgwtnd7lnxuucpx8yv1id0dlmp0hz:4,his:4,hkig9w0baqefaaobjqawgykcgyea5c5tj1chtsoxa1q2q0fyiwmwyhptjpjcvtzm:4,hmac:[0,4,5],hold:0,home:[0,2,4],hook:1,host:[0,1,5],hostnam:1,hot:4,how:[0,1,4,5],howev:1,hpysvh:4,href:2,hrg6sai33usk8xpokjqa:3,htm:4,html:[0,2,4],http:[0,4,5],http_class:0,httpconnect:[0,5],httplib:[0,5],https_open:0,https_request:0,https_server:2,https_srv:4,httpsconnect:[0,5],httpserver:2,httpshandler:0,httpslib:[5,6],hu3qdmtcwjd:3,hvcnaqkemryefooerud8exiyxfqq8btfukwrsp3imfigcsqgsib3dqejdzffmemw:4,hyswpz1xvlprmv4:3,i2d_ssl_sess:1,ia5str:3,icon:4,ident:[1,2,4,5],identifi:[0,3,4,5],idx:1,ietf:4,ieucourgcxpyd1j65vt7ob3ziypu2f2nluicynqpg1sd:4,ignor:0,iihwd6gtv1uodf7urbxtl3hq9:4,imap:4,imc:4,img:2,immedi:1,implement:[0,4,5],imqqiiw:4,includ:[0,3],incorpor:[3,4],increas:0,indent:0,indetermin:1,index:[0,6],index_html:2,indic:[0,1,4],indirectli:0,info:[0,3,4],inform:[0,1,2,3,4,5],inherit:[0,1],init:0,initi:[0,1],initialis:[0,1],inkei:4,input:[0,1,5],insert:0,instal:4,instanc:[0,1,4,5],instanti:[0,4],instead:[2,4],instruct:2,integ:1,integr:4,intend:4,interact:0,interest:1,interfac:[0,1,4,5],intern:[0,1],internet:[1,3,4],interpret:[0,1,5],intuit:3,invalid:0,invok:[0,1,2,4],iobuff:[0,5],ioy0bdijcyn1jimohj:4,ipv4:1,ipv6:1,iqwxllnj:4,ir9fggophatzzq:4,ireactorssl:1,ireactortcp:1,isbn:5,isexpir:0,isgoodcooki:0,isgoodcookiestr:0,issu:[1,2,4],issuer:[0,3,4],itafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbyibadambgnvhrmebtad:4,item:0,iter:0,its:[0,1,2,3,4],itself:[0,4],iwq3n6j1suzs3uw6abq8bivynoucmkjaqqjbanqxfalu4b:3,j6wo9dzltioz3znvr3ljsskib4tip4ugqnjaluw7m3ftz3magxn68hbbjs8tz8tl:4,j9ftv3di:3,jan:2,jbt3ltgf743utyaas7hnguouobhoyt:3,jcyhx9vw4xvja7:4,jddsk:4,john:5,join:4,ju4:3,jun:2,just:[1,5],jvy5cif:4,jy5rd:3,jyvbd7acn35p5yx7ktqvqerwdijxycanbcnvmrtmysanw9kv1ujtxc5vx7ylwipk:3,kdfqdmtfzqkymhp1laq1ihbq1rhwsbh5n3ekq:3,kdjqodst7ovu62motgf3arcduppwuztfxolyone5nioo1apvhbrinqwcplkpotqr:3,kebfzs8asq7uc9axw6ti0eapj8evhtwhsbgzqrwekfbxs6hbbhmidc4n0m7oq:4,keep:[1,3],kef21pgguqpf14gkgfwx3sv4bjc1vbrrwq6zlg3nmuyqr5mtjjy9eq:3,kei:[0,1,2,3,5],key_as_byt:0,keybio:0,keyfil:[0,1],keygen_callback:0,keyid:[3,4],keylen:0,keyout:3,keypair:0,kilroi:0,kind:1,kiy8jkpv8dr5po1ikaxjfudbygdenjwybsrspsk3p:3,kkst1mcj:3,know:4,known:5,kozihvcnaqebbqaegyblzlgupfphwhsgtiapvdexn61qisz3oem88xoxkuw0szor:4,kozihvcnaqebbqaegycbaxz:4,ktgtcixjl2nmw7j:3,kv95ymtgbisuwkj93grbvqoj:4,kwarg:0,kxtbbmqswcqydvqqg:4,l5trm4x6zjxwuxxmijcehmmd8tc8ybwwo4ao19b3ebffetvsugxsga:3,l6kn27mwzhe331vjttjsgl4:3,lamy57gkw4ondmrtqvq2ojqlvosbllpxzh:4,last:[0,1,3,4,5],later:[0,1],latter:1,lbow6ssdir6:4,lead:[0,1],leak:0,least:1,leav:[3,4],left:[3,4],legal:0,len:0,length:[0,1,2],less:0,let:[3,4,5],letter:[1,3,4],level:[1,2],lg4q5yezr1ejaw:4,librari:[1,4],licenc:0,licens:0,lifetim:1,like:[0,3,4],limit:0,line:[0,4,5],link:[2,5],linux:5,list:[0,1,2],listen:1,listenssl:1,listentcp:1,literatur:0,littl:[2,5],ljecgc3rqu1uwisbkmquis1s46ebbm5np75izpnujokj2hv:4,lkmac1dwb3dqgjt5xk4wjesinfdxecnegacyteagyztpiapu:3,lnzqowadmol:4,load:[0,1,2,4,5],load_cert:[0,1,4],load_cert_bio:0,load_cert_chain:1,load_cert_der_str:0,load_cert_str:0,load_certif:0,load_client_ca:1,load_crl:0,load_dynam:0,load_dynamic_engin:0,load_fil:[0,4],load_info:[0,4],load_kei:[0,4],load_key_bio:0,load_key_bio_pubkei:0,load_key_str:0,load_key_string_pubkei:0,load_loc:0,load_openssl:0,load_param:0,load_params_bio:0,load_pkcs7:0,load_pkcs7_bio:0,load_pkcs7_bio_d:0,load_pkcs7_der:0,load_private_kei:0,load_pub_kei:0,load_pub_key_bio:0,load_public_kei:0,load_request:0,load_request_bio:0,load_request_der_str:0,load_request_str:0,load_sess:1,load_verify_info:1,load_verify_loc:[1,5],loc:0,local:[2,3,4],localhost:[2,3,4],localitynam:0,localtimezon:0,locat:[1,2],lock:4,logger:2,logic:1,longer:0,look:[3,4],loseconnect:1,lower:0,ltd:[3,4],lwpbxzf2k3fuudnkrlfbakeampxoybuifr2s5bma:3,ly4tpl5:3,m1awhen3vir2zlaw:3,m1je:3,m2_asn1_integer_fre:0,m2_asn1_object_fre:0,m2_asn1_string_fre:0,m2_asn1_time_fre:0,m2_bio_fre:[0,1],m2_bio_noclos:1,m2_bio_pop:0,m2_cipher_ctx_fre:0,m2_dh_free:0,m2_dsa_fre:0,m2_ec_key_fre:0,m2_engine_fre:0,m2_hmac_ctx_fre:0,m2_md_ctx_free:0,m2_pkcs7_free:0,m2_pkey_fre:0,m2_rsa_fre:0,m2_sk_x509_extension_fre:0,m2_sk_x509_free:0,m2_ssl_ctx_free:1,m2_ssl_free:1,m2_ssl_session_fre:1,m2_x509_crl_free:0,m2_x509_extension_fre:0,m2_x509_free:0,m2_x509_name_entry_fre:0,m2_x509_name_fre:0,m2_x509_req_fre:0,m2_x509_store_ctx_fre:0,m2_x509_store_fre:0,m2crypto:[1,3],m2crypto_xmlrpc:0,m2cryptoerror:0,m2urllib2:6,m2urllib:[2,6],m2xmlrpclib:[2,6],ma0gcsqgsib3dqebbauaa4gbaho3drchr86fstvavfixdsswwqktcehuhrdc:4,mac:0,made:[1,5],mai:[0,1,2,3,4,5],mail:4,maintain:1,make:[0,1,3,4,5],makebuf:4,makecooki:0,makefil:[0,1],malfunct:1,man:1,manag:2,mani:[0,2,4],manipul:[0,1],manpag:[0,1],manual:[0,5],map:[1,4],mar:[3,4],march:4,mark:[0,4],master:3,match:[0,3,4],matej:0,materi:[2,5],matt:5,max_byt:0,maximum:1,mbstring_asc:0,mbstring_utf8:0,md5:0,md5withrsaencrypt:[3,4],mean:0,meant:3,measur:0,medusa:2,memori:[0,4],memorybuff:[0,4],memoryview:1,messag:[0,1,5],message_bodi:0,messagedigest:0,messier:5,method:[0,1],mg611eovkleoostv:3,mh2pz4lverxa:4,mhf6rqar:4,micalg:4,microsec:1,might:1,miibntccaqycaqawxtelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrvmriw:3,miibvwyjkozihvcnaqcdoiibsdccauqcaqaxggeamih9ageamgywytelmakga1u:4,miicxgibaakbgqcvwdhjvcuwxwu4h8wqujguvm:3,miie8ayjkozihvcnaqccoiie4tccbn0caqexczajbgurdgmcgguamcigcsqgsib3:4,miiiwwyjkozihvcnaqcdoiiitdccclacaqaxggeamih9ageamgywytelmakga1u:4,mime:[3,5,6],mimetool:0,mind:1,minu:0,miss:1,mix:0,mkwcbi1nfvohcv3xdq2ela:4,mode:[0,1,2,4],model:[3,4],modifi:[0,2,4],modul:[4,5,6],modulu:[0,3,4],more:[0,1,3,5],most:[0,1,4,5],mous:0,movement:0,mozilla:[2,4],mpi:0,mpint:0,mrywfaydvqqdew1tl01jtuugu2vuzgvymsewhwyjkozihvcnaqkbfhjzzw5kzxja:4,msb:0,msg:4,msg_bio:4,mua:4,much:0,multilin:0,multipart:4,multipl:1,multipurpos:4,multivalu:0,must:[0,1,5],mutheybpq5th7ydrtnizkkxobnqe2kyux9x22a1kh49sojjfg6kpb9mugizbimlv:3,mutt:4,mysteri:0,naccept:2,name:[0,1,3,4,5],navig:4,nbbba2yl0n5gs1tyiy9z:3,nbsp:2,nbyte:1,nconnect:2,necessari:0,necessarili:0,need:[0,1,3,4,5],neg:0,negoti:1,neither:1,nerx9zjgvrwuscqqcu:3,net:3,netmemet:5,netscap:3,network:[4,5],new_extens:0,new_pub_kei:0,new_stack_from_d:0,newca:3,newcert:3,newer:0,newkei:[3,4],newkey2:3,newli:0,newreq:3,next:[0,3,4],ngp:[2,3,4,5],nhost:2,nid:0,nihuwgujn:3,niqfytycdl9i5sk:4,nkasxekr8auhjsbvumrqrl6r0nnsfpzdr1w7pv:4,no_passphrase_callback:0,nocertif:1,node:4,non:[0,1,4],noncrit:0,none:[0,1,4],nonzero:0,noout:[3,4],nor:[1,4],normal:[1,5],note:[0,1,4,5],noth:0,notifi:1,notwithstand:4,now:[3,4],nqaodq3aobzpafp9l:3,nqxlmgj3jwq7x9:4,nss:[4,5],ntransfercmd:0,nueymfjdm0uvntg0icxgnufsfnjkntthpagykgetric3kgjz:3,num:0,number:[0,1,3,4],numer:2,numericipmatch:1,nuser:2,nyndufwi0qm92qlk0ui:3,obio:0,object:[0,1,4,5],obtain:[0,4],occur:[0,1],octet:[0,1],octx_to_num:0,od2m3lp7jbwjqbrtndhimqul2s4yu:4,odd:0,off:0,offset:0,oiqto:4,old:[3,5],onc:[0,1],one:[1,2,3],ones:5,onli:[0,1,3],onto:0,open:[0,1,2,4,5],open_http:0,openfil:0,openpgp:4,openssl:[0,1,2,4,5,6],oper:[0,1,2,4],option:[0,1,3],optnam:1,org:[2,3,4,5],organ:[3,4],organiz:[3,4],organizationnam:[0,3],organizationunitnam:0,origin:0,osafound:5,other:[0,1,3,5],otherwis:0,our:4,out:[0,1,2,3,4],out_bio:0,outform:4,output:[0,4],over:[0,1,5],overlap:4,overload:1,overrid:1,overridden:1,overwrit:2,own:[0,1,2,4,6],p12:4,p7_bio:[0,4],p7file:0,p7m:4,p7s:4,pack:1,packag:6,pad:0,page:[1,2,6],pair:[0,1,2,3,4],param:[0,1],paramet:[0,1,2,4,5],part:4,partial:1,pass:[0,1,3],passphras:[0,1,3,4],passphrase_callback:[0,1],password:[0,3,4],patch:[2,3],path:0,pathnam:2,pbkdf2:0,pcgiserv:2,pdlrrliknknfmhkiacktlrcu59sca6adeiwuzqmuzp5cs6jrsro3nkfg1bd09d1k:3,peek_error_cod:0,peer:1,peercertdigest:1,peercerthash:1,pem:[0,1,2,3,4,5],pemfil:1,pend:1,pep484:1,per:[0,1,2],perform:[0,5],period:3,perl:3,permit:5,pfi:3,pfl1k5dyxrgtzlb36uljd:4,pgpmime:4,pheng:[0,1,2,3,4,5],phrase:3,pick:4,pin:0,pk7_smime:4,pkc:4,pkcs12:4,pkcs5_pad:0,pkcs7:[0,4],pkcs7_detach:4,pkcs7_error:0,pkcs7_pad:0,pkcs7_text:4,pkcs7_verifi:4,pkei:0,pkg:[3,4],plain:4,pleas:[1,3],plen:0,pltnni25spyrcwfl6erd25u:4,plu:1,point:0,pointer:0,polici:[1,3,4],pool:0,pop:[0,4],popular:4,port:[0,1,2],portal0:2,portal:2,portion:[0,5],posit:0,possibl:[0,1],post1:[2,3,4],post:0,post_connection_check:1,postconnectioncheck:1,power:2,practic:[0,4,5],pravir:5,predetermin:0,predict:0,prefix:0,premis:4,present:[1,2],press:0,pretend:4,pretti:5,previou:0,previous:1,primari:5,prime:0,princip:0,print:[0,1,2,3,4],print_param:0,printabl:3,privaci:4,privat:[0,1,3,4],private_decrypt:0,private_encrypt:0,privkei:4,prng:[0,2,4],probabl:[1,4,5],problem:0,proc:3,proce:1,process:[1,3,4],produc:0,product:4,prog:4,program:[3,6],programm:[4,5],project:[4,5],prompt1:0,prompt2:0,prompt:4,propag:0,proper:1,properli:4,propertymap:2,prot_c:0,prot_p:0,protect:[0,1,4],protocol:[0,1,2,4,5],protocolwrapp:1,provid:[0,1,2,4,5],provinc:[3,4],proxi:0,proxyhttpsconnect:0,pseudo:[0,4],pss:0,pty:[3,4],pub:0,pub_kei:0,pub_key_from_d:0,pub_key_from_param:0,pubkei:0,public_decrypt:0,public_encrypt:0,purpos:[0,4],push:[0,4],puthead:0,putrequest:0,pyfil:0,pystack:0,python3:1,python:[0,1,3,6],q1z7g:3,q7s4tn1z:4,qbcrdaoxdj0ulwytauev:4,qin7ujpkou61cn7h8dvhr8yw9:4,qjpbezwdp7gjfzfatqitesymwo3i:4,qlen:1,qppdzt3ykfmg2lzytaam1czvb6rbnrjjp2zrpbwn:3,qtm0ddmm:3,quarante:5,queri:1,quiet_genparam_callback:0,quit:[2,3,4],quvxinaxygqco9lzdw6hudk8:4,qya6adywgbghr9jkhwn5gsdu7bwx:4,rais:[0,1,4,5],rand:[2,4,6],rand_add:0,rand_byt:0,rand_file_nam:0,rand_pseudo_byt:0,rand_rang:0,rand_se:0,rand_statu:0,randfil:0,randfnam:0,random:[0,4],randpool:[2,4],rang:0,rather:1,rc4:6,rc4_free:0,rdn:0,reactor:1,read:[0,1,2,3,4,5],read_al:0,readabl:0,readbio:1,readi:[1,3,4],readlin:0,real:0,realiz:1,reason:[0,1],recal:4,receipt:1,receiv:[1,4],recent:4,recipi:4,recipient_kei:4,recommend:[0,1,5],record:5,recreat:4,recv:1,recv_into:1,refcount:[0,1],refer:[0,1,2],regex:0,regular:0,reject:1,relativedistinguishednam:0,releas:0,reli:[0,1],remot:1,remov:1,remove_sess:1,renam:[3,4],render:4,renegoti:1,repli:2,repres:[0,1],represent:0,repudi:4,req:[0,3,4],request:[0,1,3,4],request_bodi:0,requesthandlerclass:1,requir:[0,1,5],rescorla:5,reserv:[0,1],reset:0,reset_context:0,resid:1,resolv:2,respect:[0,1],rest:0,result:[0,1,4],ret:[1,3],retriev:[0,4],reus:1,revoc:0,rfc:[0,4],rgwnkxpj:4,right:[0,1,4],ripemd160:0,rm2htgotm2lmore4geotypi5f1fbi:3,rn9vpy0suy8:3,rnd:0,root:5,routin:[1,4],rsa:[1,2,3,4,5,6],rsa_error:0,rsa_pub:0,rsaencrypt:[3,4],rsaerror:0,rsassa:0,rudimentari:5,run:[0,2,4],rwb:0,rwniyh0aw4xyyhhit:4,s0ovoc041cerazqfm2tl:4,safe:0,sai:4,said:[0,4],salt:0,salt_len:0,salt_length:0,same:[0,1,5],sat:[2,3],save:[0,4],save_fil:[0,4],save_kei:0,save_key_bio:0,save_key_d:0,save_key_der_bio:0,save_param:0,save_params_bio:0,save_pem:0,save_pub_kei:0,save_pub_key_bio:0,saver:4,sc3lsmhugu9xc26ogstjmkquiah:3,sc51hkebgckl1:4,scope:4,scopeid:1,screen:[2,4],script:5,search:6,sec:1,second:[0,1,5],secret:3,section:[3,4],secur:[0,1,3,4],see:[0,1,2,5],seed:[0,2,4],seek:0,seldom:0,select:[1,2,4],self:[0,1,3,4],send:[0,1,2,5],sendal:1,sender:4,sendmail:4,sendsmim:4,sens:1,sent:[0,1,3,4],sequenc:0,seri:4,serial:[0,3,4],serialnumb:0,serv:2,server:[0,1,2,3,4,5],server_address:[1,5],serverpostconnectioncheck:1,servic:[1,4],session:[0,6],session_data_manag:2,set1_host:1,set:[0,1,3,4,5],set_accept_st:1,set_allow_unknown_ca:1,set_bio:1,set_ciph:[0,4],set_cipher_list:1,set_client_ca_list_from_context:1,set_client_ca_list_from_fil:1,set_connect_st:1,set_crit:0,set_data:0,set_datetim:0,set_default:0,set_default_verify_path:1,set_info_callback:1,set_issu:0,set_issuer_nam:0,set_kei:0,set_mod:1,set_not_aft:0,set_not_befor:0,set_object:0,set_opt:1,set_pad:0,set_param:0,set_post_connection_check_callback:1,set_pubkei:0,set_serial_numb:0,set_sess:[0,1],set_session_cache_mod:1,set_session_id_ctx:1,set_session_timeout:1,set_shutdown:1,set_socket_read_timeout:1,set_socket_write_timeout:1,set_ssl:0,set_ssl_close_flag:1,set_str:0,set_subject:0,set_subject_nam:0,set_tim:[0,1],set_timeout:1,set_tlsext_host_nam:1,set_tmp_dh:1,set_tmp_dh_callback:1,set_tmp_rsa:1,set_tmp_rsa_callback:1,set_verifi:[1,5],set_verify_cb:0,set_vers:0,set_x509_stack:[0,4],set_x509_stor:[0,4],setblock:1,setsockopt:1,settimeout:1,setup_addr:1,setup_ssl:1,sever:[0,1,3],sfl_home:4,sfqo6lc9mtsj7fjydq:4,sha1:[0,1,4],sha224:0,sha256:0,sha:0,shall:[2,4],share:0,should:[0,1,3],should_read:0,should_retri:0,should_writ:0,show:0,shown:[2,5],shut:1,shutdown:1,sid_ctx:1,side:[0,1,5],sign:[0,3],sign_asn1:0,sign_dsa:0,sign_dsa_asn1:0,sign_fin:0,sign_init:0,sign_rsassa_pss:0,sign_upd:0,signal:0,signatur:[0,3,4],signer:4,signer_kei:4,signific:[0,1],similar:[1,2,3,4],simpl:[0,1,5],simpli:0,sinc:[0,3,5],singl:0,siong:[0,1,2,3,4,5],sipba4ik5xcrlt9e0s2qjgrvo9gyfaqz:4,site:3,situat:3,size:[0,1],sizehint:0,sjai4kpfvt00xfnvgluywyeks9sygto7hihnqkcf44f5lyv6ntfwmfqb11daty9v:4,skip:4,skip_accept_encod:0,skip_host:0,skunk:2,smartcard:0,smime:6,smime_error:[0,4],smime_load_pkcs7:[0,4],smime_load_pkcs7_bio:[0,4],smtpd:4,smtplib:4,sni:1,sntelhcawulwtifz:4,so_:1,sock:1,socket:[0,1,5],socketserv:1,softwar:4,sol_socket:1,sol_tcp:1,some:[1,3,4],sopath:0,sophist:5,sourc:[0,1,4,5],space:0,specif:[1,3,5],specifi:[0,1],spoofer:4,sport:5,src:2,ssl:[0,2,3,4,6],ssl_:1,ssl_cert_dir:1,ssl_cert_fil:1,ssl_connect:1,ssl_context:[0,1],ssl_ctx:0,ssl_ctx_flush_sess:1,ssl_ctx_ptr:1,ssl_ctx_set_opt:1,ssl_ctx_set_session_cache_mod:1,ssl_ctx_set_timeout:1,ssl_dispatch:[0,6],ssl_get_default_timeout:1,ssl_get_error:1,ssl_info_callback:1,ssl_ptr:1,ssl_received_shutdown:1,ssl_sent_shutdown:1,ssl_sess_cache_:1,ssl_transport:[0,2],ssl_verify_callback:1,ssl_verify_callback_allow_unknown_ca:1,ssl_verify_callback_stub:1,sslbio:0,sslerror:[0,1],sslserver:[0,6],ssltimeouterror:1,sslv3:[1,5],sslverificationerror:1,stack:[0,1],stack_of:1,stamp:4,standard:[0,4],standard_error_messag:2,standard_html_foot:2,standard_html_head:2,standard_templ:2,start:[0,1,2,3,4],startpassthrough:1,starttl:1,state:[0,1,3,4],stateorprovincenam:0,statu:[0,1],stderr:1,stdout:[0,5],step:[3,4,5],steve:3,still:1,stop:[1,2],store:[0,1],str:1,stream:0,strict:0,string:[0,1,2,4],stringio:[4,5],strong:0,struct:1,struct_siz:1,struct_to_timeout:1,structur:[0,1],style:1,subclass:0,subject:[0,3,4],subjectaltnam:[0,5],subjectnam:0,subpackag:6,subsequ:5,substitut:4,succeed:[0,1,2],success:[0,1],successfulli:1,suffici:0,suggest:0,suit:1,suitabl:[0,5],sun:2,suppli:[0,1],support:[0,1,5],suppos:4,sure:0,surnam:0,symbol:1,symmetr:[0,4,5],sync:0,sys:4,system:[1,2,3,4],sztm5jrp2zw:4,t6lqehb32wfyxqbkfxfjsxzsxox3r:4,take:1,target:[0,2,4],tb7k3chfgw5wagwnll8lb:3,tcp:[1,5],tcpserver:1,tell:[0,5],temp_fold:2,temporari:[1,4],termin:1,test:[0,1,4,5],test_ssl:5,text:[0,2,3,4],text_crlf:0,text_crlf_bio:0,text_nam:0,textiowrapp:0,textual:5,than:[0,1,5],thei:[0,1,4,5],them:[0,4,5],therefor:1,thi:[0,1,2,3,4,5],third:5,those:5,thread:6,threadingmixin:1,threadingsslserv:1,threat:[3,4],through:[0,1,3,4],thu:[0,4],thusli:[2,4],time:[0,1,2,4,5],timedelta:0,timeo:1,timeout:[0,6],titl:2,tlfgl4hdk2gyzxafuqzwiurz:4,tls:1,tlsprotocolwrapp:1,tmp:4,tmp_bio:4,to_addr:4,to_cert:4,tob:4,togeth:1,toivonen:[1,5],too:5,tool:3,top:[0,2,4],topic:3,trace:0,traceback:[1,4],traffic:5,transfer:[0,4],transform:4,translat:1,transport:0,treat:1,tri:[1,5],tripl:4,trust:4,tue:2,tunnel:0,tupl:[0,1],tvtk:4,twice:1,twist:[1,5],twistedprotocolwrapp:[0,6],two:[0,1,5],tws5k:3,txt:5,type:[0,1,2,3,4],typic:[1,4,5],tzinfo:0,tzname:0,tzsznk2qwgvsspos9mhuaepbnjmnbffbrulhrutsglm:4,u4dmyq9uxs421en3v2hkvhvdy8ut2ot29:4,u4j2f34u0xktwcp:4,u7rqbwpc9hr34saprs3ubbculet748kecbx247imbtidctzxcc1o86:4,ubowzitegtyli52:4,uifxaf6s4n2uihvp6tqxthejtpzoc7pc:4,ukidkhst60v2q9kegpzgfpoztskm:4,ull4d2cldx9ovynykwdezb5dyv0r:4,unattend:3,uncertainti:0,under:4,under_bio:0,underli:[0,1,5],understand:4,unencrypt:[3,4],uniqu:0,unit:[1,3,4],unix:1,unknow:0,unknown:[0,1],unless:0,unlock:0,unmix3:0,unmix:0,unpack:2,unpredict:0,unsaf:0,unset_ciph:0,unset_kei:0,unset_x509_stack:0,unset_x509_stor:0,until:[1,3],untouch:1,untrust:2,updat:[0,3],upon:1,upper:0,urandom:2,urbfke2mocdxvdzxbmd:4,url:[0,2],urllib:[0,2],uryvak7vfoldaz6z3nosoi6nonnehpr:4,usag:4,use:[0,1,2,3,4,5],used:[0,1,3,4],useful:1,useless:5,user:[0,4],user_ag:0,usernam:0,uses:[0,4,5],using:[0,1,3,4],usr:[3,4],usual:[0,1,5],utc:0,utcoffset:0,utf:0,utifsh4jkkm:4,util:[5,6],utilerror:0,uweuasngtkpjv2jyumd3hwqox2q3cd4zgqvjj6gf3exa5126ckf:3,uwrgu5shra8oncm0cdxej0kpf3cfnjhffb8hwmzi4uegnmfxqnsxogz:4,v_asn1_ia5str:0,valid:[0,1,3,4,5],valu:[0,1,3,4],valueerror:0,variabl:[0,1],variou:[1,5],verbos:0,veri:[0,1],verif:[0,1,4],verifi:[0,1,2,3],verify_asn1:0,verify_dsa:0,verify_dsa_asn1:0,verify_fail_if_no_peer_cert:[1,5],verify_fin:0,verify_init:0,verify_ok:1,verify_p:[1,5],verify_rsassa_pss:0,verify_upd:0,verisign:4,version:[0,1,3,4,5],vhgdittnelgthbaezu5rhdswgdelvbp:4,vi4roin:3,via:[0,1],viega:5,vihhfc1zzp:3,visual:0,vkwwecqqdkeu:3,vsgprqx2:4,vsxc7xx7xo:4,vtajp:3,vuzalydffdfutiqqzys4z:4,w4d1nnwu8agcpyshsexhc:3,w81xodtq2ecjxc8fn2wpa9y5vd1lt7ojksoul1:3,wai:[1,4],wait:1,walk:3,warn:[0,1,2],wbal2p:4,wdd1ar2k4k3gai7kkgobwt0:4,wdigqewjl:3,weak:5,weak_crypto:1,web:[2,4],well:[0,1,2,4],were:[0,1],west:0,what:[0,3,4],when:[0,1,3,4,5],whenev:1,where:[0,1,3],wherea:[0,5],whether:[0,4],which:[0,1,3,4,5],who:4,whose:0,why:4,widgit:[3,4],width:2,window:[2,4],wish:[2,3,4],within:[1,3,5],without:0,wjtpvp0yobmju4vmkezi405r7o8oewi:3,wkat:4,wmbgsclvwsfzcccjhavw9nhfmucnrdwxaymvetnuon:4,won:1,word:4,work:[0,1,2,3,4,5],world:1,would:[0,1,4],wrap:4,wrappedprotocol:1,wrapper:[0,1,5],write:[0,1,3,4],write_bio:1,write_clos:0,write_d:0,writeabl:0,writebio:1,writesequ:1,written:[0,3,5],wrongcertif:1,wronghost:1,wrylp3:4,wsluvo:3,www:[0,2,4],wyhfg8g3biehurpj2v:4,x509:[3,4,5,6],x509_ext:0,x509_ext_ptr:0,x509_extens:0,x509_extension_stack:0,x509_name:[0,1],x509_name_entri:0,x509_ptr:1,x509_purpose_:0,x509_stack:[0,4],x509_store:[0,4],x509_store_context:0,x509_store_ctx:0,x509_store_default_cb:0,x509_store_set_verify_cb:0,x509error:0,x509v3:[3,4],xc9dtimuutxtxlgytb0ujkbnsoaenolm:4,xekaxcmzegp0b6camwfmuqrbvgxbbncqkc:4,xgffb0okilylmwv2bf6:4,xisnot:4,xlcqyvk1tzhd:4,xlyg6hhzzgbfyyngj2y7ymz1rl1m8snrnmkcyskgtrudenf6wt9:4,xmlrpc:0,xmtdg:4,y3klvhk09yl6d:4,y9mh7efw:4,year:[3,4],yet:1,yl9qevh1pp2zvswq12p7gjt3t:4,you:[0,1,2,3,4,5],your:[0,2,4,6],ypfxy:3,yqor8jggsuzroyjqhj:4,yrpzcwq3gxahuj:3,yubj33ylmpjgngijlnolfy0hnw7tmwqr:4,ywmxnjz8:4,z04ovaeue4x0swm17hlbm2kvt:3,z2s:2,z6ebh:3,z6uxrm:4,zbq:3,zbxscvldasmckg:3,zero:0,zhttp_handler:2,zhttp_server:2,zhttps_handler:2,zhttps_server:2,zip:2,zone:0,zope:[2,4],zopebutton:2,zovnycmv1cintpalaw4bwtxnhcdvthavdy34okhemzncg:3,zpecllwhxd4b1auaiaargkl935u:4,zpqqqzkq:3,zserver:2,zserverssl:6,zssl:2,zsyncer:2,ztf6mpxjsixi6l4zyxebs6yhf:4,zw50msqwigyjkozihvcnaqkbfhvyzwnpcgllbnrazxhhbxbszs5kb20caqawdqyj:4,zw5kzxixitafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbtcbnzanbgkq:4,zwxy:4,zxhhbxbszs5kb20whhcnmdewmzmxmte0mdmzwhcnmdiwmzmxmte0mdmzwjbbmqsw:4},titles:["M2Crypto Package","SSL Package","1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO","HOWTO: Creating your own CA with OpenSSL","HOWTO: Programming S/MIME in Python with M2Crypto","HOWTO: Programming SSL in Python with M2Crypto","Welcome to M2Crypto\u2019s documentation!"],titleterms:{The:3,asn1:0,authcooki:0,bio:0,bit:5,callback:0,certif:4,checker:1,cipher:1,code:5,conclus:[2,3],connect:1,content:2,context:1,creat:3,decrypt:4,document:6,dsa:0,encrypt:4,engin:0,err:0,evp:0,ftpslib:0,histori:5,howto:[2,3,4,5,6],http:2,httpslib:0,indic:6,instal:2,interoper:4,introduct:[2,3,4,5],kei:4,m2crypto:[0,2,4,5,6],m2urllib2:0,m2urllib:0,m2xmlrpclib:0,messag:4,messeng:4,microsoft:4,mime:4,modul:[0,1],netscap:4,openssl:3,origin:4,outlook:4,over:2,own:3,packag:[0,1],prepar:2,procedur:3,program:[4,5],python:[2,4,5],rand:0,rc4:0,resourc:4,rsa:0,sampl:5,secur:5,send:4,session:1,sign:4,smime:[0,4],smtp:4,sourc:2,ssl:[1,5],ssl_dispatch:1,ssldump:5,sslserver:1,subpackag:0,tabl:6,test:2,thread:0,timeout:1,twistedprotocolwrapp:1,util:0,verifi:4,via:4,webdav:2,welcom:6,x509:0,xmlrpc:2,your:3,zserverssl:2,zsmime:4}}) \ No newline at end of file