<!DOCTYPE html> <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>httpretty.core — HTTPretty 0.9.6 documentation</title> <script type="text/javascript" src="../../_static/js/modernizr.min.js"></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/js/theme.js"></script> <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="../../genindex.html" /> <link rel="search" title="Search" href="../../search.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="../../index.html" class="icon icon-home"> HTTPretty </a> <div class="version"> 0.9.6 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> <ul> <li class="toctree-l1"><a class="reference internal" href="../../introduction.html">What is HTTPretty ?</a></li> <li class="toctree-l1"><a class="reference internal" href="../../introduction.html#demo">Demo</a></li> <li class="toctree-l1"><a class="reference internal" href="../../introduction.html#motivation">Motivation</a></li> <li class="toctree-l1"><a class="reference internal" href="../../acks.html">Acknowledgements</a></li> <li class="toctree-l1"><a class="reference internal" href="../../api.html">API Reference</a></li> <li class="toctree-l1"><a class="reference internal" href="../../api.html#modules">Modules</a></li> <li class="toctree-l1"><a class="reference internal" href="../../contributing.html">Hacking on HTTPretty</a></li> <li class="toctree-l1"><a class="reference internal" href="../../contributing.html#license">License</a></li> <li class="toctree-l1"><a class="reference internal" href="../../contributing.html#main-contributors">Main contributors</a></li> <li class="toctree-l1"><a class="reference internal" href="../../changelog.html">Release Notes</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <nav class="wy-nav-top" aria-label="top navigation"> <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="../../index.html">HTTPretty</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="breadcrumbs navigation"> <ul class="wy-breadcrumbs"> <li><a href="../../index.html">Docs</a> »</li> <li><a href="../index.html">Module code</a> »</li> <li><a href="../httpretty.html">httpretty</a> »</li> <li>httpretty.core</li> <li class="wy-breadcrumbs-aside"> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <h1>Source code for httpretty.core</h1><div class="highlight"><pre> <span></span><span class="c1"># #!/usr/bin/env python</span> <span class="c1"># -*- coding: utf-8 -*-</span> <span class="c1"># <HTTPretty - HTTP client mock for Python></span> <span class="c1"># Copyright (C) <2011-2018> Gabriel Falcao <gabriel@nacaolivre.org></span> <span class="c1">#</span> <span class="c1"># Permission is hereby granted, free of charge, to any person</span> <span class="c1"># obtaining a copy of this software and associated documentation</span> <span class="c1"># files (the "Software"), to deal in the Software without</span> <span class="c1"># restriction, including without limitation the rights to use,</span> <span class="c1"># copy, modify, merge, publish, distribute, sublicense, and/or sell</span> <span class="c1"># copies of the Software, and to permit persons to whom the</span> <span class="c1"># Software is furnished to do so, subject to the following</span> <span class="c1"># conditions:</span> <span class="c1">#</span> <span class="c1"># The above copyright notice and this permission notice shall be</span> <span class="c1"># included in all copies or substantial portions of the Software.</span> <span class="c1">#</span> <span class="c1"># THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,</span> <span class="c1"># EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES</span> <span class="c1"># OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</span> <span class="c1"># NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT</span> <span class="c1"># HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,</span> <span class="c1"># WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</span> <span class="c1"># FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR</span> <span class="c1"># OTHER DEALINGS IN THE SOFTWARE.</span> <span class="kn">from</span> <span class="nn">__future__</span> <span class="k">import</span> <span class="n">unicode_literals</span> <span class="kn">import</span> <span class="nn">codecs</span> <span class="kn">import</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="nn">hashlib</span> <span class="kn">import</span> <span class="nn">inspect</span> <span class="kn">import</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="nn">json</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">tempfile</span> <span class="kn">import</span> <span class="nn">threading</span> <span class="kn">import</span> <span class="nn">traceback</span> <span class="kn">import</span> <span class="nn">warnings</span> <span class="kn">from</span> <span class="nn">functools</span> <span class="k">import</span> <span class="n">partial</span> <span class="kn">from</span> <span class="nn">.compat</span> <span class="k">import</span> <span class="p">(</span> <span class="n">PY3</span><span class="p">,</span> <span class="n">StringIO</span><span class="p">,</span> <span class="n">text_type</span><span class="p">,</span> <span class="n">binary_type</span><span class="p">,</span> <span class="n">BaseClass</span><span class="p">,</span> <span class="n">BaseHTTPRequestHandler</span><span class="p">,</span> <span class="n">quote</span><span class="p">,</span> <span class="n">quote_plus</span><span class="p">,</span> <span class="n">urlencode</span><span class="p">,</span> <span class="n">encode_obj</span><span class="p">,</span> <span class="n">urlunsplit</span><span class="p">,</span> <span class="n">urlsplit</span><span class="p">,</span> <span class="n">parse_qs</span><span class="p">,</span> <span class="n">unquote_utf8</span><span class="p">,</span> <span class="n">ClassTypes</span><span class="p">,</span> <span class="n">basestring</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">.http</span> <span class="k">import</span> <span class="p">(</span> <span class="n">STATUSES</span><span class="p">,</span> <span class="n">HttpBaseClass</span><span class="p">,</span> <span class="n">parse_requestline</span><span class="p">,</span> <span class="n">last_requestline</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">.utils</span> <span class="k">import</span> <span class="p">(</span> <span class="n">utf8</span><span class="p">,</span> <span class="n">decode_utf8</span><span class="p">,</span> <span class="p">)</span> <span class="kn">from</span> <span class="nn">.errors</span> <span class="k">import</span> <span class="n">HTTPrettyError</span><span class="p">,</span> <span class="n">UnmockedError</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span> <span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span> <span class="kn">from</span> <span class="nn">errno</span> <span class="k">import</span> <span class="n">EAGAIN</span> <span class="n">old_socket</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="n">old_SocketType</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketType</span> <span class="n">old_create_connection</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">create_connection</span> <span class="n">old_gethostbyname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span> <span class="n">old_gethostname</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span> <span class="n">old_getaddrinfo</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span> <span class="n">old_socksocket</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">old_ssl_wrap_socket</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">old_sslwrap_simple</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">old_sslsocket</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">old_sslcontext_wrap_socket</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">MULTILINE_ANY_REGEX</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="s1">'.*'</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">M</span><span class="p">)</span> <span class="n">hostname_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="s1">'\^?(?:https?://)?[^:/]*[:/]?'</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># pragma: no cover</span> <span class="kn">import</span> <span class="nn">socks</span> <span class="n">old_socksocket</span> <span class="o">=</span> <span class="n">socks</span><span class="o">.</span><span class="n">socksocket</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="n">socks</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">try</span><span class="p">:</span> <span class="c1"># pragma: no cover</span> <span class="kn">import</span> <span class="nn">ssl</span> <span class="n">old_ssl_wrap_socket</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="k">try</span><span class="p">:</span> <span class="n">old_sslcontext_wrap_socket</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLContext</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">PY3</span><span class="p">:</span> <span class="n">old_sslwrap_simple</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">sslwrap_simple</span> <span class="n">old_sslsocket</span> <span class="o">=</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLSocket</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1"># pragma: no cover</span> <span class="n">ssl</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">requests.packages.urllib3.connection</span> <span class="k">as</span> <span class="nn">requests_urllib3_connection</span> <span class="n">old_requests_ssl_wrap_socket</span> <span class="o">=</span> <span class="n">requests_urllib3_connection</span><span class="o">.</span><span class="n">ssl_wrap_socket</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="n">requests_urllib3_connection</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">DEFAULT_HTTP_PORTS</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">([</span><span class="mi">80</span><span class="p">])</span> <span class="n">POTENTIAL_HTTP_PORTS</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">DEFAULT_HTTP_PORTS</span><span class="p">)</span> <span class="n">DEFAULT_HTTPS_PORTS</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">([</span><span class="mi">443</span><span class="p">])</span> <span class="n">POTENTIAL_HTTPS_PORTS</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">DEFAULT_HTTPS_PORTS</span><span class="p">)</span> <span class="k">def</span> <span class="nf">FALLBACK_FUNCTION</span><span class="p">(</span><span class="n">x</span><span class="p">):</span> <span class="k">return</span> <span class="n">x</span> <div class="viewcode-block" id="HTTPrettyRequest"><a class="viewcode-back" href="../../api.html#httpretty.core.HTTPrettyRequest">[docs]</a><span class="k">class</span> <span class="nc">HTTPrettyRequest</span><span class="p">(</span><span class="n">BaseHTTPRequestHandler</span><span class="p">,</span> <span class="n">BaseClass</span><span class="p">):</span> <span class="sa">r</span><span class="sd">"""</span> <span class="sd"> Represents a HTTP request. It takes a valid multi-line,</span> <span class="sd"> ``\r\n`` separated string with HTTP headers and parse them out using</span> <span class="sd"> the internal `parse_request` method.</span> <span class="sd"> It also replaces the `rfile` and `wfile` attributes with StringIO</span> <span class="sd"> instances so that we guarantee that it won't make any I/O, neighter</span> <span class="sd"> for writing nor reading.</span> <span class="sd"> It has some convenience attributes:</span> <span class="sd"> ``headers`` -> a mimetype object that can be cast into a dictionary,</span> <span class="sd"> contains all the request headers</span> <span class="sd"> ``method`` -> the HTTP method used in this request</span> <span class="sd"> ``querystring`` -> a dictionary containing lists with the</span> <span class="sd"> attributes. Please notice that if you need a single value from a</span> <span class="sd"> query string you will need to get it manually like:</span> <span class="sd"> ``body`` -> the request body as a string</span> <span class="sd"> ``parsed_body`` -> the request body parsed by ``parse_request_body``</span> <span class="sd"> .. testcode::</span> <span class="sd"> >>> request.querystring</span> <span class="sd"> {'name': ['Gabriel Falcao']}</span> <span class="sd"> >>> print request.querystring['name'][0]</span> <span class="sd"> """</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">headers</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span> <span class="c1"># first of all, lets make sure that if headers or body are</span> <span class="c1"># unicode strings, it must be converted into a utf-8 encoded</span> <span class="c1"># byte string</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_headers</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="n">headers</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> <span class="bp">self</span><span class="o">.</span><span class="n">_body</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="c1"># Now let's concatenate the headers with the body, and create</span> <span class="c1"># `rfile` based on it</span> <span class="bp">self</span><span class="o">.</span><span class="n">rfile</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="sa">b</span><span class="s1">'</span><span class="se">\r\n\r\n</span><span class="s1">'</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">raw_headers</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">]))</span> <span class="c1"># Creating `wfile` as an empty StringIO, just to avoid any</span> <span class="c1"># real I/O calls</span> <span class="bp">self</span><span class="o">.</span><span class="n">wfile</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span> <span class="c1"># parsing the request line preemptively</span> <span class="bp">self</span><span class="o">.</span><span class="n">raw_requestline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rfile</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span> <span class="c1"># initiating the error attributes with None</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_code</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">error_message</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Parse the request based on the attributes above</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_request</span><span class="p">():</span> <span class="k">return</span> <span class="c1"># making the HTTP method string available as the command</span> <span class="bp">self</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">command</span> <span class="c1"># Now 2 convenient attributes for the HTTPretty API:</span> <span class="c1"># `querystring` holds a dictionary with the parsed query string</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'iso-8859-1'</span><span class="p">)</span> <span class="k">except</span> <span class="ne">UnicodeDecodeError</span><span class="p">:</span> <span class="k">pass</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="n">qstring</span> <span class="o">=</span> <span class="bp">self</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="s2">"?"</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="bp">self</span><span class="o">.</span><span class="n">querystring</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_querystring</span><span class="p">(</span><span class="n">qstring</span><span class="p">)</span> <span class="c1"># And the body will be attempted to be parsed as</span> <span class="c1"># `application/json` or `application/x-www-form-urlencoded`</span> <span class="sd">"""a dictionary containing parsed request body or None if</span> <span class="sd"> HTTPrettyRequest doesn't know how to parse it. It currently</span> <span class="sd"> supports parsing body data that was sent under the</span> <span class="sd"> ``content`-type` headers values: ``application/json`` or</span> <span class="sd"> ``application/x-www-form-urlencoded``</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsed_body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_request_body</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_body</span><span class="p">)</span> <span class="nd">@property</span> <span class="k">def</span> <span class="nf">body</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">_body</span> <span class="nd">@body</span><span class="o">.</span><span class="n">setter</span> <span class="k">def</span> <span class="nf">body</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="bp">self</span><span class="o">.</span><span class="n">_body</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="c1"># And the body will be attempted to be parsed as</span> <span class="c1"># `application/json` or `application/x-www-form-urlencoded`</span> <span class="bp">self</span><span class="o">.</span><span class="n">parsed_body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_request_body</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_body</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">raw_headers</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="n">tmpl</span> <span class="o">=</span> <span class="s1">'<HTTPrettyRequest("</span><span class="si">{}</span><span class="s1">", total_headers=</span><span class="si">{}</span><span class="s1">, body_length=</span><span class="si">{}</span><span class="s1">)>'</span> <span class="k">return</span> <span class="n">tmpl</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">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'content-type'</span><span class="p">,</span> <span class="s1">''</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">headers</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">body</span><span class="p">),</span> <span class="p">)</span> <div class="viewcode-block" id="HTTPrettyRequest.parse_querystring"><a class="viewcode-back" href="../../api.html#httpretty.core.HTTPrettyRequest.parse_querystring">[docs]</a> <span class="k">def</span> <span class="nf">parse_querystring</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qs</span><span class="p">):</span> <span class="sd">"""parses an UTF-8 encoded query string into a dict of string lists</span> <span class="sd"> :param qs: a querystring</span> <span class="sd"> :returns: a dict of lists</span> <span class="sd"> """</span> <span class="n">expanded</span> <span class="o">=</span> <span class="n">unquote_utf8</span><span class="p">(</span><span class="n">qs</span><span class="p">)</span> <span class="n">parsed</span> <span class="o">=</span> <span class="n">parse_qs</span><span class="p">(</span><span class="n">expanded</span><span class="p">)</span> <span class="n">result</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">parsed</span><span class="p">:</span> <span class="n">result</span><span class="p">[</span><span class="n">k</span><span class="p">]</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">decode_utf8</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="k">return</span> <span class="n">result</span></div> <div class="viewcode-block" id="HTTPrettyRequest.parse_request_body"><a class="viewcode-back" href="../../api.html#httpretty.core.HTTPrettyRequest.parse_request_body">[docs]</a> <span class="k">def</span> <span class="nf">parse_request_body</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">body</span><span class="p">):</span> <span class="sd">"""Attempt to parse the post based on the content-type passed.</span> <span class="sd"> Return the regular body if not</span> <span class="sd"> :param body: string</span> <span class="sd"> :returns: a python object such as dict or list in case the deserialization suceeded. Else returns the given param ``body``</span> <span class="sd"> """</span> <span class="n">PARSING_FUNCTIONS</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'application/json'</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">,</span> <span class="s1">'text/json'</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">,</span> <span class="s1">'application/x-www-form-urlencoded'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_querystring</span><span class="p">,</span> <span class="p">}</span> <span class="n">content_type</span> <span class="o">=</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="s1">'content-type'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span> <span class="n">do_parse</span> <span class="o">=</span> <span class="n">PARSING_FUNCTIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">content_type</span><span class="p">,</span> <span class="n">FALLBACK_FUNCTION</span><span class="p">)</span> <span class="k">try</span><span class="p">:</span> <span class="n">body</span> <span class="o">=</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="k">return</span> <span class="n">do_parse</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="k">except</span> <span class="p">(</span><span class="ne">Exception</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">):</span> <span class="k">return</span> <span class="n">body</span></div></div> <div class="viewcode-block" id="EmptyRequestHeaders"><a class="viewcode-back" href="../../api.html#httpretty.core.EmptyRequestHeaders">[docs]</a><span class="k">class</span> <span class="nc">EmptyRequestHeaders</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span> <span class="sd">"""A dict subclass used as internal representation of empty request</span> <span class="sd"> headers</span> <span class="sd"> """</span></div> <div class="viewcode-block" id="HTTPrettyRequestEmpty"><a class="viewcode-back" href="../../api.html#httpretty.core.HTTPrettyRequestEmpty">[docs]</a><span class="k">class</span> <span class="nc">HTTPrettyRequestEmpty</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""Represents an empty :py:class:`~httpretty.core.HTTPrettyRequest`</span> <span class="sd"> where all its properties are somehow empty or ``None``</span> <span class="sd"> """</span> <span class="n">method</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">url</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">body</span> <span class="o">=</span> <span class="s1">''</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">EmptyRequestHeaders</span><span class="p">()</span></div> <div class="viewcode-block" id="FakeSockFile"><a class="viewcode-back" href="../../api.html#httpretty.core.FakeSockFile">[docs]</a><span class="k">class</span> <span class="nc">FakeSockFile</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""Fake socket file descriptor. Under the hood all data is written in</span> <span class="sd"> a temporary file, giving it a real file descriptor number.</span> <span class="sd"> """</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">file</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">TemporaryFile</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="k">def</span> <span class="nf">getvalue</span><span class="p">(</span><span class="bp">self</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">file</span><span class="p">,</span> <span class="s1">'getvalue'</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="o">.</span><span class="n">getvalue</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">file</span><span class="o">.</span><span class="n">read</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">socket</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">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="k">def</span> <span class="nf">fileno</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">_fileno</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="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div> <div class="viewcode-block" id="FakeSSLSocket"><a class="viewcode-back" href="../../api.html#httpretty.core.FakeSSLSocket">[docs]</a><span class="k">class</span> <span class="nc">FakeSSLSocket</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""Shorthand for :py:class:`~httpretty.core.fakesock`</span> <span class="sd"> """</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">sock</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">kw</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_httpretty_sock</span> <span class="o">=</span> <span class="n">sock</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="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_httpretty_sock</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span></div> <div class="viewcode-block" id="fakesock"><a class="viewcode-back" href="../../api.html#httpretty.core.fakesock">[docs]</a><span class="k">class</span> <span class="nc">fakesock</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> fake :py:mod:`socket`</span> <span class="sd"> """</span> <div class="viewcode-block" id="fakesock.socket"><a class="viewcode-back" href="../../api.html#httpretty.core.fakesock.socket">[docs]</a> <span class="k">class</span> <span class="nc">socket</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""drop-in replacement for :py:class:`socket.socket`</span> <span class="sd"> """</span> <span class="n">_entry</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">debuglevel</span> <span class="o">=</span> <span class="mi">0</span> <span class="n">_sent_data</span> <span class="o">=</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">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="nb">type</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="mi">0</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="bp">self</span><span class="o">.</span><span class="n">truesock</span> <span class="o">=</span> <span class="p">(</span><span class="n">old_socket</span><span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">protocol</span><span class="p">)</span> <span class="k">if</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">allow_net_connect</span> <span class="k">else</span> <span class="kc">None</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closed</span> <span class="o">=</span> <span class="kc">True</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span> <span class="o">=</span> <span class="n">FakeSockFile</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">_sock</span> <span class="ow">or</span> <span class="bp">self</span> <span class="bp">self</span><span class="o">.</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="bp">self</span><span class="o">.</span><span class="n">_sock</span> <span class="o">=</span> <span class="n">_sock</span> <span class="ow">or</span> <span class="bp">self</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span> <span class="o">=</span> <span class="mi">1024</span> <span class="k">def</span> <span class="nf">getpeercert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="n">shift</span> <span class="o">=</span> <span class="n">now</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">30</span> <span class="o">*</span> <span class="mi">12</span><span class="p">)</span> <span class="k">return</span> <span class="p">{</span> <span class="s1">'notAfter'</span><span class="p">:</span> <span class="n">shift</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%b </span><span class="si">%d</span><span class="s1"> %H:%M:%S GMT'</span><span class="p">),</span> <span class="s1">'subjectAltName'</span><span class="p">:</span> <span class="p">(</span> <span class="p">(</span><span class="s1">'DNS'</span><span class="p">,</span> <span class="s1">'*.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_host</span><span class="p">),</span> <span class="p">(</span><span class="s1">'DNS'</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="p">(</span><span class="s1">'DNS'</span><span class="p">,</span> <span class="s1">'*'</span><span class="p">),</span> <span class="p">),</span> <span class="s1">'subject'</span><span class="p">:</span> <span class="p">(</span> <span class="p">(</span> <span class="p">(</span><span class="s1">'organizationName'</span><span class="p">,</span> <span class="s1">'*.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_host</span><span class="p">),</span> <span class="p">),</span> <span class="p">(</span> <span class="p">(</span><span class="s1">'organizationalUnitName'</span><span class="p">,</span> <span class="s1">'Domain Control Validated'</span><span class="p">),</span> <span class="p">),</span> <span class="p">(</span> <span class="p">(</span><span class="s1">'commonName'</span><span class="p">,</span> <span class="s1">'*.</span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_host</span><span class="p">),</span> <span class="p">),</span> <span class="p">),</span> <span class="p">}</span> <span class="k">def</span> <span class="nf">ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sock</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">kw</span><span class="p">):</span> <span class="k">return</span> <span class="n">sock</span> <span class="k">def</span> <span class="nf">setsockopt</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="n">optname</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="n">optname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">address</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closed</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">try</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_address</span> <span class="o">=</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="o">=</span> <span class="n">address</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="c1"># We get here when the address is just a string pointing to a</span> <span class="c1"># unix socket path/file</span> <span class="c1">#</span> <span class="c1"># See issue #206</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">else</span><span class="p">:</span> <span class="n">ports_to_check</span> <span class="o">=</span> <span class="p">(</span> <span class="n">POTENTIAL_HTTP_PORTS</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="n">POTENTIAL_HTTPS_PORTS</span><span class="p">))</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_port</span> <span class="ow">in</span> <span class="n">ports_to_check</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</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">_address</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnmockedError</span><span class="p">()</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span><span class="p">:</span> <span class="n">matcher</span> <span class="o">=</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">match_http_address</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="k">if</span> <span class="n">matcher</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">truesock</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">_address</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">def</span> <span class="nf">fileno</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">truesock</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">fileno</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</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">_connected_truesock</span> <span class="o">=</span> <span class="kc">False</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closed</span> <span class="o">=</span> <span class="kc">True</span> <div class="viewcode-block" id="fakesock.socket.makefile"><a class="viewcode-back" href="../../api.html#httpretty.core.fakesock.socket.makefile">[docs]</a> <span class="k">def</span> <span class="nf">makefile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'r'</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span> <span class="sd">"""Returns this fake socket's own tempfile buffer.</span> <span class="sd"> If there is an entry associated with the socket, the file</span> <span class="sd"> descriptor gets filled in with the entry data before being</span> <span class="sd"> returned.</span> <span class="sd"> """</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="o">=</span> <span class="n">mode</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span> <span class="o">=</span> <span class="n">bufsize</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="p">:</span> <span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span> <span class="n">target</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">fill_filekind</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="p">,)</span> <span class="p">)</span> <span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</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">timeout</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">else</span><span class="p">:</span> <span class="n">timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="n">t</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span> <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">isAlive</span><span class="p">():</span> <span class="k">raise</span> <span class="n">socket</span><span class="o">.</span><span class="n">timeout</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span></div> <div class="viewcode-block" id="fakesock.socket.real_sendall"><a class="viewcode-back" href="../../api.html#httpretty.core.fakesock.socket.real_sendall">[docs]</a> <span class="k">def</span> <span class="nf">real_sendall</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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span> <span class="sd">"""Sends data to the remote server. This method is called</span> <span class="sd"> when HTTPretty identifies that someone is trying to send</span> <span class="sd"> non-http data.</span> <span class="sd"> The received bytes are written in this socket's tempfile</span> <span class="sd"> buffer so that HTTPretty can return it accordingly when</span> <span class="sd"> necessary.</span> <span class="sd"> """</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnmockedError</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">data</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">kw</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_address</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="mi">443</span> <span class="ow">and</span> <span class="n">old_sslsocket</span><span class="p">:</span> <span class="n">sock</span> <span class="o">=</span> <span class="n">old_sslsocket</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">sock</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connected_truesock</span><span class="p">:</span> <span class="n">sock</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">_address</span><span class="p">)</span> <span class="n">sock</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="n">sock</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">data</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">kw</span><span class="p">)</span> <span class="n">should_continue</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">while</span> <span class="n">should_continue</span><span class="p">:</span> <span class="k">try</span><span class="p">:</span> <span class="n">received</span> <span class="o">=</span> <span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">received</span><span class="p">)</span> <span class="n">should_continue</span> <span class="o">=</span> <span class="nb">bool</span><span class="p">(</span><span class="n">received</span><span class="o">.</span><span class="n">strip</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="k">as</span> <span class="n">e</span><span class="p">:</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">EAGAIN</span><span class="p">:</span> <span class="k">continue</span> <span class="k">break</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></div> <span class="k">def</span> <span class="nf">sendall</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="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sent_data</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="bp">self</span><span class="o">.</span><span class="n">fd</span> <span class="o">=</span> <span class="n">FakeSockFile</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="bp">self</span> <span class="k">try</span><span class="p">:</span> <span class="n">requestline</span><span class="p">,</span> <span class="n">_</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="sa">b</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> <span class="n">method</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">version</span> <span class="o">=</span> <span class="n">parse_requestline</span><span class="p">(</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="n">requestline</span><span class="p">))</span> <span class="n">is_parsing_headers</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="n">path</span> <span class="o">=</span> <span class="s1">''</span> <span class="n">is_parsing_headers</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">_entry</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="c1"># If the previous request wasn't mocked, don't</span> <span class="c1"># mock the subsequent sending of data</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">real_sendall</span><span class="p">(</span><span class="n">data</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">kw</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="n">method</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">method</span> <span class="n">path</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">path</span> <span class="bp">self</span><span class="o">.</span><span class="n">fd</span><span class="o">.</span><span class="n">seek</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">is_parsing_headers</span><span class="p">:</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">_sent_data</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="n">last_requestline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sent_data</span><span class="p">))</span> <span class="n">meta</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">headers</span> <span class="n">body</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sent_data</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">meta</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'transfer-encoding'</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'chunked'</span><span class="p">:</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">body</span><span class="o">.</span><span class="n">isdigit</span><span class="p">()</span> <span class="ow">and</span> <span class="p">(</span><span class="n">body</span> <span class="o">!=</span> <span class="sa">b</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">body</span> <span class="o">!=</span> <span class="sa">b</span><span class="s1">'0</span><span class="se">\r\n\r\n</span><span class="s1">'</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="n">body</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="n">body</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">historify_request</span><span class="p">(</span><span class="n">headers</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span> <span class="k">return</span> <span class="c1"># path might come with</span> <span class="n">s</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> <span class="n">POTENTIAL_HTTP_PORTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">port</span> <span class="ow">or</span> <span class="mi">80</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="n">utf8</span><span class="p">,</span> <span class="n">data</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="sa">b</span><span class="s1">'</span><span class="se">\r\n\r\n</span><span class="s1">'</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">parts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span> <span class="n">headers</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="n">parts</span> <span class="k">else</span><span class="p">:</span> <span class="n">headers</span> <span class="o">=</span> <span class="s1">''</span> <span class="n">body</span> <span class="o">=</span> <span class="n">data</span> <span class="n">request</span> <span class="o">=</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">historify_request</span><span class="p">(</span><span class="n">headers</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span> <span class="n">info</span> <span class="o">=</span> <span class="n">URIInfo</span><span class="p">(</span> <span class="n">hostname</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_port</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="n">s</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="n">s</span><span class="o">.</span><span class="n">query</span><span class="p">,</span> <span class="n">last_request</span><span class="o">=</span><span class="n">request</span> <span class="p">)</span> <span class="n">matcher</span><span class="p">,</span> <span class="n">entries</span> <span class="o">=</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">match_uriinfo</span><span class="p">(</span><span class="n">info</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">entries</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">real_sendall</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_entry</span> <span class="o">=</span> <span class="n">matcher</span><span class="o">.</span><span class="n">get_next_entry</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">info</span><span class="p">,</span> <span class="n">request</span><span class="p">)</span> <span class="k">def</span> <span class="nf">debug</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">truesock_func</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_http</span><span class="p">:</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">stack</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="n">lines</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">utf8</span><span class="p">,</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_stack</span><span class="p">(</span><span class="n">frame</span><span class="p">)))</span> <span class="n">message</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"HTTPretty intercepted and unexpected socket method call."</span><span class="p">,</span> <span class="p">(</span><span class="s2">"Please open an issue at "</span> <span class="s2">"'https://github.com/gabrielfalcao/HTTPretty/issues'"</span><span class="p">),</span> <span class="s2">"And paste the following traceback:</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">decode_utf8</span><span class="p">(</span><span class="n">lines</span><span class="p">)),</span> <span class="p">]</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">message</span><span class="p">))</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnmockedError</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="o">.</span><span class="n">truesock</span><span class="p">,</span> <span class="n">truesock_func</span><span class="p">)(</span><span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</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">new_timeout</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">new_timeout</span> <span class="k">def</span> <span class="nf">send</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'send'</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">sendto</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'sendto'</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">recvfrom_into</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'recvfrom_into'</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">recv_into</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'recv_into'</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">recvfrom</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'recvfrom'</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">recv</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="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'recv'</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">__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="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">truesock</span><span class="p">:</span> <span class="k">raise</span> <span class="n">UnmockedError</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="o">.</span><span class="n">truesock</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div></div> <div class="viewcode-block" id="fake_wrap_socket"><a class="viewcode-back" href="../../api.html#httpretty.core.fake_wrap_socket">[docs]</a><span class="k">def</span> <span class="nf">fake_wrap_socket</span><span class="p">(</span><span class="n">orig_wrap_socket_fn</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">kw</span><span class="p">):</span> <span class="sd">"""drop-in replacement for py:func:`ssl.wrap_socket`</span> <span class="sd"> """</span> <span class="n">server_hostname</span> <span class="o">=</span> <span class="n">kw</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'server_hostname'</span><span class="p">)</span> <span class="k">if</span> <span class="n">server_hostname</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">matcher</span> <span class="o">=</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">match_https_hostname</span><span class="p">(</span><span class="n">server_hostname</span><span class="p">)</span> <span class="k">if</span> <span class="n">matcher</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span> <span class="n">orig_wrap_socket_fn</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">kw</span><span class="p">)</span> <span class="k">if</span> <span class="s1">'sock'</span> <span class="ow">in</span> <span class="n">kw</span><span class="p">:</span> <span class="k">return</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'sock'</span><span class="p">]</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div> <div class="viewcode-block" id="create_fake_connection"><a class="viewcode-back" href="../../api.html#httpretty.core.create_fake_connection">[docs]</a><span class="k">def</span> <span class="nf">create_fake_connection</span><span class="p">(</span> <span class="n">address</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">source_address</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""drop-in replacement for :py:func:`socket.create_connection`"""</span> <span class="n">s</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">IPPROTO_TCP</span><span class="p">)</span> <span class="k">if</span> <span class="n">timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">socket</span><span class="o">.</span><span class="n">_GLOBAL_DEFAULT_TIMEOUT</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">settimeout</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span> <span class="k">if</span> <span class="n">source_address</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">source_address</span><span class="p">)</span> <span class="n">s</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">address</span><span class="p">)</span> <span class="k">return</span> <span class="n">s</span></div> <div class="viewcode-block" id="fake_gethostbyname"><a class="viewcode-back" href="../../api.html#httpretty.core.fake_gethostbyname">[docs]</a><span class="k">def</span> <span class="nf">fake_gethostbyname</span><span class="p">(</span><span class="n">host</span><span class="p">):</span> <span class="sd">"""drop-in replacement for :py:func:`socket.gethostbyname`"""</span> <span class="k">return</span> <span class="s1">'127.0.0.1'</span></div> <div class="viewcode-block" id="fake_gethostname"><a class="viewcode-back" href="../../api.html#httpretty.core.fake_gethostname">[docs]</a><span class="k">def</span> <span class="nf">fake_gethostname</span><span class="p">():</span> <span class="sd">"""drop-in replacement for :py:func:`socket.gethostname`"""</span> <span class="k">return</span> <span class="s1">'localhost'</span></div> <div class="viewcode-block" id="fake_getaddrinfo"><a class="viewcode-back" href="../../api.html#httpretty.core.fake_getaddrinfo">[docs]</a><span class="k">def</span> <span class="nf">fake_getaddrinfo</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">family</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">socktype</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">proto</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="kc">None</span><span class="p">):</span> <span class="sd">"""drop-in replacement for :py:func:`socket.getaddrinfo`"""</span> <span class="k">return</span> <span class="p">[(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">IPPROTO_TCP</span><span class="p">,</span> <span class="s1">''</span><span class="p">,</span> <span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">))]</span></div> <div class="viewcode-block" id="Entry"><a class="viewcode-back" href="../../api.html#httpretty.core.Entry">[docs]</a><span class="k">class</span> <span class="nc">Entry</span><span class="p">(</span><span class="n">BaseClass</span><span class="p">):</span> <span class="sd">"""Created by :py:meth:`~httpretty.core.httpretty.register_uri` and</span> <span class="sd"> stored in memory as internal representation of a HTTP</span> <span class="sd"> request/response definition.</span> <span class="sd"> :param method: string</span> <span class="sd"> :param uri: string</span> <span class="sd"> :param body: string</span> <span class="sd"> :param adding_headers: dict - headers to be added to the response</span> <span class="sd"> :param forcing_headers: dict - headers to be forcefully set in the response</span> <span class="sd"> :param status: an integer (e.g.: ``status=200``)</span> <span class="sd"> :param streaming: bool - whether to stream the response</span> <span class="sd"> :param headers: keyword-args with headers to be added to the response</span> <span class="sd"> .. warning:: When using the ``forcing_headers`` option make sure to add the header ``Content-Length`` otherwise calls using :py:mod:`requests` will try to load the response endlessly.</span> <span class="sd"> """</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">method</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">body</span><span class="p">,</span> <span class="n">adding_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">forcing_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">streaming</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">headers</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="bp">self</span><span class="o">.</span><span class="n">uri</span> <span class="o">=</span> <span class="n">uri</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_is_callable</span> <span class="o">=</span> <span class="kc">False</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="s2">"__call__"</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">callable_body</span> <span class="o">=</span> <span class="n">body</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="kc">None</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_is_callable</span> <span class="o">=</span> <span class="kc">True</span> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="n">text_type</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="n">utf8</span><span class="p">(</span><span class="n">body</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">body</span> <span class="o">=</span> <span class="n">body</span> <span class="bp">self</span><span class="o">.</span><span class="n">streaming</span> <span class="o">=</span> <span class="n">streaming</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">streaming</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_is_callable</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">or</span> <span class="s1">''</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">body_length</span> <span class="o">=</span> <span class="mi">0</span> <span class="bp">self</span><span class="o">.</span><span class="n">adding_headers</span> <span class="o">=</span> <span class="n">adding_headers</span> <span class="ow">or</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">forcing_headers</span> <span class="o">=</span> <span class="n">forcing_headers</span> <span class="ow">or</span> <span class="p">{}</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">status</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">headers</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="s2">"-"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">k</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">"_"</span><span class="p">))</span><span class="o">.</span><span class="n">title</span><span class="p">()</span> <span class="bp">self</span><span class="o">.</span><span class="n">adding_headers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span> <span class="bp">self</span><span class="o">.</span><span class="n">validate</span><span class="p">()</span> <div class="viewcode-block" id="Entry.validate"><a class="viewcode-back" href="../../api.html#httpretty.core.Entry.validate">[docs]</a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""validates the body size with the value of the ``Content-Length``</span> <span class="sd"> header</span> <span class="sd"> """</span> <span class="n">content_length_keys</span> <span class="o">=</span> <span class="s1">'Content-Length'</span><span class="p">,</span> <span class="s1">'content-length'</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">content_length_keys</span><span class="p">:</span> <span class="n">got</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">adding_headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">forcing_headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span> <span class="k">if</span> <span class="n">got</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">continue</span> <span class="n">igot</span> <span class="o">=</span> <span class="kc">None</span> <span class="k">try</span><span class="p">:</span> <span class="n">igot</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">got</span><span class="p">)</span> <span class="k">except</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="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> <span class="s1">'HTTPretty got to register the Content-Length header '</span> <span class="s1">'with "</span><span class="si">%r</span><span class="s1">" which is not a number'</span> <span class="o">%</span> <span class="n">got</span><span class="p">)</span> <span class="k">return</span> <span class="k">if</span> <span class="n">igot</span> <span class="ow">and</span> <span class="n">igot</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">body_length</span><span class="p">:</span> <span class="k">raise</span> <span class="n">HTTPrettyError</span><span class="p">(</span> <span class="s1">'HTTPretty got inconsistent parameters. The header '</span> <span class="s1">'Content-Length you registered expects size "</span><span class="si">%d</span><span class="s1">" but '</span> <span class="s1">'the body you registered for that has actually length '</span> <span class="s1">'"</span><span class="si">%d</span><span class="s1">".'</span> <span class="o">%</span> <span class="p">(</span> <span class="n">igot</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_length</span><span class="p">,</span> <span class="p">)</span> <span class="p">)</span></div> <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="sa">r</span><span class="s1">'<Entry </span><span class="si">{}</span><span class="s1"> </span><span class="si">{}</span><span class="s1"> getting </span><span class="si">{}</span><span class="s1">>'</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">method</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">uri</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="p">)</span> <div class="viewcode-block" id="Entry.normalize_headers"><a class="viewcode-back" href="../../api.html#httpretty.core.Entry.normalize_headers">[docs]</a> <span class="k">def</span> <span class="nf">normalize_headers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span> <span class="sd">"""Normalize keys in header names so that ``COntent-tyPe`` becomes ``content-type``</span> <span class="sd"> :param headers: dict</span> <span class="sd"> :returns: dict</span> <span class="sd"> """</span> <span class="n">new</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span> <span class="n">new_k</span> <span class="o">=</span> <span class="s1">'-'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">s</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">k</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'-'</span><span class="p">)])</span> <span class="n">new</span><span class="p">[</span><span class="n">new_k</span><span class="p">]</span> <span class="o">=</span> <span class="n">headers</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">return</span> <span class="n">new</span></div> <div class="viewcode-block" id="Entry.fill_filekind"><a class="viewcode-back" href="../../api.html#httpretty.core.Entry.fill_filekind">[docs]</a> <span class="k">def</span> <span class="nf">fill_filekind</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fk</span><span class="p">):</span> <span class="sd">"""writes HTTP Response data to a file descriptor</span> <span class="sd"> :parm fk: a file-like object</span> <span class="sd"> .. warning:: **side-effect:** this method moves the cursor of the given file object to zero</span> <span class="sd"> """</span> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span> <span class="s1">'status'</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="p">,</span> <span class="s1">'date'</span><span class="p">:</span> <span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S GMT'</span><span class="p">),</span> <span class="s1">'server'</span><span class="p">:</span> <span class="s1">'Python/HTTPretty'</span><span class="p">,</span> <span class="s1">'connection'</span><span class="p">:</span> <span class="s1">'close'</span><span class="p">,</span> <span class="p">}</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">forcing_headers</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">forcing_headers</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">adding_headers</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="bp">self</span><span class="o">.</span><span class="n">normalize_headers</span><span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">adding_headers</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">normalize_headers</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span> <span class="n">status</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="s1">'status'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_is_callable</span><span class="p">:</span> <span class="n">status</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">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">callable_body</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">full_url</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="bp">self</span><span class="o">.</span><span class="n">normalize_headers</span><span class="p">(</span><span class="n">headers</span><span class="p">)</span> <span class="c1"># TODO: document this behavior:</span> <span class="k">if</span> <span class="s1">'content-length'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">headers</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="s1">'content-length'</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">body</span><span class="p">)</span> <span class="p">})</span> <span class="n">string_list</span> <span class="o">=</span> <span class="p">[</span> <span class="s1">'HTTP/1.1 </span><span class="si">%d</span><span class="s1"> </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">status</span><span class="p">,</span> <span class="n">STATUSES</span><span class="p">[</span><span class="n">status</span><span class="p">]),</span> <span class="p">]</span> <span class="k">if</span> <span class="s1">'date'</span> <span class="ow">in</span> <span class="n">headers</span><span class="p">:</span> <span class="n">string_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'date: </span><span class="si">%s</span><span class="s1">'</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="s1">'date'</span><span class="p">))</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">forcing_headers</span><span class="p">:</span> <span class="n">content_type</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="s1">'content-type'</span><span class="p">,</span> <span class="s1">'text/plain; charset=utf-8'</span><span class="p">)</span> <span class="n">content_length</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="s1">'content-length'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body_length</span><span class="p">)</span> <span class="n">string_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'content-type: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">content_type</span><span class="p">)</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">streaming</span><span class="p">:</span> <span class="n">string_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'content-length: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">content_length</span><span class="p">)</span> <span class="n">server</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="s1">'server'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="k">if</span> <span class="n">server</span><span class="p">:</span> <span class="n">string_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">'server: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="n">server</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">headers</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> <span class="n">string_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="s1">'</span><span class="si">{}</span><span class="s1">: </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</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="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">string_list</span><span class="p">:</span> <span class="n">fk</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">utf8</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="o">+</span> <span class="sa">b</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="n">fk</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s1">'</span><span class="se">\r\n</span><span class="s1">'</span><span class="p">)</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">streaming</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">tee</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">)</span> <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">body</span><span class="p">:</span> <span class="n">fk</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">utf8</span><span class="p">(</span><span class="n">chunk</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">fk</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">))</span> <span class="n">fk</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span></div></div> <div class="viewcode-block" id="url_fix"><a class="viewcode-back" href="../../api.html#httpretty.core.url_fix">[docs]</a><span class="k">def</span> <span class="nf">url_fix</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">charset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span> <span class="sd">"""escapes special characters</span> <span class="sd"> """</span> <span class="k">if</span> <span class="n">charset</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">"</span><span class="si">{}</span><span class="s2">.url_fix() charset argument is deprecated"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="vm">__name__</span><span class="p">),</span> <span class="ne">DeprecationWarning</span><span class="p">)</span> <span class="n">scheme</span><span class="p">,</span> <span class="n">netloc</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">querystring</span><span class="p">,</span> <span class="n">fragment</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="n">path</span> <span class="o">=</span> <span class="n">quote</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="sa">b</span><span class="s1">'/%'</span><span class="p">)</span> <span class="n">querystring</span> <span class="o">=</span> <span class="n">quote_plus</span><span class="p">(</span><span class="n">querystring</span><span class="p">,</span> <span class="sa">b</span><span class="s1">':&='</span><span class="p">)</span> <span class="k">return</span> <span class="n">urlunsplit</span><span class="p">((</span><span class="n">scheme</span><span class="p">,</span> <span class="n">netloc</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">querystring</span><span class="p">,</span> <span class="n">fragment</span><span class="p">))</span></div> <div class="viewcode-block" id="URIInfo"><a class="viewcode-back" href="../../api.html#httpretty.core.URIInfo">[docs]</a><span class="k">class</span> <span class="nc">URIInfo</span><span class="p">(</span><span class="n">BaseClass</span><span class="p">):</span> <span class="sd">"""Internal representation of `URIs <https://en.wikipedia.org/wiki/Uniform_Resource_Identifier>`_</span> <span class="sd"> .. tip:: all arguments are optional</span> <span class="sd"> :param username:</span> <span class="sd"> :param password:</span> <span class="sd"> :param hostname:</span> <span class="sd"> :param port:</span> <span class="sd"> :param path:</span> <span class="sd"> :param query:</span> <span class="sd"> :param fragment:</span> <span class="sd"> :param scheme:</span> <span class="sd"> :param last_request:</span> <span class="sd"> """</span> <span class="n">default_str_attrs</span> <span class="o">=</span> <span class="p">(</span> <span class="s1">'username'</span><span class="p">,</span> <span class="s1">'password'</span><span class="p">,</span> <span class="s1">'hostname'</span><span class="p">,</span> <span class="s1">'port'</span><span class="p">,</span> <span class="s1">'path'</span><span class="p">,</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">username</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">password</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">hostname</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s1">'/'</span><span class="p">,</span> <span class="n">query</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">fragment</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">scheme</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">last_request</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">username</span> <span class="o">=</span> <span class="n">username</span> <span class="ow">or</span> <span class="s1">''</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span> <span class="ow">or</span> <span class="s1">''</span> <span class="bp">self</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">hostname</span> <span class="ow">or</span> <span class="s1">''</span> <span class="k">if</span> <span class="n">port</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="k">elif</span> <span class="n">scheme</span> <span class="o">==</span> <span class="s1">'https'</span><span class="p">:</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">443</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="ow">or</span> <span class="mi">80</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">path</span> <span class="ow">or</span> <span class="s1">''</span> <span class="k">if</span> <span class="n">query</span><span class="p">:</span> <span class="n">query_items</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">parse_qs</span><span class="p">(</span><span class="n">query</span><span class="p">)</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">query</span> <span class="o">=</span> <span class="n">urlencode</span><span class="p">(</span> <span class="n">encode_obj</span><span class="p">(</span><span class="n">query_items</span><span class="p">),</span> <span class="n">doseq</span><span class="o">=</span><span class="kc">True</span><span class="p">,</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">query</span> <span class="o">=</span> <span class="s1">''</span> <span class="k">if</span> <span class="n">scheme</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheme</span> <span class="o">=</span> <span class="n">scheme</span> <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="ow">in</span> <span class="n">POTENTIAL_HTTPS_PORTS</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheme</span> <span class="o">=</span> <span class="s1">'https'</span> <span class="k">else</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">scheme</span> <span class="o">=</span> <span class="s1">'http'</span> <span class="bp">self</span><span class="o">.</span><span class="n">fragment</span> <span class="o">=</span> <span class="n">fragment</span> <span class="ow">or</span> <span class="s1">''</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_request</span> <span class="o">=</span> <span class="n">last_request</span> <span class="k">def</span> <span class="nf">to_str</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attrs</span><span class="p">):</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s2">", "</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">'</span><span class="si">%s</span><span class="s1">="</span><span class="si">%s</span><span class="s1">"'</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</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="n">k</span><span class="p">,</span> <span class="s1">''</span><span class="p">))</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">attrs</span><span class="p">])</span> <span class="k">return</span> <span class="sa">r</span><span class="s1">'<httpretty.URIInfo(</span><span class="si">%s</span><span class="s1">)>'</span> <span class="o">%</span> <span class="n">fmt</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="bp">self</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_str_attrs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">str_with_query</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">attrs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_str_attrs</span> <span class="o">+</span> <span class="p">(</span><span class="s1">'query'</span><span class="p">,)</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_str</span><span class="p">(</span><span class="n">attrs</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">int</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">binary_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">'ascii'</span><span class="p">))</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">(),</span> <span class="mi">16</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__eq__</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="n">self_tuple</span> <span class="o">=</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="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">hostname</span><span class="o">.</span><span class="n">lower</span><span class="p">()),</span> <span class="n">url_fix</span><span class="p">(</span><span class="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">)),</span> <span class="p">)</span> <span class="n">other_tuple</span> <span class="o">=</span> <span class="p">(</span> <span class="n">other</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">hostname</span><span class="o">.</span><span class="n">lower</span><span class="p">()),</span> <span class="n">url_fix</span><span class="p">(</span><span class="n">decode_utf8</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">path</span><span class="p">)),</span> <span class="p">)</span> <span class="k">return</span> <span class="n">self_tuple</span> <span class="o">==</span> <span class="n">other_tuple</span> <div class="viewcode-block" id="URIInfo.full_url"><a class="viewcode-back" href="../../api.html#httpretty.core.URIInfo.full_url">[docs]</a> <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">use_querystring</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param use_querystring: bool</span> <span class="sd"> :returns: a string with the full url with the format ``{scheme}://{credentials}{domain}{path}{query}``</span> <span class="sd"> """</span> <span class="n">credentials</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">:</span> <span class="n">credentials</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">:</span><span class="si">{}</span><span class="s2">@"</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">username</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">)</span> <span class="n">query</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">use_querystring</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">:</span> <span class="n">query</span> <span class="o">=</span> <span class="s2">"?</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">query</span><span class="p">))</span> <span class="n">result</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{scheme}</span><span class="s2">://</span><span class="si">{credentials}{domain}{path}{query}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> <span class="n">scheme</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">scheme</span><span class="p">,</span> <span class="n">credentials</span><span class="o">=</span><span class="n">credentials</span><span class="p">,</span> <span class="n">domain</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">get_full_domain</span><span class="p">(),</span> <span class="n">path</span><span class="o">=</span><span class="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="p">),</span> <span class="n">query</span><span class="o">=</span><span class="n">query</span> <span class="p">)</span> <span class="k">return</span> <span class="n">result</span></div> <div class="viewcode-block" id="URIInfo.get_full_domain"><a class="viewcode-back" href="../../api.html#httpretty.core.URIInfo.get_full_domain">[docs]</a> <span class="k">def</span> <span class="nf">get_full_domain</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :returns: a string in the form ``{domain}:{port}`` or just the domain if the port is 80 or 443</span> <span class="sd"> """</span> <span class="n">hostname</span> <span class="o">=</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">hostname</span><span class="p">)</span> <span class="c1"># Port 80/443 should not be appended to the url</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">DEFAULT_HTTP_PORTS</span> <span class="o">|</span> <span class="n">DEFAULT_HTTPS_PORTS</span><span class="p">:</span> <span class="k">return</span> <span class="s2">":"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">hostname</span><span class="p">,</span> <span class="nb">str</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="k">return</span> <span class="n">hostname</span></div> <div class="viewcode-block" id="URIInfo.from_uri"><a class="viewcode-back" href="../../api.html#httpretty.core.URIInfo.from_uri">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">from_uri</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">entry</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param uri: string</span> <span class="sd"> :param entry: an instance of :py:class:`~httpretty.core.Entry`</span> <span class="sd"> """</span> <span class="n">result</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">result</span><span class="o">.</span><span class="n">scheme</span> <span class="o">==</span> <span class="s1">'https'</span><span class="p">:</span> <span class="n">POTENTIAL_HTTPS_PORTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">port</span> <span class="ow">or</span> <span class="mi">443</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">POTENTIAL_HTTP_PORTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">port</span> <span class="ow">or</span> <span class="mi">80</span><span class="p">))</span> <span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">hostname</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">query</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">fragment</span><span class="p">,</span> <span class="n">result</span><span class="o">.</span><span class="n">scheme</span><span class="p">,</span> <span class="n">entry</span><span class="p">)</span></div></div> <div class="viewcode-block" id="URIMatcher"><a class="viewcode-back" href="../../api.html#httpretty.core.URIMatcher">[docs]</a><span class="k">class</span> <span class="nc">URIMatcher</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="n">regex</span> <span class="o">=</span> <span class="kc">None</span> <span class="n">info</span> <span class="o">=</span> <span class="kc">None</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">uri</span><span class="p">,</span> <span class="n">entries</span><span class="p">,</span> <span class="n">match_querystring</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">priority</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">_match_querystring</span> <span class="o">=</span> <span class="n">match_querystring</span> <span class="c1"># CPython, Jython</span> <span class="n">regex_types</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'SRE_Pattern'</span><span class="p">,</span> <span class="s1">'org.python.modules.sre.PatternObject'</span><span class="p">,</span> <span class="s1">'Pattern'</span><span class="p">)</span> <span class="n">is_regex</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">uri</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span> <span class="ow">in</span> <span class="n">regex_types</span> <span class="k">if</span> <span class="n">is_regex</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">regex</span> <span class="o">=</span> <span class="n">uri</span> <span class="n">result</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">uri</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">scheme</span> <span class="o">==</span> <span class="s1">'https'</span><span class="p">:</span> <span class="n">POTENTIAL_HTTPS_PORTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">port</span> <span class="ow">or</span> <span class="mi">443</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="n">POTENTIAL_HTTP_PORTS</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">port</span> <span class="ow">or</span> <span class="mi">80</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">info</span> <span class="o">=</span> <span class="n">URIInfo</span><span class="o">.</span><span class="n">from_uri</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">entries</span><span class="p">)</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span> <span class="o">=</span> <span class="n">entries</span> <span class="bp">self</span><span class="o">.</span><span class="n">priority</span> <span class="o">=</span> <span class="n">priority</span> <span class="c1"># hash of current_entry pointers, per method.</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span> <span class="o">=</span> <span class="p">{}</span> <span class="k">def</span> <span class="nf">matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">info</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">:</span> <span class="c1"># Query string is not considered when comparing info objects, compare separately</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span> <span class="o">==</span> <span class="n">info</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_querystring</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">query</span> <span class="o">==</span> <span class="n">info</span><span class="o">.</span><span class="n">query</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">regex</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">full_url</span><span class="p">(</span> <span class="n">use_querystring</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_match_querystring</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="n">wrap</span> <span class="o">=</span> <span class="s1">'URLMatcher(</span><span class="si">{}</span><span class="s1">)'</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">:</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_querystring</span><span class="p">:</span> <span class="k">return</span> <span class="n">wrap</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text_type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">str_with_query</span><span class="p">()))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">wrap</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">text_type</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">info</span><span class="p">))</span> <span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">wrap</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">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span> <div class="viewcode-block" id="URIMatcher.get_next_entry"><a class="viewcode-back" href="../../api.html#httpretty.core.URIMatcher.get_next_entry">[docs]</a> <span class="k">def</span> <span class="nf">get_next_entry</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">info</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span> <span class="sd">"""Cycle through available responses, but only once.</span> <span class="sd"> Any subsequent requests will receive the last response"""</span> <span class="k">if</span> <span class="n">method</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># restrict selection to entries that match the requested</span> <span class="c1"># method</span> <span class="n">entries_for_method</span> <span class="o">=</span> <span class="p">[</span><span class="n">e</span> <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span> <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="n">method</span><span class="p">]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="n">entries_for_method</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">entries</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">entries_for_method</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'I have no entries for method </span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="bp">self</span><span class="p">))</span> <span class="n">entry</span> <span class="o">=</span> <span class="n">entries_for_method</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]]</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">current_entries</span><span class="p">[</span><span class="n">method</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c1"># Attach more info to the entry</span> <span class="c1"># So the callback can be more clever about what to do</span> <span class="c1"># This does also fix the case where the callback</span> <span class="c1"># would be handed a compiled regex as uri instead of the</span> <span class="c1"># real uri</span> <span class="n">entry</span><span class="o">.</span><span class="n">info</span> <span class="o">=</span> <span class="n">info</span> <span class="n">entry</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">request</span> <span class="k">return</span> <span class="n">entry</span></div> <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="nb">hash</span><span class="p">(</span><span class="n">text_type</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span> <span class="k">def</span> <span class="nf">__eq__</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">return</span> <span class="n">text_type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="n">text_type</span><span class="p">(</span><span class="n">other</span><span class="p">)</span></div> <div class="viewcode-block" id="httpretty"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty">[docs]</a><span class="k">class</span> <span class="nc">httpretty</span><span class="p">(</span><span class="n">HttpBaseClass</span><span class="p">):</span> <span class="sd">"""manages HTTPretty's internal request/response registry and request matching.</span> <span class="sd"> """</span> <span class="n">_entries</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">latest_requests</span> <span class="o">=</span> <span class="p">[]</span> <span class="n">last_request</span> <span class="o">=</span> <span class="n">HTTPrettyRequestEmpty</span><span class="p">()</span> <span class="n">_is_enabled</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">allow_net_connect</span> <span class="o">=</span> <span class="kc">True</span> <div class="viewcode-block" id="httpretty.match_uriinfo"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.match_uriinfo">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">match_uriinfo</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">info</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param info: an :py:class:`~httpretty.core.URIInfo`</span> <span class="sd"> :returns: a 2-item tuple: (:py:class:`~httpretty.core.URLMatcher`, :py:class:`~httpretty.core.URIInfo`) or ``(None, [])``</span> <span class="sd"> """</span> <span class="n">items</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">matcher_entries</span><span class="p">:</span> <span class="n">matcher_entries</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">priority</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="p">)</span> <span class="k">for</span> <span class="n">matcher</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span> <span class="k">if</span> <span class="n">matcher</span><span class="o">.</span><span class="n">matches</span><span class="p">(</span><span class="n">info</span><span class="p">):</span> <span class="k">return</span> <span class="p">(</span><span class="n">matcher</span><span class="p">,</span> <span class="n">info</span><span class="p">)</span> <span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="p">[])</span></div> <div class="viewcode-block" id="httpretty.match_https_hostname"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.match_https_hostname">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">match_https_hostname</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">hostname</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param hostname: a string</span> <span class="sd"> :returns: an :py:class:`~httpretty.core.URLMatcher` or ``None``</span> <span class="sd"> """</span> <span class="n">items</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">matcher_entries</span><span class="p">:</span> <span class="n">matcher_entries</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">priority</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="p">)</span> <span class="k">for</span> <span class="n">matcher</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span> <span class="k">if</span> <span class="n">matcher</span><span class="o">.</span><span class="n">info</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="n">pattern_with_port</span> <span class="o">=</span> <span class="s2">"https://</span><span class="si">{0}</span><span class="s2">:"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="n">pattern_without_port</span> <span class="o">=</span> <span class="s2">"https://</span><span class="si">{0}</span><span class="s2">/"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hostname</span><span class="p">)</span> <span class="n">hostname_pattern</span> <span class="o">=</span> <span class="p">(</span> <span class="n">hostname_re</span> <span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">matcher</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span> <span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">)</span> <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="p">[</span><span class="n">pattern_with_port</span><span class="p">,</span> <span class="n">pattern_without_port</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">hostname_pattern</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span> <span class="k">return</span> <span class="n">matcher</span> <span class="k">elif</span> <span class="n">matcher</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">hostname</span> <span class="o">==</span> <span class="n">hostname</span><span class="p">:</span> <span class="k">return</span> <span class="n">matcher</span> <span class="k">return</span> <span class="kc">None</span></div> <div class="viewcode-block" id="httpretty.match_http_address"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.match_http_address">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">match_http_address</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> :param hostname: a string</span> <span class="sd"> :param port: an integer</span> <span class="sd"> :returns: an :py:class:`~httpretty.core.URLMatcher` or ``None``</span> <span class="sd"> """</span> <span class="n">items</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="o">.</span><span class="n">items</span><span class="p">(),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">matcher_entries</span><span class="p">:</span> <span class="n">matcher_entries</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">priority</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="p">)</span> <span class="k">for</span> <span class="n">matcher</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span> <span class="k">if</span> <span class="n">matcher</span><span class="o">.</span><span class="n">info</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">if</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">POTENTIAL_HTTPS_PORTS</span><span class="p">:</span> <span class="n">scheme</span> <span class="o">=</span> <span class="s1">'https://'</span> <span class="k">else</span><span class="p">:</span> <span class="n">scheme</span> <span class="o">=</span> <span class="s1">'http://'</span> <span class="n">pattern_without_port</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0}{1}</span><span class="s2">/"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">scheme</span><span class="p">,</span> <span class="n">hostname</span><span class="p">)</span> <span class="n">pattern_with_port</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{0}{1}</span><span class="s2">:</span><span class="si">{2}</span><span class="s2">/"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">scheme</span><span class="p">,</span> <span class="n">hostname</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span> <span class="n">hostname_pattern</span> <span class="o">=</span> <span class="p">(</span> <span class="n">hostname_re</span> <span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">matcher</span><span class="o">.</span><span class="n">regex</span><span class="o">.</span><span class="n">pattern</span><span class="p">)</span> <span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">)</span> <span class="k">for</span> <span class="n">pattern</span> <span class="ow">in</span> <span class="p">[</span><span class="n">pattern_with_port</span><span class="p">,</span> <span class="n">pattern_without_port</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">hostname_pattern</span><span class="p">,</span> <span class="n">pattern</span><span class="p">):</span> <span class="k">return</span> <span class="n">matcher</span> <span class="k">elif</span> <span class="n">matcher</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">hostname</span> <span class="o">==</span> <span class="n">hostname</span> \ <span class="ow">and</span> <span class="n">matcher</span><span class="o">.</span><span class="n">info</span><span class="o">.</span><span class="n">port</span> <span class="o">==</span> <span class="n">port</span><span class="p">:</span> <span class="k">return</span> <span class="n">matcher</span> <span class="k">return</span> <span class="kc">None</span></div> <div class="viewcode-block" id="httpretty.record"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.record">[docs]</a> <span class="nd">@classmethod</span> <span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span> <span class="k">def</span> <span class="nf">record</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">indentation</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> .. testcode::</span> <span class="sd"> import io</span> <span class="sd"> import json</span> <span class="sd"> import requests</span> <span class="sd"> import httpretty</span> <span class="sd"> with httpretty.record('/tmp/ip.json'):</span> <span class="sd"> data = requests.get('https://httpbin.org/ip').json()</span> <span class="sd"> with io.open('/tmp/ip.json') as fd:</span> <span class="sd"> assert data == json.load(fd)</span> <span class="sd"> :param filename: a string</span> <span class="sd"> :param indentation: an integer, defaults to **4**</span> <span class="sd"> :param encoding: a string, defaults to **"utf-8"**</span> <span class="sd"> :returns: a `context-manager <https://docs.python.org/3/reference/datamodel.html#context-managers>`_</span> <span class="sd"> """</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">urllib3</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span> <span class="s1">'HTTPretty requires urllib3 installed '</span> <span class="s1">'for recording actual requests.'</span> <span class="p">)</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="n">http</span> <span class="o">=</span> <span class="n">urllib3</span><span class="o">.</span><span class="n">PoolManager</span><span class="p">()</span> <span class="bp">cls</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span> <span class="n">calls</span> <span class="o">=</span> <span class="p">[]</span> <span class="k">def</span> <span class="nf">record_request</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">headers</span><span class="p">):</span> <span class="bp">cls</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span> <span class="n">kw</span> <span class="o">=</span> <span class="p">{}</span> <span class="n">kw</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'body'</span><span class="p">,</span> <span class="n">request</span><span class="o">.</span><span class="n">body</span><span class="p">)</span> <span class="n">kw</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">'headers'</span><span class="p">,</span> <span class="nb">dict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">))</span> <span class="n">response</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span> <span class="n">calls</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> <span class="s1">'request'</span><span class="p">:</span> <span class="p">{</span> <span class="s1">'uri'</span><span class="p">:</span> <span class="n">uri</span><span class="p">,</span> <span class="s1">'method'</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span><span class="p">,</span> <span class="s1">'headers'</span><span class="p">:</span> <span class="nb">dict</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="p">),</span> <span class="s1">'body'</span><span class="p">:</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">body</span><span class="p">),</span> <span class="s1">'querystring'</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">querystring</span> <span class="p">},</span> <span class="s1">'response'</span><span class="p">:</span> <span class="p">{</span> <span class="s1">'status'</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="s1">'body'</span><span class="p">:</span> <span class="n">decode_utf8</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">data</span><span class="p">),</span> <span class="c1"># urllib3 1.10 had a bug if you just did:</span> <span class="c1"># dict(response.headers)</span> <span class="c1"># which would cause all the values to become lists</span> <span class="c1"># with the header name as the first item and the</span> <span class="c1"># true value as the second item. Workaround that</span> <span class="s1">'headers'</span><span class="p">:</span> <span class="nb">dict</span><span class="p">(</span><span class="n">response</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="p">}</span> <span class="p">})</span> <span class="bp">cls</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span> <span class="k">return</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">headers</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">data</span> <span class="k">for</span> <span class="n">method</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">METHODS</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">register_uri</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">MULTILINE_ANY_REGEX</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">record_request</span><span class="p">)</span> <span class="k">yield</span> <span class="bp">cls</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span> <span class="k">with</span> <span class="n">codecs</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">,</span> <span class="n">encoding</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">calls</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="n">indentation</span><span class="p">))</span></div> <div class="viewcode-block" id="httpretty.playback"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.playback">[docs]</a> <span class="nd">@classmethod</span> <span class="nd">@contextlib</span><span class="o">.</span><span class="n">contextmanager</span> <span class="k">def</span> <span class="nf">playback</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> .. testcode::</span> <span class="sd"> import io</span> <span class="sd"> import json</span> <span class="sd"> import requests</span> <span class="sd"> import httpretty</span> <span class="sd"> with httpretty.record('/tmp/ip.json'):</span> <span class="sd"> data = requests.get('https://httpbin.org/ip').json()</span> <span class="sd"> with io.open('/tmp/ip.json') as fd:</span> <span class="sd"> assert data == json.load(fd)</span> <span class="sd"> :param filename: a string</span> <span class="sd"> :returns: a `context-manager <https://docs.python.org/3/reference/datamodel.html#context-managers>`_</span> <span class="sd"> """</span> <span class="bp">cls</span><span class="o">.</span><span class="n">enable</span><span class="p">()</span> <span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</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="o">.</span><span class="n">read</span><span class="p">())</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span> <span class="n">uri</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">'request'</span><span class="p">][</span><span class="s1">'uri'</span><span class="p">]</span> <span class="n">method</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">'request'</span><span class="p">][</span><span class="s1">'method'</span><span class="p">]</span> <span class="n">body</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">'response'</span><span class="p">][</span><span class="s1">'body'</span><span class="p">]</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">item</span><span class="p">[</span><span class="s1">'response'</span><span class="p">][</span><span class="s1">'headers'</span><span class="p">]</span> <span class="bp">cls</span><span class="o">.</span><span class="n">register_uri</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">body</span><span class="p">,</span> <span class="n">forcing_headers</span><span class="o">=</span><span class="n">headers</span><span class="p">)</span> <span class="k">yield</span> <span class="bp">cls</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span></div> <div class="viewcode-block" id="httpretty.reset"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.reset">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="sd">"""resets the internal state of HTTPretty, unregistering all URLs</span> <span class="sd"> """</span> <span class="n">POTENTIAL_HTTP_PORTS</span><span class="o">.</span><span class="n">intersection_update</span><span class="p">(</span><span class="n">DEFAULT_HTTP_PORTS</span><span class="p">)</span> <span class="n">POTENTIAL_HTTPS_PORTS</span><span class="o">.</span><span class="n">intersection_update</span><span class="p">(</span><span class="n">DEFAULT_HTTPS_PORTS</span><span class="p">)</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> <span class="bp">cls</span><span class="o">.</span><span class="n">latest_requests</span> <span class="o">=</span> <span class="p">[]</span> <span class="bp">cls</span><span class="o">.</span><span class="n">last_request</span> <span class="o">=</span> <span class="n">HTTPrettyRequestEmpty</span><span class="p">()</span></div> <div class="viewcode-block" id="httpretty.historify_request"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.historify_request">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">historify_request</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="s1">''</span><span class="p">,</span> <span class="n">append</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="sd">"""appends request to a list for later retrieval</span> <span class="sd"> .. testcode::</span> <span class="sd"> import httpretty</span> <span class="sd"> httpretty.register_uri(httpretty.GET, 'https://httpbin.org/ip', body='')</span> <span class="sd"> with httpretty.enabled():</span> <span class="sd"> requests.get('https://httpbin.org/ip')</span> <span class="sd"> assert httpretty.latest_requests[-1].url == 'https://httpbin.org/ip'</span> <span class="sd"> """</span> <span class="n">request</span> <span class="o">=</span> <span class="n">HTTPrettyRequest</span><span class="p">(</span><span class="n">headers</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span> <span class="bp">cls</span><span class="o">.</span><span class="n">last_request</span> <span class="o">=</span> <span class="n">request</span> <span class="k">if</span> <span class="n">append</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">latest_requests</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">latest_requests</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">request</span><span class="p">)</span> <span class="k">else</span><span class="p">:</span> <span class="bp">cls</span><span class="o">.</span><span class="n">latest_requests</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">request</span> <span class="k">return</span> <span class="n">request</span></div> <div class="viewcode-block" id="httpretty.register_uri"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.register_uri">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">register_uri</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="s1">'{"message": "HTTPretty :)"}'</span><span class="p">,</span> <span class="n">adding_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">forcing_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">responses</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">match_querystring</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">priority</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">headers</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> .. testcode::</span> <span class="sd"> import httpretty</span> <span class="sd"> def request_callback(request, uri, response_headers):</span> <span class="sd"> content_type = request.headers.get('Content-Type')</span> <span class="sd"> assert request.body == '{"nothing": "here"}', 'unexpected body: {}'.format(request.body)</span> <span class="sd"> assert content_type == 'application/json', 'expected application/json but received Content-Type: {}'.format(content_type)</span> <span class="sd"> return [200, response_headers, json.dumps({"hello": "world"})]</span> <span class="sd"> httpretty.register_uri(</span> <span class="sd"> HTTPretty.POST, "https://httpretty.example.com/api",</span> <span class="sd"> body=request_callback)</span> <span class="sd"> with httpretty.enabled():</span> <span class="sd"> requests.post('https://httpretty.example.com/api', data='{"nothing": "here"}', headers={'Content-Type': 'application/json'})</span> <span class="sd"> assert httpretty.latest_requests[-1].url == 'https://httpbin.org/ip'</span> <span class="sd"> :param method: one of ``httpretty.GET``, ``httpretty.PUT``, ``httpretty.POST``, ``httpretty.DELETE``, ``httpretty.HEAD``, ``httpretty.PATCH``, ``httpretty.OPTIONS``, ``httpretty.CONNECT``</span> <span class="sd"> :param uri: a string (e.g.: **"https://httpbin.org/ip"**)</span> <span class="sd"> :param body: a string, defaults to ``{"message": "HTTPretty :)"}``</span> <span class="sd"> :param adding_headers: dict - headers to be added to the response</span> <span class="sd"> :param forcing_headers: dict - headers to be forcefully set in the response</span> <span class="sd"> :param status: an integer, defaults to **200**</span> <span class="sd"> :param responses: a list of entries, ideally each created with :py:meth:`~httpretty.core.httpretty.Response`</span> <span class="sd"> :param priority: an integer, useful for setting higher priority over previously registered urls. defaults to zero</span> <span class="sd"> :param match_querystring: bool - whether to take the querystring into account when matching an URL</span> <span class="sd"> :param headers: headers to be added to the response</span> <span class="sd"> """</span> <span class="n">uri_is_string</span> <span class="o">=</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="k">if</span> <span class="n">uri_is_string</span> <span class="ow">and</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="sa">r</span><span class="s1">'^\w+://[^/]+[.]\w{2,}$'</span><span class="p">,</span> <span class="n">uri</span><span class="p">):</span> <span class="n">uri</span> <span class="o">+=</span> <span class="s1">'/'</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">responses</span><span class="p">,</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">responses</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span> <span class="k">for</span> <span class="n">response</span> <span class="ow">in</span> <span class="n">responses</span><span class="p">:</span> <span class="n">response</span><span class="o">.</span><span class="n">uri</span> <span class="o">=</span> <span class="n">uri</span> <span class="n">response</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">method</span> <span class="n">entries_for_this_uri</span> <span class="o">=</span> <span class="n">responses</span> <span class="k">else</span><span class="p">:</span> <span class="n">headers</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="s1">'body'</span><span class="p">)]</span> <span class="o">=</span> <span class="n">body</span> <span class="n">headers</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="s1">'adding_headers'</span><span class="p">)]</span> <span class="o">=</span> <span class="n">adding_headers</span> <span class="n">headers</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="s1">'forcing_headers'</span><span class="p">)]</span> <span class="o">=</span> <span class="n">forcing_headers</span> <span class="n">headers</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="s1">'status'</span><span class="p">)]</span> <span class="o">=</span> <span class="n">status</span> <span class="n">entries_for_this_uri</span> <span class="o">=</span> <span class="p">[</span> <span class="bp">cls</span><span class="o">.</span><span class="n">Response</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="n">method</span><span class="p">,</span> <span class="n">uri</span><span class="o">=</span><span class="n">uri</span><span class="p">,</span> <span class="o">**</span><span class="n">headers</span><span class="p">),</span> <span class="p">]</span> <span class="n">matcher</span> <span class="o">=</span> <span class="n">URIMatcher</span><span class="p">(</span><span class="n">uri</span><span class="p">,</span> <span class="n">entries_for_this_uri</span><span class="p">,</span> <span class="n">match_querystring</span><span class="p">,</span> <span class="n">priority</span><span class="p">)</span> <span class="k">if</span> <span class="n">matcher</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="p">:</span> <span class="n">matcher</span><span class="o">.</span><span class="n">entries</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="p">[</span><span class="n">matcher</span><span class="p">])</span> <span class="k">del</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="p">[</span><span class="n">matcher</span><span class="p">]</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_entries</span><span class="p">[</span><span class="n">matcher</span><span class="p">]</span> <span class="o">=</span> <span class="n">entries_for_this_uri</span></div> <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">'<HTTPretty with </span><span class="si">%d</span><span class="s1"> URI entries>'</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_entries</span><span class="p">)</span> <div class="viewcode-block" id="httpretty.Response"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.Response">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">Response</span><span class="p">(</span> <span class="bp">cls</span><span class="p">,</span> <span class="n">body</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="n">uri</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">adding_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">forcing_headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">streaming</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span> <span class="sd">"""</span> <span class="sd"> shortcut to create an :py:class:`~httpretty.core.Entry` that takes the body as first positional argument</span> <span class="sd"> .. seealso:: the parameters of this function match those of the :py:class:`~httpretty.core.Entry` constructor</span> <span class="sd"> :param body:</span> <span class="sd"> :param method: one of ``httpretty.GET``, ``httpretty.PUT``, ``httpretty.POST``, ``httpretty.DELETE``, ``httpretty.HEAD``, ``httpretty.PATCH``, ``httpretty.OPTIONS``, ``httpretty.CONNECT``</span> <span class="sd"> :param uri:</span> <span class="sd"> :param adding_headers:</span> <span class="sd"> :param forcing_headers:</span> <span class="sd"> :param status: defaults to **200**</span> <span class="sd"> :param streaming: defaults to **False**</span> <span class="sd"> :param kw: keyword-arguments passed onto the :py:class:`~httpretty.core.Entry`</span> <span class="sd"> :returns: an :py:class:`~httpretty.core.Entry`</span> <span class="sd"> """</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'body'</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'adding_headers'</span><span class="p">]</span> <span class="o">=</span> <span class="n">adding_headers</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'forcing_headers'</span><span class="p">]</span> <span class="o">=</span> <span class="n">forcing_headers</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'status'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">status</span><span class="p">)</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'streaming'</span><span class="p">]</span> <span class="o">=</span> <span class="n">streaming</span> <span class="k">return</span> <span class="n">Entry</span><span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">uri</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span></div> <div class="viewcode-block" id="httpretty.disable"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.disable">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">disable</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="sd">"""Disables HTTPretty entirely, putting the original :py:mod:`socket`</span> <span class="sd"> module back in its place.</span> <span class="sd"> .. code::</span> <span class="sd"> import re, json</span> <span class="sd"> import httpretty</span> <span class="sd"> httpretty.enable()</span> <span class="sd"> # request passes through fake socket</span> <span class="sd"> response = requests.get('https://httpbin.org')</span> <span class="sd"> httpretty.disable()</span> <span class="sd"> # request uses real python socket module</span> <span class="sd"> response = requests.get('https://httpbin.org')</span> <span class="sd"> .. note:: This method does not call :py:meth:`httpretty.core.reset` automatically.</span> <span class="sd"> """</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_is_enabled</span> <span class="o">=</span> <span class="kc">False</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">old_socket</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketType</span> <span class="o">=</span> <span class="n">old_SocketType</span> <span class="n">socket</span><span class="o">.</span><span class="n">_socketobject</span> <span class="o">=</span> <span class="n">old_socket</span> <span class="n">socket</span><span class="o">.</span><span class="n">create_connection</span> <span class="o">=</span> <span class="n">old_create_connection</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span> <span class="o">=</span> <span class="n">old_gethostname</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span> <span class="o">=</span> <span class="n">old_gethostbyname</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span> <span class="o">=</span> <span class="n">old_getaddrinfo</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'socket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_socket</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_socketobject'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_socket</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'SocketType'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_SocketType</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'create_connection'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_create_connection</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'gethostname'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_gethostname</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'gethostbyname'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_gethostbyname</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'getaddrinfo'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_getaddrinfo</span> <span class="k">if</span> <span class="n">socks</span><span class="p">:</span> <span class="n">socks</span><span class="o">.</span><span class="n">socksocket</span> <span class="o">=</span> <span class="n">old_socksocket</span> <span class="n">socks</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'socksocket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_socksocket</span> <span class="k">if</span> <span class="n">ssl</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="o">=</span> <span class="n">old_ssl_wrap_socket</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLSocket</span> <span class="o">=</span> <span class="n">old_sslsocket</span> <span class="k">try</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLContext</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="o">=</span> <span class="n">old_sslcontext_wrap_socket</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'wrap_socket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_ssl_wrap_socket</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'SSLSocket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_sslsocket</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">PY3</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">sslwrap_simple</span> <span class="o">=</span> <span class="n">old_sslwrap_simple</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'sslwrap_simple'</span><span class="p">]</span> <span class="o">=</span> <span class="n">old_sslwrap_simple</span> <span class="k">if</span> <span class="n">requests_urllib3_connection</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">requests_urllib3_connection</span><span class="o">.</span><span class="n">ssl_wrap_socket</span> <span class="o">=</span> \ <span class="n">old_requests_ssl_wrap_socket</span> <span class="n">requests_urllib3_connection</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'ssl_wrap_socket'</span><span class="p">]</span> <span class="o">=</span> \ <span class="n">old_requests_ssl_wrap_socket</span></div> <div class="viewcode-block" id="httpretty.is_enabled"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.is_enabled">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">is_enabled</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span> <span class="sd">"""Check if HTTPretty is enabled</span> <span class="sd"> :returns: bool</span> <span class="sd"> .. testcode::</span> <span class="sd"> import httpretty</span> <span class="sd"> httpretty.enable()</span> <span class="sd"> assert httpretty.is_enabled() == True</span> <span class="sd"> httpretty.disable()</span> <span class="sd"> assert httpretty.is_enabled() == False</span> <span class="sd"> """</span> <span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_is_enabled</span></div> <div class="viewcode-block" id="httpretty.enable"><a class="viewcode-back" href="../../api.html#httpretty.core.httpretty.enable">[docs]</a> <span class="nd">@classmethod</span> <span class="k">def</span> <span class="nf">enable</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">allow_net_connect</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="sd">"""Enables HTTPretty.</span> <span class="sd"> When ``allow_net_connect`` is ``False`` any connection to an unregistered uri will throw :py:class:`httpretty.errors.UnmockedError`.</span> <span class="sd"> .. testcode::</span> <span class="sd"> import re, json</span> <span class="sd"> import httpretty</span> <span class="sd"> httpretty.enable()</span> <span class="sd"> httpretty.register_uri(</span> <span class="sd"> httpretty.GET,</span> <span class="sd"> re.compile(r'http://.*'),</span> <span class="sd"> body=json.dumps({'man': 'in', 'the': 'middle'})</span> <span class="sd"> )</span> <span class="sd"> response = requests.get('https://foo.bar/foo/bar')</span> <span class="sd"> response.json().should.equal({</span> <span class="sd"> "man": "in",</span> <span class="sd"> "the": "middle",</span> <span class="sd"> })</span> <span class="sd"> .. warning:: after calling this method the original :py:mod:`socket` is replaced with :py:class:`httpretty.core.fakesock`. Make sure to call :py:meth:`~httpretty.disable` after done with your tests or use the :py:class:`httpretty.enabled` as decorator or `context-manager <https://docs.python.org/3/reference/datamodel.html#context-managers>`_</span> <span class="sd"> """</span> <span class="bp">cls</span><span class="o">.</span><span class="n">allow_net_connect</span> <span class="o">=</span> <span class="n">allow_net_connect</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_is_enabled</span> <span class="o">=</span> <span class="kc">True</span> <span class="c1"># Some versions of python internally shadowed the</span> <span class="c1"># SocketType variable incorrectly https://bugs.python.org/issue20386</span> <span class="n">bad_socket_shadow</span> <span class="o">=</span> <span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="o">!=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketType</span><span class="p">)</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="n">socket</span><span class="o">.</span><span class="n">_socketobject</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">bad_socket_shadow</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketType</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="n">socket</span><span class="o">.</span><span class="n">create_connection</span> <span class="o">=</span> <span class="n">create_fake_connection</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostname</span> <span class="o">=</span> <span class="n">fake_gethostname</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span> <span class="o">=</span> <span class="n">fake_gethostbyname</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span> <span class="o">=</span> <span class="n">fake_getaddrinfo</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'socket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'_socketobject'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">bad_socket_shadow</span><span class="p">:</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'SocketType'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'create_connection'</span><span class="p">]</span> <span class="o">=</span> <span class="n">create_fake_connection</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'gethostname'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fake_gethostname</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'gethostbyname'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fake_gethostbyname</span> <span class="n">socket</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'getaddrinfo'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fake_getaddrinfo</span> <span class="k">if</span> <span class="n">socks</span><span class="p">:</span> <span class="n">socks</span><span class="o">.</span><span class="n">socksocket</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="n">socks</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'socksocket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">fakesock</span><span class="o">.</span><span class="n">socket</span> <span class="k">if</span> <span class="n">ssl</span><span class="p">:</span> <span class="n">new_wrap</span> <span class="o">=</span> <span class="n">partial</span><span class="p">(</span><span class="n">fake_wrap_socket</span><span class="p">,</span> <span class="n">old_ssl_wrap_socket</span><span class="p">)</span> <span class="n">ssl</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="o">=</span> <span class="n">new_wrap</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLSocket</span> <span class="o">=</span> <span class="n">FakeSSLSocket</span> <span class="k">try</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">SSLContext</span><span class="o">.</span><span class="n">wrap_socket</span> <span class="o">=</span> <span class="n">partial</span><span class="p">(</span><span class="n">fake_wrap_socket</span><span class="p">,</span> <span class="n">old_sslcontext_wrap_socket</span><span class="p">)</span> <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'wrap_socket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_wrap</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'SSLSocket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">FakeSSLSocket</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">PY3</span><span class="p">:</span> <span class="n">ssl</span><span class="o">.</span><span class="n">sslwrap_simple</span> <span class="o">=</span> <span class="n">new_wrap</span> <span class="n">ssl</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'sslwrap_simple'</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_wrap</span> <span class="k">if</span> <span class="n">requests_urllib3_connection</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> <span class="n">new_wrap</span> <span class="o">=</span> <span class="n">partial</span><span class="p">(</span><span class="n">fake_wrap_socket</span><span class="p">,</span> <span class="n">old_requests_ssl_wrap_socket</span><span class="p">)</span> <span class="n">requests_urllib3_connection</span><span class="o">.</span><span class="n">ssl_wrap_socket</span> <span class="o">=</span> <span class="n">new_wrap</span> <span class="n">requests_urllib3_connection</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'ssl_wrap_socket'</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_wrap</span></div></div> <div class="viewcode-block" id="httprettized"><a class="viewcode-back" href="../../api.html#httpretty.core.httprettized">[docs]</a><span class="k">class</span> <span class="nc">httprettized</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span> <span class="sd">"""`context-manager <https://docs.python.org/3/reference/datamodel.html#context-managers>`_ for enabling HTTPretty.</span> <span class="sd"> .. testcode::</span> <span class="sd"> import json</span> <span class="sd"> import httpretty</span> <span class="sd"> httpretty.register_uri(httpretty.GET, 'https://httpbin.org/ip', body=json.dumps({'origin': '42.42.42.42'}))</span> <span class="sd"> with httpretty.enabled():</span> <span class="sd"> response = requests.get('https://httpbin.org/ip')</span> <span class="sd"> assert httpretty.latest_requests[-1].url == 'https://httpbin.org/ip'</span> <span class="sd"> assert response.json() == {'origin': '42.42.42.42'}</span> <span class="sd"> """</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">allow_net_connect</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">allow_net_connect</span> <span class="o">=</span> <span class="n">allow_net_connect</span> <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span><span class="n">allow_net_connect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">allow_net_connect</span><span class="p">)</span> <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span></div> <div class="viewcode-block" id="httprettified"><a class="viewcode-back" href="../../api.html#httpretty.core.httprettified">[docs]</a><span class="k">def</span> <span class="nf">httprettified</span><span class="p">(</span><span class="n">test</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">allow_net_connect</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> <span class="sd">"""decorator for test functions</span> <span class="sd"> .. tip:: Also available under the alias :py:func:`httpretty.activate`</span> <span class="sd"> :param test: a callable</span> <span class="sd"> example usage with `nosetests <https://nose.readthedocs.io/en/latest/>`_</span> <span class="sd"> .. testcode::</span> <span class="sd"> import sure</span> <span class="sd"> from httpretty import httprettified</span> <span class="sd"> @httprettified</span> <span class="sd"> def test_using_nosetests():</span> <span class="sd"> httpretty.register_uri(</span> <span class="sd"> httpretty.GET,</span> <span class="sd"> 'https://httpbin.org/ip'</span> <span class="sd"> )</span> <span class="sd"> response = requests.get('https://httpbin.org/ip')</span> <span class="sd"> response.json().should.equal({</span> <span class="sd"> "message": "HTTPretty :)"</span> <span class="sd"> })</span> <span class="sd"> example usage with `unittest module <https://docs.python.org/3/library/unittest.html>`_</span> <span class="sd"> .. testcode::</span> <span class="sd"> import unittest</span> <span class="sd"> from sure import expect</span> <span class="sd"> from httpretty import httprettified</span> <span class="sd"> @httprettified</span> <span class="sd"> class TestWithPyUnit(unittest.TestCase):</span> <span class="sd"> def test_httpbin(self):</span> <span class="sd"> httpretty.register_uri(httpretty.GET, 'https://httpbin.org/ip')</span> <span class="sd"> response = requests.get('https://httpbin.org/ip')</span> <span class="sd"> expect(response.json()).to.equal({</span> <span class="sd"> "message": "HTTPretty :)"</span> <span class="sd"> })</span> <span class="sd"> """</span> <span class="k">def</span> <span class="nf">decorate_unittest_TestCase_setUp</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="c1"># Prefer addCleanup (added in python 2.7), but fall back</span> <span class="c1"># to using tearDown if it isn't available</span> <span class="n">use_addCleanup</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="s1">'addCleanup'</span><span class="p">)</span> <span class="n">original_setUp</span> <span class="o">=</span> <span class="p">(</span><span class="n">klass</span><span class="o">.</span><span class="n">setUp</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="s1">'setUp'</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span><span class="p">)</span> <span class="k">def</span> <span class="nf">new_setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span><span class="n">allow_net_connect</span><span class="p">)</span> <span class="k">if</span> <span class="n">use_addCleanup</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">addCleanup</span><span class="p">(</span><span class="n">httpretty</span><span class="o">.</span><span class="n">disable</span><span class="p">)</span> <span class="k">if</span> <span class="n">original_setUp</span><span class="p">:</span> <span class="n">original_setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="n">klass</span><span class="o">.</span><span class="n">setUp</span> <span class="o">=</span> <span class="n">new_setUp</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">use_addCleanup</span><span class="p">:</span> <span class="n">original_tearDown</span> <span class="o">=</span> <span class="p">(</span><span class="n">klass</span><span class="o">.</span><span class="n">setUp</span> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="s1">'tearDown'</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span><span class="p">)</span> <span class="k">def</span> <span class="nf">new_tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">disable</span><span class="p">()</span> <span class="n">httpretty</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span> <span class="k">if</span> <span class="n">original_tearDown</span><span class="p">:</span> <span class="n">original_tearDown</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="n">klass</span><span class="o">.</span><span class="n">tearDown</span> <span class="o">=</span> <span class="n">new_tearDown</span> <span class="k">return</span> <span class="n">klass</span> <span class="k">def</span> <span class="nf">decorate_test_methods</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="k">for</span> <span class="n">attr</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">attr</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'test_'</span><span class="p">):</span> <span class="k">continue</span> <span class="n">attr_value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</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">attr_value</span><span class="p">,</span> <span class="s2">"__call__"</span><span class="p">):</span> <span class="k">continue</span> <span class="nb">setattr</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">decorate_callable</span><span class="p">(</span><span class="n">attr_value</span><span class="p">))</span> <span class="k">return</span> <span class="n">klass</span> <span class="k">def</span> <span class="nf">is_unittest_TestCase</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="k">try</span><span class="p">:</span> <span class="kn">import</span> <span class="nn">unittest</span> <span class="k">return</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">unittest</span><span class="o">.</span><span class="n">TestCase</span><span class="p">)</span> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="k">return</span> <span class="kc">False</span> <span class="s2">"A decorator for tests that use HTTPretty"</span> <span class="k">def</span> <span class="nf">decorate_class</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="k">if</span> <span class="n">is_unittest_TestCase</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span> <span class="k">return</span> <span class="n">decorate_unittest_TestCase_setUp</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span> <span class="k">return</span> <span class="n">decorate_test_methods</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span> <span class="k">def</span> <span class="nf">decorate_callable</span><span class="p">(</span><span class="n">test</span><span class="p">):</span> <span class="nd">@functools</span><span class="o">.</span><span class="n">wraps</span><span class="p">(</span><span class="n">test</span><span class="p">)</span> <span class="k">def</span> <span class="nf">wrapper</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">kw</span><span class="p">):</span> <span class="k">with</span> <span class="n">httprettized</span><span class="p">(</span><span class="n">allow_net_connect</span><span class="p">):</span> <span class="k">return</span> <span class="n">test</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">kw</span><span class="p">)</span> <span class="k">return</span> <span class="n">wrapper</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">test</span><span class="p">,</span> <span class="n">ClassTypes</span><span class="p">):</span> <span class="k">return</span> <span class="n">decorate_class</span><span class="p">(</span><span class="n">test</span><span class="p">)</span> <span class="k">elif</span> <span class="n">callable</span><span class="p">(</span><span class="n">test</span><span class="p">):</span> <span class="k">return</span> <span class="n">decorate_callable</span><span class="p">(</span><span class="n">test</span><span class="p">)</span> <span class="k">return</span> <span class="n">decorate_callable</span></div> </pre></div> </div> </div> <footer> <hr/> <div role="contentinfo"> <p> © Copyright 2018, Gabriel Falcao </p> </div> Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script type="text/javascript"> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>