Sophie

Sophie

distrib > Mageia > 7 > i586 > by-pkgid > 40976576505203f8bb00bd1d4581832c > files > 38

python3-httpretty-0.9.6-1.mga7.noarch.rpm



<!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 &mdash; 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> &raquo;</li>
        
          <li><a href="../index.html">Module code</a> &raquo;</li>
        
          <li><a href="../httpretty.html">httpretty</a> &raquo;</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"># &lt;HTTPretty - HTTP client mock for Python&gt;</span>
<span class="c1"># Copyright (C) &lt;2011-2018&gt;  Gabriel Falcao &lt;gabriel@nacaolivre.org&gt;</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 &quot;Software&quot;), 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 &quot;AS IS&quot;, 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">&#39;.*&#39;</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">&#39;\^?(?:https?://)?[^:/]*[:/]?&#39;</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">&quot;&quot;&quot;</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&#39;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`` -&gt; a mimetype object that can be cast into a dictionary,</span>
<span class="sd">    contains all the request headers</span>

<span class="sd">    ``method`` -&gt; the HTTP method used in this request</span>

<span class="sd">    ``querystring`` -&gt; 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`` -&gt; the request body as a string</span>

<span class="sd">    ``parsed_body`` -&gt; the request body parsed by ``parse_request_body``</span>

<span class="sd">    .. testcode::</span>

<span class="sd">      &gt;&gt;&gt; request.querystring</span>
<span class="sd">      {&#39;name&#39;: [&#39;Gabriel Falcao&#39;]}</span>
<span class="sd">      &gt;&gt;&gt; print request.querystring[&#39;name&#39;][0]</span>



<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">headers</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="s1">&#39;&#39;</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&#39;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">&#39;</span><span class="se">\r\n\r\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">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">&#39;iso-8859-1&#39;</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">&quot;?&quot;</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">&quot;&quot;&quot;a dictionary containing parsed request body or None if</span>
<span class="sd">        HTTPrettyRequest doesn&#39;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">        &quot;&quot;&quot;</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">&#39;&lt;HTTPrettyRequest(&quot;</span><span class="si">{}</span><span class="s1">&quot;, total_headers=</span><span class="si">{}</span><span class="s1">, body_length=</span><span class="si">{}</span><span class="s1">)&gt;&#39;</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">&#39;content-type&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</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">&quot;&quot;&quot;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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;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">        &quot;&quot;&quot;</span>

        <span class="n">PARSING_FUNCTIONS</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s1">&#39;application/json&#39;</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">&#39;text/json&#39;</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">&#39;application/x-www-form-urlencoded&#39;</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">&#39;content-type&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</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">&quot;&quot;&quot;A dict subclass used as internal representation of empty request</span>
<span class="sd">    headers</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;&quot;&quot;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">    &quot;&quot;&quot;</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">&#39;&#39;</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">&quot;&quot;&quot;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">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
        <span class="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">&#39;getvalue&#39;</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">&quot;&quot;&quot;Shorthand for :py:class:`~httpretty.core.fakesock`</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">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">&quot;&quot;&quot;</span>
<span class="sd">    fake :py:mod:`socket`</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;&quot;&quot;drop-in replacement for :py:class:`socket.socket`</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;notAfter&#39;</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">&#39;%b </span><span class="si">%d</span><span class="s1"> %H:%M:%S GMT&#39;</span><span class="p">),</span>
                <span class="s1">&#39;subjectAltName&#39;</span><span class="p">:</span> <span class="p">(</span>
                    <span class="p">(</span><span class="s1">&#39;DNS&#39;</span><span class="p">,</span> <span class="s1">&#39;*.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;DNS&#39;</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">&#39;DNS&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">),</span>
                <span class="p">),</span>
                <span class="s1">&#39;subject&#39;</span><span class="p">:</span> <span class="p">(</span>
                    <span class="p">(</span>
                        <span class="p">(</span><span class="s1">&#39;organizationName&#39;</span><span class="p">,</span> <span class="s1">&#39;*.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;organizationalUnitName&#39;</span><span class="p">,</span>
                         <span class="s1">&#39;Domain Control Validated&#39;</span><span class="p">),</span>
                    <span class="p">),</span>
                    <span class="p">(</span>
                        <span class="p">(</span><span class="s1">&#39;commonName&#39;</span><span class="p">,</span> <span class="s1">&#39;*.</span><span class="si">%s</span><span class="s1">&#39;</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">&#39;r&#39;</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">&quot;&quot;&quot;Returns this fake socket&#39;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">            &quot;&quot;&quot;</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">&quot;&quot;&quot;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&#39;s tempfile</span>
<span class="sd">            buffer so that HTTPretty can return it accordingly when</span>
<span class="sd">            necessary.</span>
<span class="sd">            &quot;&quot;&quot;</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">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</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">&#39;&#39;</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&#39;t mocked, don&#39;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">&gt;</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">&#39;transfer-encoding&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="o">==</span> <span class="s1">&#39;chunked&#39;</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">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</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">&#39;0</span><span class="se">\r\n\r\n</span><span class="s1">&#39;</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">&#39;</span><span class="se">\r\n\r\n</span><span class="s1">&#39;</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">&#39;&#39;</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">&quot;HTTPretty intercepted and unexpected socket method call.&quot;</span><span class="p">,</span>
                    <span class="p">(</span><span class="s2">&quot;Please open an issue at &quot;</span>
                     <span class="s2">&quot;&#39;https://github.com/gabrielfalcao/HTTPretty/issues&#39;&quot;</span><span class="p">),</span>
                    <span class="s2">&quot;And paste the following traceback:</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span>
                    <span class="s2">&quot;&quot;</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">&quot;</span><span class="se">\n</span><span class="s2">&quot;</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">&#39;send&#39;</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">&#39;sendto&#39;</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">&#39;recvfrom_into&#39;</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">&#39;recv_into&#39;</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">&#39;recvfrom&#39;</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">&#39;recv&#39;</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">&quot;&quot;&quot;drop-in replacement for py:func:`ssl.wrap_socket`</span>
<span class="sd">    &quot;&quot;&quot;</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">&#39;server_hostname&#39;</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">&#39;sock&#39;</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">&#39;sock&#39;</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">&quot;&quot;&quot;drop-in replacement for :py:func:`socket.create_connection`&quot;&quot;&quot;</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">&quot;&quot;&quot;drop-in replacement for :py:func:`socket.gethostbyname`&quot;&quot;&quot;</span>
    <span class="k">return</span> <span class="s1">&#39;127.0.0.1&#39;</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">&quot;&quot;&quot;drop-in replacement for :py:func:`socket.gethostname`&quot;&quot;&quot;</span>
    <span class="k">return</span> <span class="s1">&#39;localhost&#39;</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">&quot;&quot;&quot;drop-in replacement for :py:func:`socket.getaddrinfo`&quot;&quot;&quot;</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">&#39;&#39;</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">&quot;&quot;&quot;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">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">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">&quot;__call__&quot;</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">&#39;&#39;</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">&quot;-&quot;</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">&quot;_&quot;</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">&quot;&quot;&quot;validates the body size with the value of the ``Content-Length``</span>
<span class="sd">        header</span>
<span class="sd">        &quot;&quot;&quot;</span>
        <span class="n">content_length_keys</span> <span class="o">=</span> <span class="s1">&#39;Content-Length&#39;</span><span class="p">,</span> <span class="s1">&#39;content-length&#39;</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">&#39;HTTPretty got to register the Content-Length header &#39;</span>
                    <span class="s1">&#39;with &quot;</span><span class="si">%r</span><span class="s1">&quot; which is not a number&#39;</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">&gt;</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">&#39;HTTPretty got inconsistent parameters. The header &#39;</span>
                    <span class="s1">&#39;Content-Length you registered expects size &quot;</span><span class="si">%d</span><span class="s1">&quot; but &#39;</span>
                    <span class="s1">&#39;the body you registered for that has actually length &#39;</span>
                    <span class="s1">&#39;&quot;</span><span class="si">%d</span><span class="s1">&quot;.&#39;</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">&#39;&lt;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">&gt;&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
            <span class="bp">self</span><span class="o">.</span><span class="n">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">&quot;&quot;&quot;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">        &quot;&quot;&quot;</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">&#39;-&#39;</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">&#39;-&#39;</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">&quot;&quot;&quot;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">        &quot;&quot;&quot;</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">&#39;status&#39;</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">&#39;date&#39;</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">&#39;</span><span class="si">%a</span><span class="s1">, </span><span class="si">%d</span><span class="s1"> %b %Y %H:%M:%S GMT&#39;</span><span class="p">),</span>
            <span class="s1">&#39;server&#39;</span><span class="p">:</span> <span class="s1">&#39;Python/HTTPretty&#39;</span><span class="p">,</span>
            <span class="s1">&#39;connection&#39;</span><span class="p">:</span> <span class="s1">&#39;close&#39;</span><span class="p">,</span>
        <span class="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">&#39;status&#39;</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">&#39;content-length&#39;</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">&#39;content-length&#39;</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">&#39;HTTP/1.1 </span><span class="si">%d</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">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">&#39;date&#39;</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">&#39;date: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;date&#39;</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">&#39;content-type&#39;</span><span class="p">,</span>
                                       <span class="s1">&#39;text/plain; charset=utf-8&#39;</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">&#39;content-length&#39;</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">&#39;content-type: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;content-length: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;server&#39;</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">&#39;server: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;</span><span class="si">{}</span><span class="s1">: </span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="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">&#39;</span><span class="se">\n</span><span class="s1">&#39;</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">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</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">&quot;&quot;&quot;escapes special characters</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">.url_fix() charset argument is deprecated&quot;</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">&#39;/%&#39;</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">&#39;:&amp;=&#39;</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">&quot;&quot;&quot;Internal representation of `URIs &lt;https://en.wikipedia.org/wiki/Uniform_Resource_Identifier&gt;`_</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">    &quot;&quot;&quot;</span>
    <span class="n">default_str_attrs</span> <span class="o">=</span> <span class="p">(</span>
        <span class="s1">&#39;username&#39;</span><span class="p">,</span>
        <span class="s1">&#39;password&#39;</span><span class="p">,</span>
        <span class="s1">&#39;hostname&#39;</span><span class="p">,</span>
        <span class="s1">&#39;port&#39;</span><span class="p">,</span>
        <span class="s1">&#39;path&#39;</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">&#39;&#39;</span><span class="p">,</span>
                 <span class="n">password</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
                 <span class="n">hostname</span><span class="o">=</span><span class="s1">&#39;&#39;</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">&#39;/&#39;</span><span class="p">,</span>
                 <span class="n">query</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
                 <span class="n">fragment</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
                 <span class="n">scheme</span><span class="o">=</span><span class="s1">&#39;&#39;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;https&#39;</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">&#39;&#39;</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">&#39;&#39;</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">&#39;https&#39;</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">&#39;http&#39;</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">&#39;&#39;</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">&quot;, &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</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">&#39;&#39;</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">&#39;&lt;httpretty.URIInfo(</span><span class="si">%s</span><span class="s1">)&gt;&#39;</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">&#39;query&#39;</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">&#39;ascii&#39;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</span>
        <span class="n">credentials</span> <span class="o">=</span> <span class="s2">&quot;&quot;</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">&quot;</span><span class="si">{}</span><span class="s2">:</span><span class="si">{}</span><span class="s2">@&quot;</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">&quot;&quot;</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">&quot;?</span><span class="si">{}</span><span class="s2">&quot;</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">&quot;</span><span class="si">{scheme}</span><span class="s2">://</span><span class="si">{credentials}{domain}{path}{query}</span><span class="s2">&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;:&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&#39;https&#39;</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">&#39;SRE_Pattern&#39;</span><span class="p">,</span> <span class="s1">&#39;org.python.modules.sre.PatternObject&#39;</span><span class="p">,</span>
                       <span class="s1">&#39;Pattern&#39;</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">&#39;https&#39;</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">&#39;URLMatcher(</span><span class="si">{}</span><span class="s1">)&#39;</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">&quot;&quot;&quot;Cycle through available responses, but only once.</span>
<span class="sd">        Any subsequent requests will receive the last response&quot;&quot;&quot;</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">&gt;=</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">&#39;I have no entries for method </span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&#39;</span>
                             <span class="o">%</span> <span class="p">(</span><span class="n">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">&quot;&quot;&quot;manages HTTPretty&#39;s internal request/response registry and request matching.</span>
<span class="sd">    &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&quot;https://</span><span class="si">{0}</span><span class="s2">:&quot;</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">&quot;https://</span><span class="si">{0}</span><span class="s2">/&quot;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</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">&#39;https://&#39;</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">scheme</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span>

                <span class="n">pattern_without_port</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">{0}{1}</span><span class="s2">/&quot;</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">&quot;</span><span class="si">{0}{1}</span><span class="s2">:</span><span class="si">{2}</span><span class="s2">/&quot;</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">&#39;utf-8&#39;</span><span class="p">):</span>
        <span class="sd">&quot;&quot;&quot;</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(&#39;/tmp/ip.json&#39;):</span>
<span class="sd">               data = requests.get(&#39;https://httpbin.org/ip&#39;).json()</span>

<span class="sd">           with io.open(&#39;/tmp/ip.json&#39;) 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 **&quot;utf-8&quot;**</span>

<span class="sd">        :returns: a `context-manager &lt;https://docs.python.org/3/reference/datamodel.html#context-managers&gt;`_</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;HTTPretty requires urllib3 installed &#39;</span>
                <span class="s1">&#39;for recording actual requests.&#39;</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">&#39;body&#39;</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">&#39;headers&#39;</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">&#39;request&#39;</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s1">&#39;uri&#39;</span><span class="p">:</span> <span class="n">uri</span><span class="p">,</span>
                    <span class="s1">&#39;method&#39;</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">&#39;headers&#39;</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">&#39;body&#39;</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">&#39;querystring&#39;</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">&#39;response&#39;</span><span class="p">:</span> <span class="p">{</span>
                    <span class="s1">&#39;status&#39;</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">&#39;body&#39;</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">&#39;headers&#39;</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">&#39;w&#39;</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">&quot;&quot;&quot;</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(&#39;/tmp/ip.json&#39;):</span>
<span class="sd">               data = requests.get(&#39;https://httpbin.org/ip&#39;).json()</span>

<span class="sd">           with io.open(&#39;/tmp/ip.json&#39;) 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 &lt;https://docs.python.org/3/reference/datamodel.html#context-managers&gt;`_</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;request&#39;</span><span class="p">][</span><span class="s1">&#39;uri&#39;</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">&#39;request&#39;</span><span class="p">][</span><span class="s1">&#39;method&#39;</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">&#39;response&#39;</span><span class="p">][</span><span class="s1">&#39;body&#39;</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">&#39;response&#39;</span><span class="p">][</span><span class="s1">&#39;headers&#39;</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">&quot;&quot;&quot;resets the internal state of HTTPretty, unregistering all URLs</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;&#39;</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">&quot;&quot;&quot;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, &#39;https://httpbin.org/ip&#39;, body=&#39;&#39;)</span>
<span class="sd">           with httpretty.enabled():</span>
<span class="sd">               requests.get(&#39;https://httpbin.org/ip&#39;)</span>

<span class="sd">           assert httpretty.latest_requests[-1].url == &#39;https://httpbin.org/ip&#39;</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;{&quot;message&quot;: &quot;HTTPretty :)&quot;}&#39;</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">&quot;&quot;&quot;</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(&#39;Content-Type&#39;)</span>
<span class="sd">               assert request.body == &#39;{&quot;nothing&quot;: &quot;here&quot;}&#39;, &#39;unexpected body: {}&#39;.format(request.body)</span>
<span class="sd">               assert content_type == &#39;application/json&#39;, &#39;expected application/json but received Content-Type: {}&#39;.format(content_type)</span>
<span class="sd">               return [200, response_headers, json.dumps({&quot;hello&quot;: &quot;world&quot;})]</span>

<span class="sd">           httpretty.register_uri(</span>
<span class="sd">               HTTPretty.POST, &quot;https://httpretty.example.com/api&quot;,</span>
<span class="sd">               body=request_callback)</span>


<span class="sd">           with httpretty.enabled():</span>
<span class="sd">               requests.post(&#39;https://httpretty.example.com/api&#39;, data=&#39;{&quot;nothing&quot;: &quot;here&quot;}&#39;, headers={&#39;Content-Type&#39;: &#39;application/json&#39;})</span>

<span class="sd">           assert httpretty.latest_requests[-1].url == &#39;https://httpbin.org/ip&#39;</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.: **&quot;https://httpbin.org/ip&quot;**)</span>
<span class="sd">        :param body: a string, defaults to ``{&quot;message&quot;: &quot;HTTPretty :)&quot;}``</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">        &quot;&quot;&quot;</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">&#39;^\w+://[^/]+[.]\w{2,}$&#39;</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">&#39;/&#39;</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">&gt;</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">&#39;body&#39;</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">&#39;adding_headers&#39;</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">&#39;forcing_headers&#39;</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">&#39;status&#39;</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">&#39;&lt;HTTPretty with </span><span class="si">%d</span><span class="s1"> URI entries&gt;&#39;</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">&quot;&quot;&quot;</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">        &quot;&quot;&quot;</span>
        <span class="n">kw</span><span class="p">[</span><span class="s1">&#39;body&#39;</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">&#39;adding_headers&#39;</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">&#39;forcing_headers&#39;</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">&#39;status&#39;</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">&#39;streaming&#39;</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">&quot;&quot;&quot;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(&#39;https://httpbin.org&#39;)</span>

<span class="sd">           httpretty.disable()</span>
<span class="sd">           # request uses real python socket module</span>
<span class="sd">           response = requests.get(&#39;https://httpbin.org&#39;)</span>

<span class="sd">        .. note:: This method does not call :py:meth:`httpretty.core.reset` automatically.</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;socket&#39;</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">&#39;_socketobject&#39;</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">&#39;SocketType&#39;</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">&#39;create_connection&#39;</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">&#39;gethostname&#39;</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">&#39;gethostbyname&#39;</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">&#39;getaddrinfo&#39;</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">&#39;socksocket&#39;</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">&#39;wrap_socket&#39;</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">&#39;SSLSocket&#39;</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">&#39;sslwrap_simple&#39;</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">&#39;ssl_wrap_socket&#39;</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">&quot;&quot;&quot;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">        &quot;&quot;&quot;</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">&quot;&quot;&quot;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&#39;http://.*&#39;),</span>
<span class="sd">               body=json.dumps({&#39;man&#39;: &#39;in&#39;, &#39;the&#39;: &#39;middle&#39;})</span>
<span class="sd">           )</span>

<span class="sd">           response = requests.get(&#39;https://foo.bar/foo/bar&#39;)</span>

<span class="sd">           response.json().should.equal({</span>
<span class="sd">               &quot;man&quot;: &quot;in&quot;,</span>
<span class="sd">               &quot;the&quot;: &quot;middle&quot;,</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 &lt;https://docs.python.org/3/reference/datamodel.html#context-managers&gt;`_</span>
<span class="sd">        &quot;&quot;&quot;</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">&#39;socket&#39;</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">&#39;_socketobject&#39;</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">&#39;SocketType&#39;</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">&#39;create_connection&#39;</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">&#39;gethostname&#39;</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">&#39;gethostbyname&#39;</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">&#39;getaddrinfo&#39;</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">&#39;socksocket&#39;</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">&#39;wrap_socket&#39;</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">&#39;SSLSocket&#39;</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">&#39;sslwrap_simple&#39;</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">&#39;ssl_wrap_socket&#39;</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">&quot;&quot;&quot;`context-manager &lt;https://docs.python.org/3/reference/datamodel.html#context-managers&gt;`_ 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, &#39;https://httpbin.org/ip&#39;, body=json.dumps({&#39;origin&#39;: &#39;42.42.42.42&#39;}))</span>
<span class="sd">       with httpretty.enabled():</span>
<span class="sd">           response = requests.get(&#39;https://httpbin.org/ip&#39;)</span>

<span class="sd">       assert httpretty.latest_requests[-1].url == &#39;https://httpbin.org/ip&#39;</span>
<span class="sd">       assert response.json() == {&#39;origin&#39;: &#39;42.42.42.42&#39;}</span>
<span class="sd">    &quot;&quot;&quot;</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">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">&quot;&quot;&quot;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 &lt;https://nose.readthedocs.io/en/latest/&gt;`_</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">               &#39;https://httpbin.org/ip&#39;</span>
<span class="sd">           )</span>

<span class="sd">           response = requests.get(&#39;https://httpbin.org/ip&#39;)</span>

<span class="sd">           response.json().should.equal({</span>
<span class="sd">               &quot;message&quot;: &quot;HTTPretty :)&quot;</span>
<span class="sd">           })</span>

<span class="sd">    example usage with `unittest module &lt;https://docs.python.org/3/library/unittest.html&gt;`_</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, &#39;https://httpbin.org/ip&#39;)</span>
<span class="sd">               response = requests.get(&#39;https://httpbin.org/ip&#39;)</span>
<span class="sd">               expect(response.json()).to.equal({</span>
<span class="sd">                   &quot;message&quot;: &quot;HTTPretty :)&quot;</span>
<span class="sd">               })</span>

<span class="sd">    &quot;&quot;&quot;</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&#39;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">&#39;addCleanup&#39;</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">&#39;setUp&#39;</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">&#39;tearDown&#39;</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">&#39;test_&#39;</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">&quot;__call__&quot;</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">&quot;A decorator for tests that use HTTPretty&quot;</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>
        &copy; 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>