blob: 858064781293822b64bb065168463cffe24a4bff [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>proton._reactor &#8212; Qpid Proton Python API 0.32.0 documentation</title>
<link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/language_data.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="nav-item nav-item-0"><a href="../../index.html">Qpid Proton Python API 0.32.0 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">proton._reactor</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for proton._reactor</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
<span class="c1"># distributed with this work for additional information</span>
<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
<span class="c1"># with the License. You may obtain a copy of the License at</span>
<span class="c1">#</span>
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">#</span>
<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
<span class="c1"># software distributed under the License is distributed on an</span>
<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
<span class="c1"># KIND, either express or implied. See the License for the</span>
<span class="c1"># specific language governing permissions and limitations</span>
<span class="c1"># under the License.</span>
<span class="c1">#</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
<span class="c1">#from functools import total_ordering</span>
<span class="kn">import</span> <span class="nn">heapq</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">traceback</span>
<span class="kn">import</span> <span class="nn">uuid</span>
<span class="kn">from</span> <span class="nn">cproton</span> <span class="kn">import</span> <span class="n">PN_PYREF</span><span class="p">,</span> <span class="n">PN_ACCEPTED</span><span class="p">,</span> <span class="n">PN_EVENT_NONE</span>
<span class="kn">from</span> <span class="nn">._delivery</span> <span class="kn">import</span> <span class="n">Delivery</span>
<span class="kn">from</span> <span class="nn">._endpoints</span> <span class="kn">import</span> <span class="n">Connection</span><span class="p">,</span> <span class="n">Endpoint</span><span class="p">,</span> <span class="n">Link</span><span class="p">,</span> <span class="n">Session</span><span class="p">,</span> <span class="n">Terminus</span>
<span class="kn">from</span> <span class="nn">._exceptions</span> <span class="kn">import</span> <span class="n">SSLUnavailable</span>
<span class="kn">from</span> <span class="nn">._data</span> <span class="kn">import</span> <span class="n">Described</span><span class="p">,</span> <span class="n">symbol</span><span class="p">,</span> <span class="n">ulong</span>
<span class="kn">from</span> <span class="nn">._message</span> <span class="kn">import</span> <span class="n">Message</span>
<span class="kn">from</span> <span class="nn">._transport</span> <span class="kn">import</span> <span class="n">Transport</span><span class="p">,</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">SSLDomain</span>
<span class="kn">from</span> <span class="nn">._url</span> <span class="kn">import</span> <span class="n">Url</span>
<span class="kn">from</span> <span class="nn">._common</span> <span class="kn">import</span> <span class="n">isstring</span><span class="p">,</span> <span class="n">unicode2utf8</span><span class="p">,</span> <span class="n">utf82unicode</span>
<span class="kn">from</span> <span class="nn">._events</span> <span class="kn">import</span> <span class="n">Collector</span><span class="p">,</span> <span class="n">EventType</span><span class="p">,</span> <span class="n">EventBase</span><span class="p">,</span> <span class="n">Handler</span><span class="p">,</span> <span class="n">Event</span>
<span class="kn">from</span> <span class="nn">._selectable</span> <span class="kn">import</span> <span class="n">Selectable</span>
<span class="kn">from</span> <span class="nn">._handlers</span> <span class="kn">import</span> <span class="n">OutgoingMessageHandler</span><span class="p">,</span> <span class="n">IOHandler</span>
<span class="kn">from</span> <span class="nn">._io</span> <span class="kn">import</span> <span class="n">IO</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">_compat</span>
<span class="kn">from</span> <span class="nn">._compat</span> <span class="kn">import</span> <span class="n">queue</span>
<span class="n">_logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;proton&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_generate_uuid</span><span class="p">():</span>
<span class="k">return</span> <span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_now</span><span class="p">():</span>
<span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="c1">#@total_ordering</span>
<span class="k">class</span> <span class="nc">Task</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">deadline</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deadline</span> <span class="o">=</span> <span class="n">deadline</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span> <span class="o">=</span> <span class="n">reactor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_cancelled</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">def</span> <span class="fm">__lt__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rhs</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deadline</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="o">.</span><span class="n">_deadline</span>
<span class="k">def</span> <span class="nf">cancel</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">_cancelled</span> <span class="o">=</span> <span class="kc">True</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">handler</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">_handler</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">container</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">_reactor</span>
<span class="k">class</span> <span class="nc">TimerSelectable</span><span class="p">(</span><span class="n">Selectable</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">TimerSelectable</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">reactor</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">readable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">writable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">expired</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">_reactor</span><span class="o">.</span><span class="n">timer_tick</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deadline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span><span class="o">.</span><span class="n">timer_deadline</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Reactor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">handlers</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_previous</span> <span class="o">=</span> <span class="n">PN_EVENT_NONE</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mark</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_yield</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_stop</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_collector</span> <span class="o">=</span> <span class="n">Collector</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectables</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_global_handler</span> <span class="o">=</span> <span class="n">IOHandler</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="o">=</span> <span class="n">Handler</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">h</span><span class="p">,</span> <span class="n">on_error</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">on_error</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_error</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="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">yield_</span><span class="p">()</span>
<span class="c1"># TODO: need to make this actually return a proxy which catches exceptions and calls</span>
<span class="c1"># on error.</span>
<span class="c1"># [Or arrange another way to deal with exceptions thrown by handlers]</span>
<span class="k">def</span> <span class="nf">_make_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return a proxy handler that dispatches to the provided handler.</span>
<span class="sd"> If handler throws an exception then on_error is called with info</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">handler</span>
<span class="k">def</span> <span class="nf">_get_global</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">_global_handler</span>
<span class="k">def</span> <span class="nf">_set_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_global_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_handler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">global_handler</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_global</span><span class="p">,</span> <span class="n">_set_global</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_get_timeout</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">_timeout</span>
<span class="k">def</span> <span class="nf">_set_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secs</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">secs</span>
<span class="n">timeout</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_timeout</span><span class="p">,</span> <span class="n">_set_timeout</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">yield_</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">_yield</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">def</span> <span class="nf">mark</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; This sets the reactor now instant to the current time &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_now</span> <span class="o">=</span> <span class="n">_now</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_now</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">now</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">_now</span>
<span class="k">def</span> <span class="nf">_get_handler</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">_handler</span>
<span class="k">def</span> <span class="nf">_set_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_handler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">handler</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_handler</span><span class="p">,</span> <span class="n">_set_handler</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Start the processing of events and messages for this container.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># TODO: Why do we timeout like this?</span>
<span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="mf">3.14159265359</span>
<span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">():</span> <span class="k">pass</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stop</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">()</span>
<span class="c1"># TODO: This isn&#39;t correct if we ever run again</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_global_handler</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Cross thread reactor wakeup</span>
<span class="k">def</span> <span class="nf">wakeup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># TODO: Do this with pipe and write?</span>
<span class="c1">#os.write(self._wakeup[1], &quot;x&quot;, 1);</span>
<span class="k">pass</span>
<span class="k">def</span> <span class="nf">start</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">push_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_INIT</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="n">TimerSelectable</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">_selectable</span><span class="o">.</span><span class="n">deadline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timer_deadline</span>
<span class="c1"># TODO set up fd to read for wakeups - but problematic on windows</span>
<span class="c1">#self._selectable.fileno(self._wakeup[0])</span>
<span class="c1">#self._selectable.reading = True</span>
<span class="bp">self</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">_selectable</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">quiesced</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">event</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="o">.</span><span class="n">peek</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">event</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="o">.</span><span class="n">more</span><span class="p">():</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span> <span class="ow">is</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_QUIESCED</span>
<span class="k">def</span> <span class="nf">_check_errors</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; This &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">:</span>
<span class="k">for</span> <span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
<span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="n">_compat</span><span class="o">.</span><span class="n">raise_</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># result = pn_reactor_process(self._impl)</span>
<span class="c1"># self._check_errors()</span>
<span class="c1"># return result</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mark</span><span class="p">()</span>
<span class="n">previous</span> <span class="o">=</span> <span class="n">PN_EVENT_NONE</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_yield</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_yield</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> Yielding&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="n">event</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="o">.</span><span class="n">peek</span><span class="p">()</span>
<span class="k">if</span> <span class="n">event</span><span class="p">:</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> recvd Event: </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="nb">type</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span>
<span class="c1"># regular handler</span>
<span class="n">handler</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">handler</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handler</span>
<span class="n">event</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_global_handler</span><span class="p">)</span>
<span class="n">previous</span> <span class="o">=</span> <span class="nb">type</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_previous</span> <span class="o">=</span> <span class="nb">type</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stop</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selectables</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">):</span>
<span class="k">if</span> <span class="n">previous</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_QUIESCED</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_previous</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_FINAL</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">push_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_QUIESCED</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">yield_</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</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">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_previous</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_FINAL</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">push_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Event</span><span class="o">.</span><span class="n">REACTOR_FINAL</span><span class="p">)</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> Stopping&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">def</span> <span class="nf">stop</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">_stop</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_errors</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">stop_events</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">_collector</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">schedule</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delay</span><span class="p">,</span> <span class="n">handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Schedule a task to run on this container after a given delay,</span>
<span class="sd"> and using the supplied handler.</span>
<span class="sd"> :param delay:</span>
<span class="sd"> :param handler:</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">himpl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_handler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">task</span> <span class="o">=</span> <span class="n">Task</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">_now</span><span class="o">+</span><span class="n">delay</span><span class="p">,</span> <span class="n">himpl</span><span class="p">)</span>
<span class="n">heapq</span><span class="o">.</span><span class="n">heappush</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">,</span> <span class="n">task</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">deadline</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">_deadline</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="o">.</span><span class="n">deadline</span> <span class="o">=</span> <span class="n">deadline</span>
<span class="bp">self</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">_selectable</span><span class="p">)</span>
<span class="k">return</span> <span class="n">task</span>
<span class="k">def</span> <span class="nf">timer_tick</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">_cancelled</span><span class="p">:</span>
<span class="n">heapq</span><span class="o">.</span><span class="n">heappop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="n">t</span><span class="o">.</span><span class="n">_deadline</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_now</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">heapq</span><span class="o">.</span><span class="n">heappop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">push_event</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">Event</span><span class="o">.</span><span class="n">TIMER_TASK</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">timer_deadline</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">_cancelled</span><span class="p">:</span>
<span class="n">heapq</span><span class="o">.</span><span class="n">heappop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timerheap</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_timers</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">t</span><span class="o">.</span><span class="n">_deadline</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">acceptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">impl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_handler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">Acceptor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unicode2utf8</span><span class="p">(</span><span class="n">host</span><span class="p">),</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">),</span> <span class="n">impl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">a</span><span class="p">:</span>
<span class="k">return</span> <span class="n">a</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> (</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</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">errors</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="k">def</span> <span class="nf">connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Deprecated: use connection_to_host() instead</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">impl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_make_handler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">Connection</span><span class="p">()</span>
<span class="k">if</span> <span class="n">impl</span><span class="p">:</span>
<span class="n">result</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">impl</span>
<span class="n">result</span><span class="o">.</span><span class="n">_reactor</span> <span class="o">=</span> <span class="bp">self</span>
<span class="n">result</span><span class="o">.</span><span class="n">collect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">connection_to_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Create an outgoing Connection that will be managed by the reactor.</span>
<span class="sd"> The reactor&#39;s pn_iohandler will create a socket connection to the host</span>
<span class="sd"> once the connection is opened.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_connection_host</span><span class="p">(</span><span class="n">conn</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="k">return</span> <span class="n">conn</span>
<span class="k">def</span> <span class="nf">set_connection_host</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</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="sd">&quot;&quot;&quot;Change the address used by the connection. The address is</span>
<span class="sd"> used by the reactor&#39;s iohandler to create an outgoing socket</span>
<span class="sd"> connection. This must be set prior to opening the connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">connection</span><span class="o">.</span><span class="n">set_address</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="k">def</span> <span class="nf">get_connection_address</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;*Deprecated* in favor of the property proton.Connection.connected_address.</span>
<span class="sd"> This may be used to retrieve the remote peer address.</span>
<span class="sd"> :return: string containing the address in URL format or None if no</span>
<span class="sd"> address is available. Use the proton.Url class to create a Url object</span>
<span class="sd"> from the returned value.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">connection</span><span class="o">.</span><span class="n">connected_address</span>
<span class="k">def</span> <span class="nf">selectable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">delegate</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> NO IDEA!</span>
<span class="sd"> :param handler: no idea</span>
<span class="sd"> :type handler: ?</span>
<span class="sd"> :param delegate: no idea</span>
<span class="sd"> :type delegate: ?</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">delegate</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">delegate</span> <span class="o">=</span> <span class="n">handler</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">Selectable</span><span class="p">(</span><span class="n">delegate</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="n">result</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">selectable</span><span class="p">):</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">push_event</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">etype</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_collector</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">etype</span><span class="p">)</span>
<div class="viewcode-block" id="EventInjector"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector">[docs]</a><span class="k">class</span> <span class="nc">EventInjector</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Can be added to a :class:`Container` to allow events to be triggered by an</span>
<span class="sd"> external thread but handled on the event thread associated with</span>
<span class="sd"> the container. An instance of this class can be passed to the</span>
<span class="sd"> :meth:`Container.selectable` method in order to activate</span>
<span class="sd"> it. :meth:`close` should be called when it is no longer</span>
<span class="sd"> needed, to allow the event loop to end if needed.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__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">queue</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">Queue</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pipe</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">pipe</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_closed</span> <span class="o">=</span> <span class="kc">False</span>
<div class="viewcode-block" id="EventInjector.trigger"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector.trigger">[docs]</a> <span class="k">def</span> <span class="nf">trigger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Request that the given event be dispatched on the event thread</span>
<span class="sd"> of the container to which this EventInjector was added.</span>
<span class="sd"> :param event: Event to be injected</span>
<span class="sd"> :type event: :class:`proton.Event`, :class:`ApplicationEvent`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">queue</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pipe</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="sa">b</span><span class="s2">&quot;!&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EventInjector.close"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector.close">[docs]</a> <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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Request that this EventInjector be closed. Existing events</span>
<span class="sd"> will be dispatched on the container&#39;s event dispatch thread,</span>
<span class="sd"> then this will be removed from the set of interest.</span>
<span class="sd"> &quot;&quot;&quot;</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="n">os</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pipe</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="sa">b</span><span class="s2">&quot;!&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="EventInjector.fileno"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector.fileno">[docs]</a> <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">pipe</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
<div class="viewcode-block" id="EventInjector.on_selectable_init"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector.on_selectable_init">[docs]</a> <span class="k">def</span> <span class="nf">on_selectable_init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">sel</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">context</span>
<span class="c1">#sel.fileno(self.fileno())</span>
<span class="n">sel</span><span class="o">.</span><span class="n">reading</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">sel</span><span class="o">.</span><span class="n">update</span><span class="p">()</span></div>
<div class="viewcode-block" id="EventInjector.on_selectable_readable"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.EventInjector.on_selectable_readable">[docs]</a> <span class="k">def</span> <span class="nf">on_selectable_readable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">context</span>
<span class="n">os</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pipe</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="mi">512</span><span class="p">)</span>
<span class="k">while</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">queue</span><span class="o">.</span><span class="n">empty</span><span class="p">():</span>
<span class="n">requested</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="n">s</span><span class="o">.</span><span class="n">push_event</span><span class="p">(</span><span class="n">requested</span><span class="o">.</span><span class="n">context</span><span class="p">,</span> <span class="n">requested</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_closed</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
<span class="n">s</span><span class="o">.</span><span class="n">update</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="ApplicationEvent"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.ApplicationEvent">[docs]</a><span class="k">class</span> <span class="nc">ApplicationEvent</span><span class="p">(</span><span class="n">EventBase</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Application defined event, which can optionally be associated with</span>
<span class="sd"> an engine object and or an arbitrary subject. This produces</span>
<span class="sd"> extended event types - see :class:`proton.EventType` for details.</span>
<span class="sd"> :param typename: Event type name</span>
<span class="sd"> :type typename: ``str``</span>
<span class="sd"> :param connection: Associates this event with a connection.</span>
<span class="sd"> :type connection: :class:`proton.Connection`</span>
<span class="sd"> :param session: Associates this event with a session.</span>
<span class="sd"> :type session: :class:`proton.Session`</span>
<span class="sd"> :param link: Associate this event with a link.</span>
<span class="sd"> :type link: :class:`proton.Link` or one of its subclasses</span>
<span class="sd"> :param delivery: Associate this event with a delivery.</span>
<span class="sd"> :type delivery: :class:`proton.Delivery`</span>
<span class="sd"> :param subject: Associate this event with an arbitrary object</span>
<span class="sd"> :type subject: any</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">TYPES</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typename</span><span class="p">,</span> <span class="n">connection</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">session</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">link</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">delivery</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">subject</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">typename</span><span class="p">,</span> <span class="n">EventType</span><span class="p">):</span>
<span class="n">eventtype</span> <span class="o">=</span> <span class="n">typename</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">eventtype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TYPES</span><span class="p">[</span><span class="n">typename</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">eventtype</span> <span class="o">=</span> <span class="n">EventType</span><span class="p">(</span><span class="n">typename</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">TYPES</span><span class="p">[</span><span class="n">typename</span><span class="p">]</span> <span class="o">=</span> <span class="n">eventtype</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ApplicationEvent</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">eventtype</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">clazz</span> <span class="o">=</span> <span class="n">PN_PYREF</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">connection</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
<span class="bp">self</span><span class="o">.</span><span class="n">link</span> <span class="o">=</span> <span class="n">link</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delivery</span> <span class="o">=</span> <span class="n">delivery</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delivery</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">link</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">link</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">link</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">session</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">connection</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subject</span> <span class="o">=</span> <span class="n">subject</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A reference to this event.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">objects</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">link</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">delivery</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">subject</span><span class="p">]</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">(</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">type</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="nb">str</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">objects</span> <span class="k">if</span> <span class="n">o</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">]))</span></div>
<div class="viewcode-block" id="Transaction"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Transaction">[docs]</a><span class="k">class</span> <span class="nc">Transaction</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Tracks the state of an AMQP 1.0 local transaction. In typical usage, this</span>
<span class="sd"> object is not created directly, but is obtained through the event returned</span>
<span class="sd"> by :meth:`proton.handlers.TransactionHandler.on_transaction_declared` after</span>
<span class="sd"> a call to :meth:`proton.reactor.Container.declare_transaction`.</span>
<span class="sd"> To send messages under this transaction, use :meth:`send`.</span>
<span class="sd"> </span>
<span class="sd"> To receive messages under this transaction, call :meth:`accept` once the</span>
<span class="sd"> message is received (typically from the</span>
<span class="sd"> :meth:`proton.handlers.MessagingHandler.on_message` callback).</span>
<span class="sd"> </span>
<span class="sd"> To discharge the transaction, call either :meth:`commit`</span>
<span class="sd"> (for a successful transaction), or :meth:`abort` (for a failed transaction).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">txn_ctrl</span><span class="p">,</span> <span class="n">handler</span><span class="p">,</span> <span class="n">settle_before_discharge</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">txn_ctrl</span> <span class="o">=</span> <span class="n">txn_ctrl</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_declare</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_discharge</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">failed</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_pending</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settle_before_discharge</span> <span class="o">=</span> <span class="n">settle_before_discharge</span>
<span class="bp">self</span><span class="o">.</span><span class="n">declare</span><span class="p">()</span>
<div class="viewcode-block" id="Transaction.commit"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Transaction.commit">[docs]</a> <span class="k">def</span> <span class="nf">commit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Commit this transaction. Closes the transaction as a success.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">discharge</span><span class="p">(</span><span class="kc">False</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transaction.abort"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Transaction.abort">[docs]</a> <span class="k">def</span> <span class="nf">abort</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Abort or roll back this transaction. Closes the transaction as a failure,</span>
<span class="sd"> and reverses, or rolls back all actions (sent and received messages)</span>
<span class="sd"> performed under this transaction.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">discharge</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">declare</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">_declare</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_ctrl</span><span class="p">(</span><span class="n">symbol</span><span class="p">(</span><span class="sa">u</span><span class="s1">&#39;amqp:declare:list&#39;</span><span class="p">),</span> <span class="p">[</span><span class="kc">None</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">discharge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">failed</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">failed</span> <span class="o">=</span> <span class="n">failed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_discharge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_send_ctrl</span><span class="p">(</span><span class="n">symbol</span><span class="p">(</span><span class="sa">u</span><span class="s1">&#39;amqp:discharge:list&#39;</span><span class="p">),</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">failed</span><span class="p">])</span>
<span class="k">def</span> <span class="nf">_send_ctrl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">descriptor</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="n">delivery</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">txn_ctrl</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">Message</span><span class="p">(</span><span class="n">body</span><span class="o">=</span><span class="n">Described</span><span class="p">(</span><span class="n">descriptor</span><span class="p">,</span> <span class="n">value</span><span class="p">)))</span>
<span class="n">delivery</span><span class="o">.</span><span class="n">transaction</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">return</span> <span class="n">delivery</span>
<div class="viewcode-block" id="Transaction.send"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Transaction.send">[docs]</a> <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="n">sender</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">tag</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Send a message under this transaction.</span>
<span class="sd"> :param sender: Link over which to send the message.</span>
<span class="sd"> :type sender: :class:`proton.Sender`</span>
<span class="sd"> :param msg: Message to be sent under this transaction.</span>
<span class="sd"> :type msg: :class:`proton.Message`</span>
<span class="sd"> :param tag: The delivery tag</span>
<span class="sd"> :type tag: ``bytes``</span>
<span class="sd"> :return: Delivery object for this message.</span>
<span class="sd"> :rtype: :class:`proton.Delivery`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dlv</span> <span class="o">=</span> <span class="n">sender</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">tag</span><span class="o">=</span><span class="n">tag</span><span class="p">)</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">]</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="mh">0x34</span><span class="p">)</span>
<span class="k">return</span> <span class="n">dlv</span></div>
<div class="viewcode-block" id="Transaction.accept"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Transaction.accept">[docs]</a> <span class="k">def</span> <span class="nf">accept</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delivery</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Accept a received message under this transaction.</span>
<span class="sd"> :param delivery: Delivery object for the received message.</span>
<span class="sd"> :type delivery: :class:`proton.Delivery`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">delivery</span><span class="p">,</span> <span class="n">PN_ACCEPTED</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">settle_before_discharge</span><span class="p">:</span>
<span class="n">delivery</span><span class="o">.</span><span class="n">settle</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">_pending</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delivery</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">delivery</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">state</span><span class="p">:</span>
<span class="n">delivery</span><span class="o">.</span><span class="n">local</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">Described</span><span class="p">(</span><span class="n">ulong</span><span class="p">(</span><span class="n">state</span><span class="p">),</span> <span class="p">[])]</span>
<span class="n">delivery</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="mh">0x34</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_release_pending</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pending</span><span class="p">:</span>
<span class="n">d</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">Delivery</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">)</span>
<span class="n">d</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_clear_pending</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_clear_pending</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">_pending</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">handle_outcome</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_declare</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">data</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">id</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">remote</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">on_transaction_declared</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">remote_state</span> <span class="o">==</span> <span class="n">Delivery</span><span class="o">.</span><span class="n">REJECTED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">on_transaction_declare_failed</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Unexpected outcome for declare: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">remote_state</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">on_transaction_declare_failed</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_discharge</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">remote_state</span> <span class="o">==</span> <span class="n">Delivery</span><span class="o">.</span><span class="n">REJECTED</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">failed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">on_transaction_commit_failed</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_release_pending</span><span class="p">()</span> <span class="c1"># make this optional?</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">failed</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">on_transaction_aborted</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_release_pending</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">handler</span><span class="o">.</span><span class="n">on_transaction_committed</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_clear_pending</span><span class="p">()</span></div>
<div class="viewcode-block" id="LinkOption"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.LinkOption">[docs]</a><span class="k">class</span> <span class="nc">LinkOption</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Abstract interface for link configuration options</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="LinkOption.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.LinkOption.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Subclasses will implement any configuration logic in this</span>
<span class="sd"> method</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="LinkOption.test"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.LinkOption.test">[docs]</a> <span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Subclasses can override this to selectively apply an option</span>
<span class="sd"> e.g. based on some link criteria</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="kc">True</span></div></div>
<div class="viewcode-block" id="AtMostOnce"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.AtMostOnce">[docs]</a><span class="k">class</span> <span class="nc">AtMostOnce</span><span class="p">(</span><span class="n">LinkOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set at-most-once delivery semantics for message delivery. This is achieved by</span>
<span class="sd"> setting the sender link settle mode to :const:`proton.Link.SND_SETTLED`</span>
<span class="sd"> (ie pre-settled).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="AtMostOnce.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.AtMostOnce.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the at-most-once delivery semantics on the link.</span>
<span class="sd"> :param link: The link on which this option is to be applied.</span>
<span class="sd"> :type link: :class:`proton.Link`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">link</span><span class="o">.</span><span class="n">snd_settle_mode</span> <span class="o">=</span> <span class="n">Link</span><span class="o">.</span><span class="n">SND_SETTLED</span></div></div>
<div class="viewcode-block" id="AtLeastOnce"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.AtLeastOnce">[docs]</a><span class="k">class</span> <span class="nc">AtLeastOnce</span><span class="p">(</span><span class="n">LinkOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set at-least-once delivery semantics for message delivery. This is achieved</span>
<span class="sd"> by setting the sender link settle mode to :const:`proton.Link.SND_UNSETTLED`</span>
<span class="sd"> and the receiver link settle mode to :const:`proton.Link.RCV_FIRST`. This</span>
<span class="sd"> forces the receiver to settle all messages once they are successfully received.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="AtLeastOnce.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.AtLeastOnce.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the at-least-once delivery semantics on the link.</span>
<span class="sd"> :param link: The link on which this option is to be applied.</span>
<span class="sd"> :type link: :class:`proton.Link`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">link</span><span class="o">.</span><span class="n">snd_settle_mode</span> <span class="o">=</span> <span class="n">Link</span><span class="o">.</span><span class="n">SND_UNSETTLED</span>
<span class="n">link</span><span class="o">.</span><span class="n">rcv_settle_mode</span> <span class="o">=</span> <span class="n">Link</span><span class="o">.</span><span class="n">RCV_FIRST</span></div></div>
<div class="viewcode-block" id="SenderOption"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.SenderOption">[docs]</a><span class="k">class</span> <span class="nc">SenderOption</span><span class="p">(</span><span class="n">LinkOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Abstract class for sender options.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="SenderOption.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.SenderOption.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sender</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the option on the sender.</span>
<span class="sd"> :param sender: The sender on which this option is to be applied.</span>
<span class="sd"> :type sender: :class:`proton.Sender`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span> <span class="k">return</span> <span class="n">link</span><span class="o">.</span><span class="n">is_sender</span></div>
<div class="viewcode-block" id="ReceiverOption"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.ReceiverOption">[docs]</a><span class="k">class</span> <span class="nc">ReceiverOption</span><span class="p">(</span><span class="n">LinkOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Abstract class for receiver options</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ReceiverOption.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.ReceiverOption.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">receiver</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the option on the receiver.</span>
<span class="sd"> :param receiver: The receiver on which this option is to be applied.</span>
<span class="sd"> :type receiver: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span> <span class="k">return</span> <span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span></div>
<div class="viewcode-block" id="DynamicNodeProperties"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.DynamicNodeProperties">[docs]</a><span class="k">class</span> <span class="nc">DynamicNodeProperties</span><span class="p">(</span><span class="n">LinkOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Allows a map of link properties to be set on a link. The</span>
<span class="sd"> keys may be :class:`proton.symbol` or strings (in which case</span>
<span class="sd"> they will be converted to symbols before being applied).</span>
<span class="sd"> :param props: A map of link options to be applied to a link.</span>
<span class="sd"> :type props: ``dict``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">props</span><span class="o">=</span><span class="p">{}):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">properties</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">props</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">symbol</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">properties</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">props</span><span class="p">[</span><span class="n">k</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">properties</span><span class="p">[</span><span class="n">symbol</span><span class="p">(</span><span class="n">k</span><span class="p">)]</span> <span class="o">=</span> <span class="n">props</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
<div class="viewcode-block" id="DynamicNodeProperties.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.DynamicNodeProperties.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the map of properties on the specified link.</span>
<span class="sd"> :param link: The link on which this property map is to be set.</span>
<span class="sd"> :type link: :class:`proton.Link`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span><span class="p">:</span>
<span class="n">link</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">put_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">properties</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">link</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">properties</span><span class="o">.</span><span class="n">put_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">properties</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="Filter"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Filter">[docs]</a><span class="k">class</span> <span class="nc">Filter</span><span class="p">(</span><span class="n">ReceiverOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Receiver option which allows incoming messages to be filtered.</span>
<span class="sd"> :param filter_set: A map of filters with :class:`proton.symbol` keys</span>
<span class="sd"> containing the filter name, and the value a filter string.</span>
<span class="sd"> :type filter_set: ``dict``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filter_set</span><span class="o">=</span><span class="p">{}):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filter_set</span> <span class="o">=</span> <span class="n">filter_set</span>
<div class="viewcode-block" id="Filter.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Filter.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">receiver</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the filter on the specified receiver.</span>
<span class="sd"> :param receiver: The receiver on which this filter is to be applied.</span>
<span class="sd"> :type receiver: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">filter</span><span class="o">.</span><span class="n">put_dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filter_set</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="Selector"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Selector">[docs]</a><span class="k">class</span> <span class="nc">Selector</span><span class="p">(</span><span class="n">Filter</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Configures a receiver with a message selector filter</span>
<span class="sd"> :param value: Selector filter string</span>
<span class="sd"> :type value: ``str``</span>
<span class="sd"> :param name: Name of the selector, defaults to ``&quot;selector&quot;``.</span>
<span class="sd"> :type name: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</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="n">name</span><span class="o">=</span><span class="s1">&#39;selector&#39;</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Selector</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">({</span><span class="n">symbol</span><span class="p">(</span><span class="n">name</span><span class="p">):</span> <span class="n">Described</span><span class="p">(</span><span class="n">symbol</span><span class="p">(</span><span class="s1">&#39;apache.org:selector-filter:string&#39;</span><span class="p">),</span> <span class="n">utf82unicode</span><span class="p">(</span><span class="n">value</span><span class="p">))})</span></div>
<div class="viewcode-block" id="DurableSubscription"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.DurableSubscription">[docs]</a><span class="k">class</span> <span class="nc">DurableSubscription</span><span class="p">(</span><span class="n">ReceiverOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Receiver option which sets both the configuration and delivery state</span>
<span class="sd"> to durable. This is achieved by setting the receiver&#39;s source durability</span>
<span class="sd"> to :const:`proton.Terminus.DELIVERIES` and the source expiry policy to</span>
<span class="sd"> :const:`proton.Terminus.EXPIRE_NEVER`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="DurableSubscription.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.DurableSubscription.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">receiver</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set durability on the specified receiver.</span>
<span class="sd"> :param receiver: The receiver on which durability is to be set.</span>
<span class="sd"> :type receiver: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">durability</span> <span class="o">=</span> <span class="n">Terminus</span><span class="o">.</span><span class="n">DELIVERIES</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">expiry_policy</span> <span class="o">=</span> <span class="n">Terminus</span><span class="o">.</span><span class="n">EXPIRE_NEVER</span></div></div>
<div class="viewcode-block" id="Move"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Move">[docs]</a><span class="k">class</span> <span class="nc">Move</span><span class="p">(</span><span class="n">ReceiverOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Receiver option which moves messages to the receiver (rather than copying).</span>
<span class="sd"> This has the effect of distributing the incoming messages between the</span>
<span class="sd"> receivers. This is achieved by setting the receiver source distribution</span>
<span class="sd"> mode to :const:`proton.Terminus.DIST_MODE_MOVE`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="Move.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Move.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">receiver</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set message move semantics on the specified receiver.</span>
<span class="sd"> :param receiver: The receiver on which message move semantics is to be set.</span>
<span class="sd"> :type receiver: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">distribution_mode</span> <span class="o">=</span> <span class="n">Terminus</span><span class="o">.</span><span class="n">DIST_MODE_MOVE</span></div></div>
<div class="viewcode-block" id="Copy"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Copy">[docs]</a><span class="k">class</span> <span class="nc">Copy</span><span class="p">(</span><span class="n">ReceiverOption</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Receiver option which copies messages to the receiver. This ensures that all</span>
<span class="sd"> receivers receive all incoming messages, no matter how many receivers there</span>
<span class="sd"> are. This is achieved by setting the receiver source distribution mode to</span>
<span class="sd"> :const:`proton.Terminus.DIST_MODE_COPY`.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="Copy.apply"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Copy.apply">[docs]</a> <span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">receiver</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set message copy semantics on the specified receiver.</span>
<span class="sd"> :param receiver: The receiver on which message copy semantics is to be set.</span>
<span class="sd"> :type receiver: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">receiver</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">distribution_mode</span> <span class="o">=</span> <span class="n">Terminus</span><span class="o">.</span><span class="n">DIST_MODE_COPY</span></div></div>
<span class="k">def</span> <span class="nf">_apply_link_options</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">link</span><span class="p">):</span>
<span class="k">if</span> <span class="n">options</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
<span class="k">if</span> <span class="n">o</span><span class="o">.</span><span class="n">test</span><span class="p">(</span><span class="n">link</span><span class="p">):</span> <span class="n">o</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">link</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">options</span><span class="o">.</span><span class="n">test</span><span class="p">(</span><span class="n">link</span><span class="p">):</span> <span class="n">options</span><span class="o">.</span><span class="n">apply</span><span class="p">(</span><span class="n">link</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_create_session</span><span class="p">(</span><span class="n">connection</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">connection</span><span class="o">.</span><span class="n">session</span><span class="p">()</span>
<span class="n">session</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">return</span> <span class="n">session</span>
<span class="k">def</span> <span class="nf">_get_attr</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">target</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="n">target</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">class</span> <span class="nc">SessionPerConnection</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__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">_default_session</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</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">_default_session</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_default_session</span> <span class="o">=</span> <span class="n">_create_session</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default_session</span>
<span class="k">class</span> <span class="nc">GlobalOverrides</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler that triggers the necessary socket connect for an</span>
<span class="sd"> opened connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">base</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">base</span> <span class="o">=</span> <span class="n">base</span>
<span class="k">def</span> <span class="nf">on_unhandled</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">event</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">_override</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">event</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">base</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_override</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">conn</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span>
<span class="k">return</span> <span class="n">conn</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="s1">&#39;_overrides&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="n">conn</span><span class="o">.</span><span class="n">_overrides</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Acceptor</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reactor</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">handler</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">_ssl_domain</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span> <span class="o">=</span> <span class="n">reactor</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="n">sock</span> <span class="o">=</span> <span class="n">IO</span><span class="o">.</span><span class="n">listen</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">s</span> <span class="o">=</span> <span class="n">reactor</span><span class="o">.</span><span class="n">selectable</span><span class="p">(</span><span class="n">handler</span><span class="o">=</span><span class="bp">self</span><span class="p">,</span> <span class="n">delegate</span><span class="o">=</span><span class="n">sock</span><span class="p">)</span>
<span class="n">s</span><span class="o">.</span><span class="n">reading</span> <span class="o">=</span> <span class="kc">True</span>
<span class="n">s</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="n">s</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_ssl_domain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_ssl_domain</span> <span class="o">=</span> <span class="n">ssl_domain</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="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="o">.</span><span class="n">is_terminal</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_selectable_readable</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">selectable</span>
<span class="n">sock</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">IO</span><span class="o">.</span><span class="n">accept</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_selectable</span><span class="p">)</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Accepted connection from </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="n">r</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span>
<span class="n">handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handler</span> <span class="ow">or</span> <span class="n">r</span><span class="o">.</span><span class="n">handler</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">connection</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">c</span><span class="o">.</span><span class="n">_acceptor</span> <span class="o">=</span> <span class="bp">self</span>
<span class="n">c</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">Url</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">name</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">port</span><span class="o">=</span><span class="n">name</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">Transport</span><span class="p">(</span><span class="n">Transport</span><span class="o">.</span><span class="n">SERVER</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ssl_domain</span><span class="p">:</span>
<span class="n">t</span><span class="o">.</span><span class="n">ssl</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl_domain</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">selectable</span><span class="p">(</span><span class="n">delegate</span><span class="o">=</span><span class="n">sock</span><span class="p">)</span>
<span class="n">s</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="n">t</span>
<span class="n">t</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="n">s</span>
<span class="n">IOHandler</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">now</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Connector</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Internal handler that triggers the necessary socket connect for an</span>
<span class="sd"> opened connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="n">connection</span>
<span class="bp">self</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">heartbeat</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reconnect</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl_domain</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allow_insecure_mechs</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allowed_mechs</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sasl_enabled</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">virtual_host</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl_sni</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">max_frame_size</span> <span class="o">=</span> <span class="kc">None</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">connection</span><span class="p">):</span>
<span class="n">url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">address</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="n">connection</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="n">url</span>
<span class="c1"># if virtual-host not set, use host from address as default</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">virtual_host</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">connection</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">host</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;connecting to </span><span class="si">%r</span><span class="s2">...&quot;</span> <span class="o">%</span> <span class="n">url</span><span class="p">)</span>
<span class="n">transport</span> <span class="o">=</span> <span class="n">Transport</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sasl_enabled</span><span class="p">:</span>
<span class="n">sasl</span> <span class="o">=</span> <span class="n">transport</span><span class="o">.</span><span class="n">sasl</span><span class="p">()</span>
<span class="n">sasl</span><span class="o">.</span><span class="n">allow_insecure_mechs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_insecure_mechs</span>
<span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">username</span><span class="p">:</span>
<span class="n">connection</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">username</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">:</span>
<span class="n">connection</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span>
<span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">password</span><span class="p">:</span>
<span class="n">connection</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">password</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">:</span>
<span class="n">connection</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allowed_mechs</span><span class="p">:</span>
<span class="n">sasl</span><span class="o">.</span><span class="n">allowed_mechs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">allowed_mechs</span><span class="p">)</span>
<span class="n">transport</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">connection</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">heartbeat</span><span class="p">:</span>
<span class="n">transport</span><span class="o">.</span><span class="n">idle_timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">heartbeat</span>
<span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">scheme</span> <span class="o">==</span> <span class="s1">&#39;amqps&#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">ssl_domain</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SSLUnavailable</span><span class="p">(</span><span class="s2">&quot;amqps: SSL libraries not found&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">SSL</span><span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl_domain</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">peer_hostname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl_sni</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">virtual_host</span> <span class="ow">or</span> <span class="n">url</span><span class="o">.</span><span class="n">host</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_frame_size</span><span class="p">:</span>
<span class="n">transport</span><span class="o">.</span><span class="n">max_frame_size</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_frame_size</span>
<span class="k">def</span> <span class="nf">on_connection_local_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_connect</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_connection_remote_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;connected to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">hostname</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reconnect</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">reconnect</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_transport_closed</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span> <span class="k">return</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">state</span> <span class="o">&amp;</span> <span class="n">Endpoint</span><span class="o">.</span><span class="n">LOCAL_ACTIVE</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">reconnect</span><span class="p">:</span>
<span class="n">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">unbind</span><span class="p">()</span>
<span class="n">delay</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">reconnect</span><span class="o">.</span><span class="n">next</span><span class="p">()</span>
<span class="k">if</span> <span class="n">delay</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Disconnected, reconnecting...&quot;</span><span class="p">)</span>
<span class="bp">self</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">connection</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Disconnected will try to reconnect after </span><span class="si">%s</span><span class="s2"> seconds&quot;</span> <span class="o">%</span> <span class="n">delay</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">reactor</span><span class="o">.</span><span class="n">schedule</span><span class="p">(</span><span class="n">delay</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Disconnected&quot;</span><span class="p">)</span>
<span class="c1"># See connector.cpp: conn.free()/pn_connection_release() here?</span>
<span class="bp">self</span><span class="o">.</span><span class="n">connection</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">on_timer_task</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="bp">self</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">connection</span><span class="p">)</span>
<div class="viewcode-block" id="Backoff"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Backoff">[docs]</a><span class="k">class</span> <span class="nc">Backoff</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A reconnect strategy involving an increasing delay between</span>
<span class="sd"> retries, up to a maximum or 10 seconds. Repeated calls</span>
<span class="sd"> to :meth:`next` returns a value for the next delay, starting</span>
<span class="sd"> with an initial value of 0 seconds.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__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">delay</span> <span class="o">=</span> <span class="mi">0</span>
<div class="viewcode-block" id="Backoff.reset"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Backoff.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Reset the backoff delay to 0 seconds.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="mi">0</span></div>
<div class="viewcode-block" id="Backoff.next"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Backoff.next">[docs]</a> <span class="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Start the next delay in the sequence of delays. The first</span>
<span class="sd"> delay is 0 seconds, the second 0.1 seconds, and each subsequent</span>
<span class="sd"> call to :meth:`next` doubles the next delay period until a</span>
<span class="sd"> maximum value of 10 seconds is reached.</span>
<span class="sd"> :return: The next delay in seconds.</span>
<span class="sd"> :rtype: ``float``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">delay</span>
<span class="k">if</span> <span class="n">current</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">delay</span> <span class="o">=</span> <span class="mf">0.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">current</span><span class="p">)</span>
<span class="k">return</span> <span class="n">current</span></div></div>
<span class="k">class</span> <span class="nc">Urls</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">values</span> <span class="o">=</span> <span class="p">[</span><span class="n">Url</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">values</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__iter__</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="k">def</span> <span class="nf">next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">i</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">i</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">values</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">i</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">SSLConfig</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__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">client</span> <span class="o">=</span> <span class="n">SSLDomain</span><span class="p">(</span><span class="n">SSLDomain</span><span class="o">.</span><span class="n">MODE_CLIENT</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span> <span class="o">=</span> <span class="n">SSLDomain</span><span class="p">(</span><span class="n">SSLDomain</span><span class="o">.</span><span class="n">MODE_SERVER</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_credentials</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cert_file</span><span class="p">,</span> <span class="n">key_file</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">set_credentials</span><span class="p">(</span><span class="n">cert_file</span><span class="p">,</span> <span class="n">key_file</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">set_credentials</span><span class="p">(</span><span class="n">cert_file</span><span class="p">,</span> <span class="n">key_file</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">set_trusted_ca_db</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_db</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">set_trusted_ca_db</span><span class="p">(</span><span class="n">certificate_db</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">server</span><span class="o">.</span><span class="n">set_trusted_ca_db</span><span class="p">(</span><span class="n">certificate_db</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_find_config_file</span><span class="p">():</span>
<span class="n">confname</span> <span class="o">=</span> <span class="s1">&#39;connect.json&#39;</span>
<span class="n">confpath</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s1">&#39;~/.config/messaging&#39;</span><span class="p">),</span> <span class="s1">&#39;/etc/messaging&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">confpath</span><span class="p">:</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">confname</span><span class="p">)</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
<span class="k">return</span> <span class="n">f</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_get_default_config</span><span class="p">():</span>
<span class="n">conf</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MESSAGING_CONNECT_FILE&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">_find_config_file</span><span class="p">()</span>
<span class="k">if</span> <span class="n">conf</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">conf</span><span class="p">):</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">conf</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json_text</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">json_text</span> <span class="o">=</span> <span class="n">_strip_json_comments</span><span class="p">(</span><span class="n">json_text</span><span class="p">)</span>
<span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_text</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">def</span> <span class="nf">_strip_json_comments</span><span class="p">(</span><span class="n">json_text</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;This strips c-style comments from text, taking into account &#39;/*comments*/&#39; and &#39;//comments&#39;</span>
<span class="sd"> nested inside a string etc.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="nf">replacer</span><span class="p">(</span><span class="n">match</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">match</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="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot; &quot;</span> <span class="c1"># note: a space and not an empty string</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">s</span>
<span class="n">pattern</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;//.*?$|/\*.*?\*/|</span><span class="se">\&#39;</span><span class="s1">(?:</span><span class="se">\\</span><span class="s1">.|[^</span><span class="se">\\\&#39;</span><span class="s1">])*</span><span class="se">\&#39;</span><span class="s1">|&quot;(?:</span><span class="se">\\</span><span class="s1">.|[^</span><span class="se">\\</span><span class="s1">&quot;])*&quot;&#39;</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span>
<span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">replacer</span><span class="p">,</span> <span class="n">json_text</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_get_default_port_for_scheme</span><span class="p">(</span><span class="n">scheme</span><span class="p">):</span>
<span class="k">if</span> <span class="n">scheme</span> <span class="o">==</span> <span class="s1">&#39;amqps&#39;</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">5671</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="mi">5672</span>
<div class="viewcode-block" id="Container"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container">[docs]</a><span class="k">class</span> <span class="nc">Container</span><span class="p">(</span><span class="n">Reactor</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A representation of the AMQP concept of a &#39;container&#39;, which</span>
<span class="sd"> loosely speaking is something that establishes links to or from</span>
<span class="sd"> another container, over which messages are transfered. This is</span>
<span class="sd"> an extension to the Reactor class that adds convenience methods</span>
<span class="sd"> for creating connections and sender- or receiver- links.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">handlers</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">Container</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">handlers</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;impl&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">SSLConfig</span><span class="p">()</span>
<span class="k">except</span> <span class="n">SSLUnavailable</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">global_handler</span> <span class="o">=</span> <span class="n">GlobalOverrides</span><span class="p">(</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;global_handler&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">global_handler</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">trigger</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">container_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">_generate_uuid</span><span class="p">())</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allow_insecure_mechs</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allowed_mechs</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">sasl_enabled</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="kc">None</span>
<div class="viewcode-block" id="Container.connect"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.connect">[docs]</a> <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">url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">urls</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">address</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">reconnect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">heartbeat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initiates the establishment of an AMQP connection.</span>
<span class="sd"> An optional JSON configuration file may be used to specify some connection</span>
<span class="sd"> parameters. If present, these will override some of those given in this call</span>
<span class="sd"> (see note below). Some connection parameters (for SSL/TLS) can only be</span>
<span class="sd"> provided through this file. The configuration file is located by searching</span>
<span class="sd"> for it as follows:</span>
<span class="sd"> 1. The location set in the environment variable ``MESSAGING_CONNECT_FILE``</span>
<span class="sd"> 2. ``.connect.json``</span>
<span class="sd"> 3. ``~/.config/messaging/connect.json``</span>
<span class="sd"> 4. ``/etc/messaging/connect.json``</span>
<span class="sd"> To use SSL/TLS for encryption (when an ``amqps`` URL scheme is used), the above</span>
<span class="sd"> configuration file must contain a ``tls`` submap containing the following</span>
<span class="sd"> configuration entries (See :class:`proton.SSLDomain` for details):</span>
<span class="sd"> </span>
<span class="sd"> * ``ca``: Path to a database of trusted CAs that the server will advertise.</span>
<span class="sd"> * ``cert``: Path to a file/database containing the identifying certificate.</span>
<span class="sd"> * ``key``: An optional key to access the identifying certificate.</span>
<span class="sd"> * ``verify``: If ``True``, verify the peer name</span>
<span class="sd"> (:const:`proton.SSLDomain.VERIFY_PEER_NAME`) and certificate using the</span>
<span class="sd"> ``ca`` above.</span>
<span class="sd"> :param url: URL string of process to connect to</span>
<span class="sd"> :type url: ``str``</span>
<span class="sd"> :param urls: list of URL strings of process to try to connect to</span>
<span class="sd"> :type urls: ``[str, str, ...]``</span>
<span class="sd"> :param reconnect: Reconnect is enabled by default. You can</span>
<span class="sd"> pass in an instance of :class:`Backoff` to control reconnect behavior.</span>
<span class="sd"> A value of ``False`` will prevent the library from automatically</span>
<span class="sd"> trying to reconnect if the underlying socket is disconnected</span>
<span class="sd"> before the connection has been closed.</span>
<span class="sd"> :type reconnect: :class:`Backoff` or ``bool``</span>
<span class="sd"> :param heartbeat: A value in seconds indicating the</span>
<span class="sd"> desired frequency of heartbeats used to test the underlying</span>
<span class="sd"> socket is alive.</span>
<span class="sd"> :type heartbeat: ``float``</span>
<span class="sd"> :param ssl_domain: SSL configuration.</span>
<span class="sd"> :type ssl_domain: :class:`proton.SSLDomain`</span>
<span class="sd"> :param handler: a connection scoped handler that will be</span>
<span class="sd"> called to process any events in the scope of this connection</span>
<span class="sd"> or its child links.</span>
<span class="sd"> :type handler: Any child of :class:`proton.Events.Handler`</span>
<span class="sd"> :param kwargs:</span>
<span class="sd"> * ``sasl_enabled`` (``bool``), which determines whether a sasl layer</span>
<span class="sd"> is used for the connection.</span>
<span class="sd"> * ``allowed_mechs`` (``str``), an optional string specifying the</span>
<span class="sd"> SASL mechanisms allowed for this connection; the value is a</span>
<span class="sd"> space-separated list of mechanism names; the mechanisms allowed</span>
<span class="sd"> by default are determined by your SASL library and system</span>
<span class="sd"> configuration, with two exceptions: ``GSSAPI`` and ``GSS-SPNEGO``</span>
<span class="sd"> are disabled by default; to enable them, you must explicitly add</span>
<span class="sd"> them using this option; clients must set the allowed mechanisms</span>
<span class="sd"> before the outgoing connection is attempted; servers must set</span>
<span class="sd"> them before the listening connection is setup.</span>
<span class="sd"> * ``allow_insecure_mechs`` (``bool``), a flag indicating whether insecure</span>
<span class="sd"> mechanisms, such as PLAIN over a non-encrypted socket, are</span>
<span class="sd"> allowed.</span>
<span class="sd"> * ``password`` (``str``), the authentication secret. Ignored without ``user``</span>
<span class="sd"> kwarg also being present.</span>
<span class="sd"> * ``user`` (``str``), the user to authenticate.</span>
<span class="sd"> * ``virtual_host`` (``str``), the hostname to set in the Open performative</span>
<span class="sd"> used by peer to determine the correct back-end service for</span>
<span class="sd"> the client; if ``virtual_host`` is not supplied the host field</span>
<span class="sd"> from the URL is used instead.</span>
<span class="sd"> * ``offered_capabilities``, a list of capabilities being offered to the</span>
<span class="sd"> peer. The list must contain symbols (or strings, which will be converted</span>
<span class="sd"> to symbols).</span>
<span class="sd"> * ``desired_capabilities``, a list of capabilities desired from the peer.</span>
<span class="sd"> The list must contain symbols (or strings, which will be converted</span>
<span class="sd"> to symbols).</span>
<span class="sd"> * ``properties``, a list of connection properties. This must be a map</span>
<span class="sd"> with symbol keys (or string keys, which will be converted to symbol keys).</span>
<span class="sd"> * ``sni`` (``str``), a hostname to use with SSL/TLS Server Name Indication (SNI)</span>
<span class="sd"> * ``max_frame_size`` (``int``), the maximum allowable TCP packet size between the</span>
<span class="sd"> peers.</span>
<span class="sd"> :return: A new connection object.</span>
<span class="sd"> :rtype: :class:`proton.Connection`</span>
<span class="sd"> .. note:: Only one of ``url`` or ``urls`` should be specified.</span>
<span class="sd"> .. note:: The following kwargs will be overridden by the values found</span>
<span class="sd"> in the JSON configuration file (if they exist there):</span>
<span class="sd"> * ``password``</span>
<span class="sd"> * ``user``</span>
<span class="sd"> and the following kwargs will be overridden by the values found in the ``sasl``</span>
<span class="sd"> sub-map of the above configuration file (if they exist there):</span>
<span class="sd"> * ``sasl_enabled``</span>
<span class="sd"> * ``allowed_mechs``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">url</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">urls</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">address</span><span class="p">:</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">_get_default_config</span><span class="p">()</span>
<span class="n">scheme</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;scheme&#39;</span><span class="p">,</span> <span class="s1">&#39;amqps&#39;</span><span class="p">)</span>
<span class="n">_url</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">://</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">scheme</span><span class="p">,</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;host&#39;</span><span class="p">,</span> <span class="s1">&#39;localhost&#39;</span><span class="p">),</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;port&#39;</span><span class="p">,</span> <span class="n">_get_default_port_for_scheme</span><span class="p">(</span><span class="n">scheme</span><span class="p">)))</span>
<span class="n">_ssl_domain</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">_kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
<span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;user&#39;</span><span class="p">):</span>
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">&#39;user&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;user&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;password&#39;</span><span class="p">):</span>
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">&#39;password&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;password&#39;</span><span class="p">)</span>
<span class="n">sasl_config</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;sasl&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">&#39;sasl_enabled&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sasl_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;enabled&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sasl_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;mechanisms&#39;</span><span class="p">):</span>
<span class="n">_kwargs</span><span class="p">[</span><span class="s1">&#39;allowed_mechs&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">sasl_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;mechanisms&#39;</span><span class="p">)</span>
<span class="n">tls_config</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tls&#39;</span><span class="p">,</span> <span class="p">{})</span>
<span class="k">if</span> <span class="n">scheme</span> <span class="o">==</span> <span class="s1">&#39;amqps&#39;</span><span class="p">:</span>
<span class="n">_ssl_domain</span> <span class="o">=</span> <span class="n">SSLDomain</span><span class="p">(</span><span class="n">SSLDomain</span><span class="o">.</span><span class="n">MODE_CLIENT</span><span class="p">)</span>
<span class="n">ca</span> <span class="o">=</span> <span class="n">tls_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;ca&#39;</span><span class="p">)</span>
<span class="n">cert</span> <span class="o">=</span> <span class="n">tls_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;cert&#39;</span><span class="p">)</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">tls_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;key&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ca</span><span class="p">:</span>
<span class="n">_ssl_domain</span><span class="o">.</span><span class="n">set_trusted_ca_db</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ca</span><span class="p">))</span>
<span class="k">if</span> <span class="n">tls_config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;verify&#39;</span><span class="p">,</span> <span class="kc">True</span><span class="p">):</span>
<span class="n">_ssl_domain</span><span class="o">.</span><span class="n">set_peer_authentication</span><span class="p">(</span><span class="n">SSLDomain</span><span class="o">.</span><span class="n">VERIFY_PEER_NAME</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ca</span><span class="p">))</span>
<span class="k">if</span> <span class="n">cert</span> <span class="ow">and</span> <span class="n">key</span><span class="p">:</span>
<span class="n">_ssl_domain</span><span class="o">.</span><span class="n">set_credentials</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">cert</span><span class="p">),</span> <span class="nb">str</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">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_connect</span><span class="p">(</span><span class="n">_url</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">handler</span><span class="p">,</span> <span class="n">reconnect</span><span class="o">=</span><span class="n">reconnect</span><span class="p">,</span> <span class="n">heartbeat</span><span class="o">=</span><span class="n">heartbeat</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="o">=</span><span class="n">_ssl_domain</span><span class="p">,</span> <span class="o">**</span><span class="n">_kwargs</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">_connect</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="n">url</span><span class="p">,</span> <span class="n">urls</span><span class="o">=</span><span class="n">urls</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">handler</span><span class="p">,</span> <span class="n">reconnect</span><span class="o">=</span><span class="n">reconnect</span><span class="p">,</span> <span class="n">heartbeat</span><span class="o">=</span><span class="n">heartbeat</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="o">=</span><span class="n">ssl_domain</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div>
<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">url</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">urls</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">address</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">reconnect</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">heartbeat</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">conn</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connection</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">container</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">container_id</span> <span class="ow">or</span> <span class="nb">str</span><span class="p">(</span><span class="n">_generate_uuid</span><span class="p">())</span>
<span class="n">conn</span><span class="o">.</span><span class="n">offered_capabilities</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;offered_capabilities&#39;</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">desired_capabilities</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;desired_capabilities&#39;</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">properties</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;properties&#39;</span><span class="p">)</span>
<span class="n">connector</span> <span class="o">=</span> <span class="n">Connector</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">allow_insecure_mechs</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;allow_insecure_mechs&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_insecure_mechs</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">allowed_mechs</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;allowed_mechs&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">allowed_mechs</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">sasl_enabled</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;sasl_enabled&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sasl_enabled</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;user&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;password&#39;</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">connector</span><span class="o">.</span><span class="n">virtual_host</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;virtual_host&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">connector</span><span class="o">.</span><span class="n">virtual_host</span><span class="p">:</span>
<span class="c1"># only set hostname if virtual-host is a non-empty string</span>
<span class="n">conn</span><span class="o">.</span><span class="n">hostname</span> <span class="o">=</span> <span class="n">connector</span><span class="o">.</span><span class="n">virtual_host</span>
<span class="n">connector</span><span class="o">.</span><span class="n">ssl_sni</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;sni&#39;</span><span class="p">)</span>
<span class="n">connector</span><span class="o">.</span><span class="n">max_frame_size</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;max_frame_size&#39;</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">_overrides</span> <span class="o">=</span> <span class="n">connector</span>
<span class="k">if</span> <span class="n">url</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">Urls</span><span class="p">([</span><span class="n">url</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">urls</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">Urls</span><span class="p">(</span><span class="n">urls</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">address</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">address</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;One of url, urls or address required&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">heartbeat</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">heartbeat</span> <span class="o">=</span> <span class="n">heartbeat</span>
<span class="k">if</span> <span class="n">reconnect</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">reconnect</span> <span class="o">=</span> <span class="n">reconnect</span>
<span class="k">elif</span> <span class="n">reconnect</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">connector</span><span class="o">.</span><span class="n">reconnect</span> <span class="o">=</span> <span class="n">Backoff</span><span class="p">()</span>
<span class="c1"># use container&#39;s default client domain if none specified. This is</span>
<span class="c1"># only necessary of the URL specifies the &quot;amqps:&quot; scheme</span>
<span class="n">connector</span><span class="o">.</span><span class="n">ssl_domain</span> <span class="o">=</span> <span class="n">ssl_domain</span> <span class="ow">or</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">client</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">_session_policy</span> <span class="o">=</span> <span class="n">SessionPerConnection</span><span class="p">()</span> <span class="c1"># todo: make configurable</span>
<span class="n">conn</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">return</span> <span class="n">conn</span>
<span class="k">def</span> <span class="nf">_get_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">,</span> <span class="n">remote</span><span class="p">,</span> <span class="n">local</span><span class="p">):</span>
<span class="k">if</span> <span class="n">local</span> <span class="ow">and</span> <span class="n">remote</span><span class="p">:</span>
<span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">remote</span><span class="p">,</span> <span class="n">local</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">local</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">local</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">remote</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="n">remote</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">container</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">_generate_uuid</span><span class="p">()))</span>
<span class="k">def</span> <span class="nf">_get_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">Url</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">url</span><span class="o">=</span><span class="n">context</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">Session</span><span class="p">):</span>
<span class="k">return</span> <span class="n">context</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">Connection</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="s1">&#39;_session_policy&#39;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">_session_policy</span><span class="o">.</span><span class="n">session</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_create_session</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">context</span><span class="o">.</span><span class="n">session</span><span class="p">()</span>
<div class="viewcode-block" id="Container.create_sender"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.create_sender">[docs]</a> <span class="k">def</span> <span class="nf">create_sender</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">tags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initiates the establishment of a link over which messages can</span>
<span class="sd"> be sent.</span>
<span class="sd"> There are two patterns of use:</span>
<span class="sd"> 1. A connection can be passed as the first argument, in which</span>
<span class="sd"> case the link is established on that connection. In this case</span>
<span class="sd"> the target address can be specified as the second argument (or</span>
<span class="sd"> as a keyword argument). The source address can also be specified</span>
<span class="sd"> if desired.</span>
<span class="sd"> 2. Alternatively a URL can be passed as the first argument. In</span>
<span class="sd"> this case a new connection will be established on which the link</span>
<span class="sd"> will be attached. If a path is specified and the target is not,</span>
<span class="sd"> then the path of the URL is used as the target address.</span>
<span class="sd"> The name of the link may be specified if desired, otherwise a</span>
<span class="sd"> unique name will be generated.</span>
<span class="sd"> Various :class:`LinkOption` s can be specified to further control the</span>
<span class="sd"> attachment.</span>
<span class="sd"> :param context: A connection object or a URL.</span>
<span class="sd"> :type context: :class:`proton.Connection` or ``str``</span>
<span class="sd"> :param target: Address of target node.</span>
<span class="sd"> :type target: ``str``</span>
<span class="sd"> :param source: Address of source node.</span>
<span class="sd"> :type source: ``str``</span>
<span class="sd"> :param name: Sender name.</span>
<span class="sd"> :type name: ``str``</span>
<span class="sd"> :param handler: Event handler for this sender.</span>
<span class="sd"> :type handler: Any child class of :class:`proton.Handler`</span>
<span class="sd"> :param tags: Function to generate tags for this sender of the form ``def simple_tags():`` and returns a ``bytes`` type</span>
<span class="sd"> :type tags: function pointer</span>
<span class="sd"> :param options: A single option, or a list of sender options</span>
<span class="sd"> :type options: :class:`SenderOption` or [SenderOption, SenderOption, ...]</span>
<span class="sd"> :return: New sender instance.</span>
<span class="sd"> :rtype: :class:`proton.Sender`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">isstring</span><span class="p">(</span><span class="n">context</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="n">Url</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">Url</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">target</span><span class="p">:</span>
<span class="n">target</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">path</span>
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_session</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="n">snd</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">sender</span><span class="p">(</span><span class="n">name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_id</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">container</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">source</span><span class="p">))</span>
<span class="k">if</span> <span class="n">source</span><span class="p">:</span>
<span class="n">snd</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">source</span>
<span class="k">if</span> <span class="n">target</span><span class="p">:</span>
<span class="n">snd</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">target</span>
<span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">snd</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="k">if</span> <span class="n">tags</span><span class="p">:</span>
<span class="n">snd</span><span class="o">.</span><span class="n">tag_generator</span> <span class="o">=</span> <span class="n">tags</span>
<span class="n">_apply_link_options</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">snd</span><span class="p">)</span>
<span class="n">snd</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">return</span> <span class="n">snd</span></div>
<div class="viewcode-block" id="Container.create_receiver"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.create_receiver">[docs]</a> <span class="k">def</span> <span class="nf">create_receiver</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">source</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">dynamic</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initiates the establishment of a link over which messages can</span>
<span class="sd"> be received (aka a subscription).</span>
<span class="sd"> There are two patterns of use:</span>
<span class="sd"> (1) A connection can be passed as the first argument, in which</span>
<span class="sd"> case the link is established on that connection. In this case</span>
<span class="sd"> the source address can be specified as the second argument (or</span>
<span class="sd"> as a keyword argument). The target address can also be specified</span>
<span class="sd"> if desired.</span>
<span class="sd"> (2) Alternatively a URL can be passed as the first argument. In</span>
<span class="sd"> this case a new connection will be established on which the link</span>
<span class="sd"> will be attached. If a path is specified and the source is not,</span>
<span class="sd"> then the path of the URL is used as the target address.</span>
<span class="sd"> The name of the link may be specified if desired, otherwise a</span>
<span class="sd"> unique name will be generated.</span>
<span class="sd"> Various :class:`LinkOption` s can be specified to further control the</span>
<span class="sd"> attachment.</span>
<span class="sd"> :param context: A connection object or a URL.</span>
<span class="sd"> :type context: :class:`proton.Connection` or ``str``</span>
<span class="sd"> :param source: Address of source node.</span>
<span class="sd"> :type source: ``str``</span>
<span class="sd"> :param target: Address of target node.</span>
<span class="sd"> :type target: ``str``</span>
<span class="sd"> :param name: Receiver name.</span>
<span class="sd"> :type name: ``str``</span>
<span class="sd"> :param dynamic: If ``True``, indicates dynamic creation of the receiver.</span>
<span class="sd"> :type dynamic: ``bool``</span>
<span class="sd"> :param handler: Event handler for this receiver.</span>
<span class="sd"> :type handler: Any child class of :class:`proton.Handler`</span>
<span class="sd"> :param options: A single option, or a list of receiver options</span>
<span class="sd"> :type options: :class:`ReceiverOption` or [ReceiverOption, ReceiverOption, ...]</span>
<span class="sd"> :return: New receiver instance.</span>
<span class="sd"> :rtype: :class:`proton.Receiver`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">isstring</span><span class="p">(</span><span class="n">context</span><span class="p">):</span>
<span class="n">context</span> <span class="o">=</span> <span class="n">Url</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="n">Url</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">source</span><span class="p">:</span>
<span class="n">source</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="n">path</span>
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_session</span><span class="p">(</span><span class="n">context</span><span class="p">)</span>
<span class="n">rcv</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">receiver</span><span class="p">(</span><span class="n">name</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_id</span><span class="p">(</span><span class="n">session</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">container</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">target</span><span class="p">))</span>
<span class="k">if</span> <span class="n">source</span><span class="p">:</span>
<span class="n">rcv</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">source</span>
<span class="k">if</span> <span class="n">dynamic</span><span class="p">:</span>
<span class="n">rcv</span><span class="o">.</span><span class="n">source</span><span class="o">.</span><span class="n">dynamic</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">target</span><span class="p">:</span>
<span class="n">rcv</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">target</span>
<span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">rcv</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
<span class="n">_apply_link_options</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">rcv</span><span class="p">)</span>
<span class="n">rcv</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">return</span> <span class="n">rcv</span></div>
<div class="viewcode-block" id="Container.declare_transaction"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.declare_transaction">[docs]</a> <span class="k">def</span> <span class="nf">declare_transaction</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">settle_before_discharge</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Declare a local transaction.</span>
<span class="sd"> :param context: Context for the transaction, usually the connection.</span>
<span class="sd"> :type context: :class:`proton.Connection`</span>
<span class="sd"> :param handler: Handler for transactional events.</span>
<span class="sd"> :type handler: :class:`proton.handlers.TransactionHandler`</span>
<span class="sd"> :param settle_before_discharge: Settle all transaction control messages before</span>
<span class="sd"> the transaction is discharged.</span>
<span class="sd"> :type settle_before_discharge: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">_get_attr</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="s1">&#39;_txn_ctrl&#39;</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">InternalTransactionHandler</span><span class="p">(</span><span class="n">OutgoingMessageHandler</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">InternalTransactionHandler</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">auto_settle</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_settled</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="p">,</span> <span class="s2">&quot;transaction&quot;</span><span class="p">):</span>
<span class="n">event</span><span class="o">.</span><span class="n">transaction</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">transaction</span>
<span class="n">event</span><span class="o">.</span><span class="n">delivery</span><span class="o">.</span><span class="n">transaction</span><span class="o">.</span><span class="n">handle_outcome</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_unhandled</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">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">handler</span><span class="p">:</span>
<span class="n">event</span><span class="o">.</span><span class="n">dispatch</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">context</span><span class="o">.</span><span class="n">_txn_ctrl</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_sender</span><span class="p">(</span><span class="n">context</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">&#39;txn-ctrl&#39;</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="n">InternalTransactionHandler</span><span class="p">())</span>
<span class="n">context</span><span class="o">.</span><span class="n">_txn_ctrl</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">Terminus</span><span class="o">.</span><span class="n">COORDINATOR</span>
<span class="n">context</span><span class="o">.</span><span class="n">_txn_ctrl</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">capabilities</span><span class="o">.</span><span class="n">put_object</span><span class="p">(</span><span class="n">symbol</span><span class="p">(</span><span class="sa">u</span><span class="s1">&#39;amqp:local-transactions&#39;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">Transaction</span><span class="p">(</span><span class="n">context</span><span class="o">.</span><span class="n">_txn_ctrl</span><span class="p">,</span> <span class="n">handler</span><span class="p">,</span> <span class="n">settle_before_discharge</span><span class="p">)</span></div>
<div class="viewcode-block" id="Container.listen"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.listen">[docs]</a> <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">ssl_domain</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Initiates a server socket, accepting incoming AMQP connections</span>
<span class="sd"> on the interface and port specified.</span>
<span class="sd"> :param url: URL on which to listen for incoming AMQP connections.</span>
<span class="sd"> :type url: ``str`` or :class:`Url`</span>
<span class="sd"> :param ssl_domain: SSL configuration object if SSL is to be used, ``None`` otherwise.</span>
<span class="sd"> :type ssl_domain: :class:`proton.SSLDomain` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">Url</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
<span class="n">acceptor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">acceptor</span><span class="p">(</span><span class="n">url</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">url</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
<span class="n">ssl_config</span> <span class="o">=</span> <span class="n">ssl_domain</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ssl_config</span> <span class="ow">and</span> <span class="n">url</span><span class="o">.</span><span class="n">scheme</span> <span class="o">==</span> <span class="s1">&#39;amqps&#39;</span><span class="p">:</span>
<span class="c1"># use container&#39;s default server domain</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">:</span>
<span class="n">ssl_config</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">server</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SSLUnavailable</span><span class="p">(</span><span class="s2">&quot;amqps: SSL libraries not found&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssl_config</span><span class="p">:</span>
<span class="n">acceptor</span><span class="o">.</span><span class="n">set_ssl_domain</span><span class="p">(</span><span class="n">ssl_config</span><span class="p">)</span>
<span class="k">return</span> <span class="n">acceptor</span></div>
<div class="viewcode-block" id="Container.do_work"><a class="viewcode-back" href="../../proton.reactor.html#proton.reactor.Container.do_work">[docs]</a> <span class="k">def</span> <span class="nf">do_work</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">timeout</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">process</span><span class="p">()</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="nav-item nav-item-0"><a href="../../index.html">Qpid Proton Python API 0.32.0 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">proton._reactor</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2019, Apache Qpid Contributors.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>