blob: ce782e7011172c9f6497bcf021168e3afefdf5df [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>proton._handlers &#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._handlers</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for proton._handlers</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="kn">import</span> <span class="nn">errno</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">weakref</span>
<span class="kn">from</span> <span class="nn">._condition</span> <span class="kn">import</span> <span class="n">Condition</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">Endpoint</span>
<span class="kn">from</span> <span class="nn">._events</span> <span class="kn">import</span> <span class="n">Event</span><span class="p">,</span> <span class="n">Handler</span><span class="p">,</span> <span class="n">_dispatch</span>
<span class="kn">from</span> <span class="nn">._exceptions</span> <span class="kn">import</span> <span class="n">ProtonException</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">._message</span> <span class="kn">import</span> <span class="n">Message</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">._transport</span> <span class="kn">import</span> <span class="n">Transport</span>
<span class="kn">from</span> <span class="nn">._url</span> <span class="kn">import</span> <span class="n">Url</span>
<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;proton&quot;</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">OutgoingMessageHandler</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A utility for simpler and more intuitive handling of delivery</span>
<span class="sd"> events related to outgoing i.e. sent messages.</span>
<span class="sd"> :param auto_settle: If ``True``, settle all messages (default). Otherwise</span>
<span class="sd"> messages must be explicitly settled.</span>
<span class="sd"> :type auto_settle: ``bool``</span>
<span class="sd"> :param delegate: A client handler for the endpoint event</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">auto_settle</span><span class="o">=</span><span class="kc">True</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="bp">self</span><span class="o">.</span><span class="n">auto_settle</span> <span class="o">=</span> <span class="n">auto_settle</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="n">delegate</span>
<span class="k">def</span> <span class="nf">on_link_flow</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">link</span><span class="o">.</span><span class="n">is_sender</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">credit</span> \
<span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">link</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="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">link</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">REMOTE_ACTIVE</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_sendable</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_delivery</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">dlv</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span>
<span class="k">if</span> <span class="n">dlv</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">is_sender</span> <span class="ow">and</span> <span class="n">dlv</span><span class="o">.</span><span class="n">updated</span><span class="p">:</span>
<span class="k">if</span> <span class="n">dlv</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">ACCEPTED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_accepted</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">dlv</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">on_rejected</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">dlv</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">RELEASED</span> <span class="ow">or</span> <span class="n">dlv</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">MODIFIED</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_released</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dlv</span><span class="o">.</span><span class="n">settled</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_settled</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">auto_settle</span><span class="p">:</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_sendable</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"> Called when the sender link has credit and messages can</span>
<span class="sd"> therefore be transferred.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_sendable&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_accepted</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"> Called when the remote peer accepts an outgoing message.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_accepted&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_rejected</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"> Called when the remote peer rejects an outgoing message.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_rejected&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_released</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"> Called when the remote peer releases an outgoing message. Note</span>
<span class="sd"> that this may be in response to either the ``RELEASE`` or ``MODIFIED``</span>
<span class="sd"> state as defined by the AMQP specification.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_released&#39;</span><span class="p">,</span> <span class="n">event</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the remote peer has settled the outgoing</span>
<span class="sd"> message. This is the point at which it should never be</span>
<span class="sd"> retransmitted.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_settled&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">recv_msg</span><span class="p">(</span><span class="n">delivery</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
<span class="n">msg</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">delivery</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">delivery</span><span class="o">.</span><span class="n">pending</span><span class="p">))</span>
<span class="n">delivery</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">advance</span><span class="p">()</span>
<span class="k">return</span> <span class="n">msg</span>
<div class="viewcode-block" id="Reject"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.Reject">[docs]</a><span class="k">class</span> <span class="nc">Reject</span><span class="p">(</span><span class="n">ProtonException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An exception that indicates a message should be rejected.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="Release"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.Release">[docs]</a><span class="k">class</span> <span class="nc">Release</span><span class="p">(</span><span class="n">ProtonException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An exception that indicates a message should be released.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<span class="k">class</span> <span class="nc">Acking</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 class containing methods for handling received messages.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<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"> Accepts a received message.</span>
<span class="sd"> .. note:: This method cannot currently be used in combination</span>
<span class="sd"> with transactions. See :class:`proton.reactor.Transaction`</span>
<span class="sd"> for transactional methods.</span>
<span class="sd"> :param delivery: The message delivery tracking object</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">settle</span><span class="p">(</span><span class="n">delivery</span><span class="p">,</span> <span class="n">Delivery</span><span class="o">.</span><span class="n">ACCEPTED</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">reject</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"> Rejects a received message that is considered invalid or</span>
<span class="sd"> unprocessable.</span>
<span class="sd"> .. note:: This method cannot currently be used in combination</span>
<span class="sd"> with transactions. See :class:`proton.reactor.Transaction`</span>
<span class="sd"> for transactional methods.</span>
<span class="sd"> :param delivery: The message delivery tracking object</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">settle</span><span class="p">(</span><span class="n">delivery</span><span class="p">,</span> <span class="n">Delivery</span><span class="o">.</span><span class="n">REJECTED</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">release</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">delivered</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Releases a received message, making it available at the source</span>
<span class="sd"> for any (other) interested receiver. The ``delivered``</span>
<span class="sd"> parameter indicates whether this should be considered a</span>
<span class="sd"> delivery attempt (and the delivery count updated) or not.</span>
<span class="sd"> .. note:: This method cannot currently be used in combination</span>
<span class="sd"> with transactions. See :class:`proton.reactor.Transaction`</span>
<span class="sd"> for transactional methods.</span>
<span class="sd"> :param delivery: The message delivery tracking object</span>
<span class="sd"> :type delivery: :class:`proton.Delivery`</span>
<span class="sd"> :param delivered: If ``True``, the message will be annotated</span>
<span class="sd"> with a delivery attempt (setting delivery flag</span>
<span class="sd"> :const:`proton.Delivery.MODIFIED`). Otherwise, the message</span>
<span class="sd"> will be returned without the annotation and released (setting</span>
<span class="sd"> delivery flag :const:`proton.Delivery.RELEASED`</span>
<span class="sd"> :type delivered: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">delivered</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">settle</span><span class="p">(</span><span class="n">delivery</span><span class="p">,</span> <span class="n">Delivery</span><span class="o">.</span><span class="n">MODIFIED</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">settle</span><span class="p">(</span><span class="n">delivery</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="k">def</span> <span class="nf">settle</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Settles the message delivery, and optionally updating the</span>
<span class="sd"> delivery state.</span>
<span class="sd"> :param delivery: The message delivery tracking object</span>
<span class="sd"> :type delivery: :class:`proton.Delivery`</span>
<span class="sd"> :param state: The delivery state, or ``None`` if not update</span>
<span class="sd"> is to be performed.</span>
<span class="sd"> :type state: ``int`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</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">update</span><span class="p">(</span><span class="n">state</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">class</span> <span class="nc">IncomingMessageHandler</span><span class="p">(</span><span class="n">Handler</span><span class="p">,</span> <span class="n">Acking</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A utility for simpler and more intuitive handling of delivery</span>
<span class="sd"> events related to incoming i.e. received messages.</span>
<span class="sd"> :type auto_accept: ``bool``</span>
<span class="sd"> :param auto_settle: If ``True``, settle all messages (default). Otherwise</span>
<span class="sd"> messages must be explicitly settled.</span>
<span class="sd"> :param delegate: A client handler for the endpoint event</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">auto_accept</span><span class="o">=</span><span class="kc">True</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="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="n">delegate</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auto_accept</span> <span class="o">=</span> <span class="n">auto_accept</span>
<span class="k">def</span> <span class="nf">on_delivery</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">dlv</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">delivery</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">dlv</span><span class="o">.</span><span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span><span class="p">:</span> <span class="k">return</span>
<span class="k">if</span> <span class="n">dlv</span><span class="o">.</span><span class="n">aborted</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_aborted</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">dlv</span><span class="o">.</span><span class="n">readable</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">dlv</span><span class="o">.</span><span class="n">partial</span><span class="p">:</span>
<span class="n">event</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">recv_msg</span><span class="p">(</span><span class="n">dlv</span><span class="p">)</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">link</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_CLOSED</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auto_accept</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="n">Delivery</span><span class="o">.</span><span class="n">RELEASED</span><span class="p">)</span>
<span class="n">dlv</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="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_message</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">auto_accept</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="n">Delivery</span><span class="o">.</span><span class="n">ACCEPTED</span><span class="p">)</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="k">except</span> <span class="n">Reject</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="n">Delivery</span><span class="o">.</span><span class="n">REJECTED</span><span class="p">)</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="k">except</span> <span class="n">Release</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="n">Delivery</span><span class="o">.</span><span class="n">MODIFIED</span><span class="p">)</span>
<span class="n">dlv</span><span class="o">.</span><span class="n">settle</span><span class="p">()</span>
<span class="k">elif</span> <span class="n">dlv</span><span class="o">.</span><span class="n">updated</span> <span class="ow">and</span> <span class="n">dlv</span><span class="o">.</span><span class="n">settled</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_settled</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_message</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"> Called when a message is received. The message itself can be</span>
<span class="sd"> obtained as a property on the event. For the purpose of</span>
<span class="sd"> referring to this message in further actions (e.g. if</span>
<span class="sd"> explicitly accepting it, the ``delivery`` should be used, also</span>
<span class="sd"> obtainable via a property on the event.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_message&#39;</span><span class="p">,</span> <span class="n">event</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when a message delivery is settled by the remote peer.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_settled&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_aborted</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"> Callback for when a message delivery is aborted by the remote peer.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_aborted&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">EndpointStateHandler</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A utility that exposes &#39;endpoint&#39; events - ie the open/close for</span>
<span class="sd"> links, sessions and connections in a more intuitive manner. A</span>
<span class="sd"> ``XXX_opened()`` method will be called when both local and remote peers</span>
<span class="sd"> have opened the link, session or connection. This can be used to</span>
<span class="sd"> confirm a locally initiated action for example. A ``XXX_opening()``</span>
<span class="sd"> method will be called when the remote peer has requested an open</span>
<span class="sd"> that was not initiated locally. By default this will simply open</span>
<span class="sd"> locally, which then triggers the ``XXX_opened()`` call. The same applies</span>
<span class="sd"> to close.</span>
<span class="sd"> :param peer_close_is_error: If ``True``, a peer endpoint closing will be</span>
<span class="sd"> treated as an error with an error callback. Otherwise (default), the</span>
<span class="sd"> normal callbacks for the closing will occur. </span>
<span class="sd"> :type peer_close_is_error: ``bool`` </span>
<span class="sd"> :param delegate: A client handler for the endpoint event</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">peer_close_is_error</span><span class="o">=</span><span class="kc">False</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="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="n">delegate</span>
<span class="bp">self</span><span class="o">.</span><span class="n">peer_close_is_error</span> <span class="o">=</span> <span class="n">peer_close_is_error</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">is_local_open</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test if local ``enpoint`` is open (ie has state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_ACTIVE`).</span>
<span class="sd"> :param endpoint: The local endpoint to be tested.</span>
<span class="sd"> :type endpoint: Any child of :class:`proton.Endpoint`</span>
<span class="sd"> :return: ``True`` if local endpoint is in state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_ACTIVE`, ``False`` otherwise.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">endpoint</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="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">is_local_uninitialised</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test if local ``enpoint`` is uninitialised (ie has state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_UNINIT`).</span>
<span class="sd"> :param endpoint: The local endpoint to be tested.</span>
<span class="sd"> :type endpoint: Any child of :class:`proton.Endpoint`</span>
<span class="sd"> :return: ``True`` if local endpoint is in state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_UNINIT`, ``False`` otherwise.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">endpoint</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_UNINIT</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">is_local_closed</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test if local ``enpoint`` is closed (ie has state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_CLOSED`).</span>
<span class="sd"> :param endpoint: The local endpoint to be tested.</span>
<span class="sd"> :type endpoint: Any child of :class:`proton.Endpoint`</span>
<span class="sd"> :return: ``True`` if local endpoint is in state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_CLOSED`, ``False`` otherwise.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">endpoint</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_CLOSED</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">is_remote_open</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test if remote ``enpoint`` is open (ie has state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_ACTIVE`).</span>
<span class="sd"> :param endpoint: The remote endpoint to be tested.</span>
<span class="sd"> :type endpoint: Any child of :class:`proton.Endpoint`</span>
<span class="sd"> :return: ``True`` if remote endpoint is in state</span>
<span class="sd"> :const:`proton.Endpoint.LOCAL_ACTIVE`, ``False`` otherwise.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">endpoint</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">REMOTE_ACTIVE</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">is_remote_closed</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Test if remote ``enpoint`` is closed (ie has state</span>
<span class="sd"> :const:`proton.Endpoint.REMOTE_CLOSED`).</span>
<span class="sd"> :param endpoint: The remote endpoint to be tested.</span>
<span class="sd"> :type endpoint: Any child of :class:`proton.Endpoint`</span>
<span class="sd"> :return: ``True`` if remote endpoint is in state</span>
<span class="sd"> :const:`proton.Endpoint.REMOTE_CLOSED`, ``False`` otherwise.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">endpoint</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">REMOTE_CLOSED</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">print_error</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">endpoint</span><span class="p">,</span> <span class="n">endpoint_type</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Logs an error message related to an error condition at an endpoint.</span>
<span class="sd"> :param endpoint: The endpoint to be tested</span>
<span class="sd"> :type endpoint: :class:`proton.Endpoint`</span>
<span class="sd"> :param endpoint_type: The endpoint type as a string to be printed</span>
<span class="sd"> in the log message.</span>
<span class="sd"> :type endpoint_type: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">endpoint</span><span class="o">.</span><span class="n">remote_condition</span><span class="o">.</span><span class="n">description</span> <span class="ow">or</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">remote_condition</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">cls</span><span class="o">.</span><span class="n">is_local_open</span><span class="p">(</span><span class="n">endpoint</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">cls</span><span class="o">.</span><span class="n">is_remote_closed</span><span class="p">(</span><span class="n">endpoint</span><span class="p">):</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2"> closed by peer&quot;</span> <span class="o">%</span> <span class="n">endpoint_type</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_remote_close</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">link</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_link_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_closed</span><span class="p">(</span><span class="n">event</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">on_link_closed</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="bp">self</span><span class="o">.</span><span class="n">on_link_closing</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">link</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_session_remote_close</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">session</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_session_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_closed</span><span class="p">(</span><span class="n">event</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">on_session_closed</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="bp">self</span><span class="o">.</span><span class="n">on_session_closing</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">session</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_connection_remote_close</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">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">remote_condition</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;amqp:connection:forced&quot;</span><span class="p">:</span>
<span class="c1"># Treat this the same as just having the transport closed by the peer without</span>
<span class="c1"># sending any events. Allow reconnection to happen transparently.</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_connection_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_closed</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="bp">self</span><span class="o">.</span><span class="n">on_connection_closed</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="bp">self</span><span class="o">.</span><span class="n">on_connection_closing</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">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_remote_open</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="bp">self</span><span class="o">.</span><span class="n">on_connection_opened</span><span class="p">(</span><span class="n">event</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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_open</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="bp">self</span><span class="o">.</span><span class="n">on_connection_opened</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_uninitialised</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="bp">self</span><span class="o">.</span><span class="n">on_connection_opening</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">connection</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_session_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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_remote_open</span><span class="p">(</span><span class="n">event</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">on_session_opened</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_open</span><span class="p">(</span><span class="n">event</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">on_session_opened</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_uninitialised</span><span class="p">(</span><span class="n">event</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">on_session_opening</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">session</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_link_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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_remote_open</span><span class="p">(</span><span class="n">event</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">on_link_opened</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_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="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_open</span><span class="p">(</span><span class="n">event</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">on_link_opened</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_uninitialised</span><span class="p">(</span><span class="n">event</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">on_link_opening</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">link</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_connection_opened</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"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> connection have opened.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_connection_opened&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_opened</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"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> session have opened.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_session_opened&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_opened</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"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> link have opened.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_link_opened&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_connection_opening</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"> Callback for when a remote peer initiates the opening of</span>
<span class="sd"> a connection.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_connection_opening&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_opening</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"> Callback for when a remote peer initiates the opening of</span>
<span class="sd"> a session.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_session_opening&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_opening</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"> Callback for when a remote peer initiates the opening of</span>
<span class="sd"> a link.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_link_opening&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_connection_error</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"> Callback for when an initiated connection open fails.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_connection_error&#39;</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="bp">self</span><span class="o">.</span><span class="n">print_error</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="s2">&quot;connection&quot;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_error</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"> Callback for when an initiated session open fails.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_session_error&#39;</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="bp">self</span><span class="o">.</span><span class="n">print_error</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="s2">&quot;session&quot;</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_link_error</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"> Callback for when an initiated link open fails.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_link_error&#39;</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="bp">self</span><span class="o">.</span><span class="n">print_error</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">,</span> <span class="s2">&quot;link&quot;</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_connection_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> connection have closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_connection_closed&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> session have closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_session_closed&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when both the local and remote endpoints of a</span>
<span class="sd"> link have closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_link_closed&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_connection_closing</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"> Callback for when a remote peer initiates the closing of</span>
<span class="sd"> a connection.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_connection_closing&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">peer_close_is_error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_connection_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_session_closing</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"> Callback for when a remote peer initiates the closing of</span>
<span class="sd"> a session.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_session_closing&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">peer_close_is_error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_session_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_closing</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"> Callback for when a remote peer initiates the closing of</span>
<span class="sd"> a link.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_link_closing&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">peer_close_is_error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_link_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_transport_tail_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when the transport tail has closed (ie no further input will</span>
<span class="sd"> be accepted by the transport).</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_transport_closed</span><span class="p">(</span><span class="n">event</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Callback for when the transport has closed - ie both the head (input) and</span>
<span class="sd"> tail (output) of the transport pipeline are closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_local_open</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="n">_dispatch</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">delegate</span><span class="p">,</span> <span class="s1">&#39;on_disconnected&#39;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span>
<div class="viewcode-block" id="MessagingHandler"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler">[docs]</a><span class="k">class</span> <span class="nc">MessagingHandler</span><span class="p">(</span><span class="n">Handler</span><span class="p">,</span> <span class="n">Acking</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A general purpose handler that makes the proton-c events somewhat</span>
<span class="sd"> simpler to deal with and/or avoids repetitive tasks for common use</span>
<span class="sd"> cases.</span>
<span class="sd"> :param prefetch: Initial flow credit for receiving messages, defaults to 10.</span>
<span class="sd"> :type prefetch: ``int``</span>
<span class="sd"> :param auto_accept: If ``True``, accept all messages (default). Otherwise messages</span>
<span class="sd"> must be individually accepted or rejected.</span>
<span class="sd"> :type auto_accept: ``bool``</span>
<span class="sd"> :param auto_settle: If ``True``, settle all messages (default). Otherwise</span>
<span class="sd"> messages must be explicitly settled.</span>
<span class="sd"> :type auto_settle: ``bool``</span>
<span class="sd"> :param peer_close_is_error: If ``True``, a peer endpoint closing will be</span>
<span class="sd"> treated as an error with an error callback. Otherwise (default), the</span>
<span class="sd"> normal callbacks for the closing will occur. </span>
<span class="sd"> :type peer_close_is_error: ``bool`` </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">prefetch</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">auto_accept</span><span class="o">=</span><span class="kc">True</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="n">peer_close_is_error</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">handlers</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="n">prefetch</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">FlowController</span><span class="p">(</span><span class="n">prefetch</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">EndpointStateHandler</span><span class="p">(</span><span class="n">peer_close_is_error</span><span class="p">,</span> <span class="n">weakref</span><span class="o">.</span><span class="n">proxy</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">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">IncomingMessageHandler</span><span class="p">(</span><span class="n">auto_accept</span><span class="p">,</span> <span class="n">weakref</span><span class="o">.</span><span class="n">proxy</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">handlers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">OutgoingMessageHandler</span><span class="p">(</span><span class="n">auto_settle</span><span class="p">,</span> <span class="n">weakref</span><span class="o">.</span><span class="n">proxy</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">fatal_conditions</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;amqp:unauthorized-access&quot;</span><span class="p">]</span>
<div class="viewcode-block" id="MessagingHandler.on_transport_error"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_transport_error">[docs]</a> <span class="k">def</span> <span class="nf">on_transport_error</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"> Called when some error is encountered with the transport over</span>
<span class="sd"> which the AMQP connection is to be established. This includes</span>
<span class="sd"> authentication errors as well as socket errors.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">condition</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">info</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="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">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">name</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">condition</span><span class="o">.</span><span class="n">description</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">condition</span><span class="o">.</span><span class="n">info</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">name</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">condition</span><span class="o">.</span><span class="n">description</span><span class="p">))</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">condition</span><span class="o">.</span><span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fatal_conditions</span><span class="p">:</span>
<span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Unspecified transport error&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="MessagingHandler.on_connection_error"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_connection_error">[docs]</a> <span class="k">def</span> <span class="nf">on_connection_error</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"> Called when the peer closes the connection with an error condition.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">EndpointStateHandler</span><span class="o">.</span><span class="n">print_error</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="s2">&quot;connection&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="MessagingHandler.on_session_error"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_session_error">[docs]</a> <span class="k">def</span> <span class="nf">on_session_error</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"> Called when the peer closes the session with an error condition.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">EndpointStateHandler</span><span class="o">.</span><span class="n">print_error</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="s2">&quot;session&quot;</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
<div class="viewcode-block" id="MessagingHandler.on_link_error"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_link_error">[docs]</a> <span class="k">def</span> <span class="nf">on_link_error</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"> Called when the peer closes the link with an error condition.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">EndpointStateHandler</span><span class="o">.</span><span class="n">print_error</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">,</span> <span class="s2">&quot;link&quot;</span><span class="p">)</span>
<span class="n">event</span><span class="o">.</span><span class="n">connection</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></div>
<div class="viewcode-block" id="MessagingHandler.on_reactor_init"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_reactor_init">[docs]</a> <span class="k">def</span> <span class="nf">on_reactor_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the event loop - the reactor - starts.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</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">reactor</span><span class="p">,</span> <span class="s1">&#39;subclass&#39;</span><span class="p">):</span>
<span class="nb">setattr</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">reactor</span><span class="o">.</span><span class="n">subclass</span><span class="o">.</span><span class="vm">__name__</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="n">event</span><span class="o">.</span><span class="n">reactor</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_start</span><span class="p">(</span><span class="n">event</span><span class="p">)</span></div>
<div class="viewcode-block" id="MessagingHandler.on_start"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_start">[docs]</a> <span class="k">def</span> <span class="nf">on_start</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"> Called when the event loop starts. (Just an alias for on_reactor_init)</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_connection_closed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_connection_closed">[docs]</a> <span class="k">def</span> <span class="nf">on_connection_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the connection is closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_session_closed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_session_closed">[docs]</a> <span class="k">def</span> <span class="nf">on_session_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the session is closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_link_closed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_link_closed">[docs]</a> <span class="k">def</span> <span class="nf">on_link_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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the link is closed.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_connection_closing"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_connection_closing">[docs]</a> <span class="k">def</span> <span class="nf">on_connection_closing</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"> Called when the peer initiates the closing of the connection.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_session_closing"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_session_closing">[docs]</a> <span class="k">def</span> <span class="nf">on_session_closing</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"> Called when the peer initiates the closing of the session.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_link_closing"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_link_closing">[docs]</a> <span class="k">def</span> <span class="nf">on_link_closing</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"> Called when the peer initiates the closing of the link.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_disconnected"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_disconnected">[docs]</a> <span class="k">def</span> <span class="nf">on_disconnected</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"> Called when the socket is disconnected.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_sendable"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_sendable">[docs]</a> <span class="k">def</span> <span class="nf">on_sendable</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"> Called when the sender link has credit and messages can</span>
<span class="sd"> therefore be transferred.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_accepted"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_accepted">[docs]</a> <span class="k">def</span> <span class="nf">on_accepted</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"> Called when the remote peer accepts an outgoing message.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_rejected"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_rejected">[docs]</a> <span class="k">def</span> <span class="nf">on_rejected</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"> Called when the remote peer rejects an outgoing message.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_released"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_released">[docs]</a> <span class="k">def</span> <span class="nf">on_released</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"> Called when the remote peer releases an outgoing message. Note</span>
<span class="sd"> that this may be in response to either the RELEASE or MODIFIED</span>
<span class="sd"> state as defined by the AMQP specification.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_settled"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_settled">[docs]</a> <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="sd">&quot;&quot;&quot;</span>
<span class="sd"> Called when the remote peer has settled the outgoing</span>
<span class="sd"> message. This is the point at which it should never be</span>
<span class="sd"> retransmitted.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="MessagingHandler.on_message"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.MessagingHandler.on_message">[docs]</a> <span class="k">def</span> <span class="nf">on_message</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"> Called when a message is received. The message itself can be</span>
<span class="sd"> obtained as a property on the event. For the purpose of</span>
<span class="sd"> referring to this message in further actions (e.g. if</span>
<span class="sd"> explicitly accepting it, the ``delivery`` should be used, also</span>
<span class="sd"> obtainable via a property on the event.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event. In particular, the message itself may</span>
<span class="sd"> be obtained by accessing ``event.message``.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div></div>
<div class="viewcode-block" id="TransactionHandler"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler">[docs]</a><span class="k">class</span> <span class="nc">TransactionHandler</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The interface for transaction handlers - ie objects that want to</span>
<span class="sd"> be notified of state changes related to a transaction.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="TransactionHandler.on_transaction_declared"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler.on_transaction_declared">[docs]</a> <span class="k">def</span> <span class="nf">on_transaction_declared</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"> Called when a local transaction is declared.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event. In particular, the :class:`proton.reactor.Transaction`</span>
<span class="sd"> object may be obtained by accessing ``event.transaction``.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TransactionHandler.on_transaction_committed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler.on_transaction_committed">[docs]</a> <span class="k">def</span> <span class="nf">on_transaction_committed</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"> Called when a local transaction is discharged successfully</span>
<span class="sd"> (committed).</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TransactionHandler.on_transaction_aborted"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler.on_transaction_aborted">[docs]</a> <span class="k">def</span> <span class="nf">on_transaction_aborted</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"> Called when a local transaction is discharged unsuccessfully</span>
<span class="sd"> (aborted).</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TransactionHandler.on_transaction_declare_failed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler.on_transaction_declare_failed">[docs]</a> <span class="k">def</span> <span class="nf">on_transaction_declare_failed</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"> Called when a local transaction declare fails.</span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="TransactionHandler.on_transaction_commit_failed"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionHandler.on_transaction_commit_failed">[docs]</a> <span class="k">def</span> <span class="nf">on_transaction_commit_failed</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"> Called when the commit of a local transaction fails. </span>
<span class="sd"> :param event: The underlying event object. Use this to obtain further</span>
<span class="sd"> information on the event.</span>
<span class="sd"> :type event: :class:`proton.Event`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span></div></div>
<div class="viewcode-block" id="TransactionalClientHandler"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionalClientHandler">[docs]</a><span class="k">class</span> <span class="nc">TransactionalClientHandler</span><span class="p">(</span><span class="n">MessagingHandler</span><span class="p">,</span> <span class="n">TransactionHandler</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An extension to the MessagingHandler for applications using</span>
<span class="sd"> transactions. This handler provides all of the callbacks found</span>
<span class="sd"> in :class:`MessagingHandler` and :class:`TransactionHandler`,</span>
<span class="sd"> and provides a convenience method :meth:`accept` for performing</span>
<span class="sd"> a transactional acceptance of received messages.</span>
<span class="sd"> :param prefetch: Initial flow credit for receiving messages, defaults to 10.</span>
<span class="sd"> :type prefetch: ``int``</span>
<span class="sd"> :param auto_accept: If ``True``, accept all messages (default). Otherwise messages</span>
<span class="sd"> must be individually accepted or rejected.</span>
<span class="sd"> :type auto_accept: ``bool``</span>
<span class="sd"> :param auto_settle: If ``True``, settle all messages (default). Otherwise</span>
<span class="sd"> messages must be explicitly settled.</span>
<span class="sd"> :type auto_settle: ``bool``</span>
<span class="sd"> :param peer_close_is_error: If ``True``, a peer endpoint closing will be</span>
<span class="sd"> treated as an error with an error callback. Otherwise (default), the</span>
<span class="sd"> normal callbacks for the closing will occur. </span>
<span class="sd"> :type peer_close_is_error: ``bool`` </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">prefetch</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">auto_accept</span><span class="o">=</span><span class="kc">False</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="n">peer_close_is_error</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">TransactionalClientHandler</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">prefetch</span><span class="p">,</span> <span class="n">auto_accept</span><span class="p">,</span> <span class="n">auto_settle</span><span class="p">,</span> <span class="n">peer_close_is_error</span><span class="p">)</span>
<div class="viewcode-block" id="TransactionalClientHandler.accept"><a class="viewcode-back" href="../../proton.handlers.html#proton.handlers.TransactionalClientHandler.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="n">transaction</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method for accepting a received message as part of a</span>
<span class="sd"> transaction. If no transaction object is supplied, a regular</span>
<span class="sd"> non-transactional acceptance will be performed.</span>
<span class="sd"> :param delivery: Delivery tracking object for received message.</span>
<span class="sd"> :type delivery: :class:`proton.Delivery`</span>
<span class="sd"> :param transaction: Transaction tracking object which is required if</span>
<span class="sd"> the message is being accepted under the transaction. If ``None`` (default),</span>
<span class="sd"> then a normal non-transactional accept occurs.</span>
<span class="sd"> :type transaction: :class:`proton.reactor.Transaction`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">transaction</span><span class="p">:</span>
<span class="n">transaction</span><span class="o">.</span><span class="n">accept</span><span class="p">(</span><span class="n">delivery</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">super</span><span class="p">(</span><span class="n">TransactionalClientHandler</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">accept</span><span class="p">(</span><span class="n">delivery</span><span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">FlowController</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">window</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_window</span> <span class="o">=</span> <span class="n">window</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_drained</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">on_link_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">_flow</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_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="bp">self</span><span class="o">.</span><span class="n">_flow</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_link_flow</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">_flow</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_delivery</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">_flow</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">link</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_flow</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">if</span> <span class="n">link</span><span class="o">.</span><span class="n">is_receiver</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_drained</span> <span class="o">+=</span> <span class="n">link</span><span class="o">.</span><span class="n">drained</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_drained</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">delta</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_window</span> <span class="o">-</span> <span class="n">link</span><span class="o">.</span><span class="n">credit</span>
<span class="n">link</span><span class="o">.</span><span class="n">flow</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Handshaker</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_connection_remote_open</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">if</span> <span class="n">conn</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_UNINIT</span><span class="p">:</span>
<span class="n">conn</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_session_remote_open</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">ssn</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">session</span>
<span class="k">if</span> <span class="n">ssn</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_UNINIT</span><span class="p">:</span>
<span class="n">ssn</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_link_remote_open</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">link</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span>
<span class="k">if</span> <span class="n">link</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_UNINIT</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">copy</span><span class="p">(</span><span class="n">link</span><span class="o">.</span><span class="n">remote_source</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">copy</span><span class="p">(</span><span class="n">link</span><span class="o">.</span><span class="n">remote_target</span><span class="p">)</span>
<span class="n">link</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_connection_remote_close</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">if</span> <span class="ow">not</span> <span class="n">conn</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_CLOSED</span><span class="p">:</span>
<span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_session_remote_close</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">ssn</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">session</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">ssn</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_CLOSED</span><span class="p">:</span>
<span class="n">ssn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">on_link_remote_close</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="n">link</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">link</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">link</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_CLOSED</span><span class="p">:</span>
<span class="n">link</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># Back compatibility definitions</span>
<span class="n">CFlowController</span> <span class="o">=</span> <span class="n">FlowController</span>
<span class="n">CHandshaker</span> <span class="o">=</span> <span class="n">Handshaker</span>
<span class="k">class</span> <span class="nc">PythonIO</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">selectables</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delegate</span> <span class="o">=</span> <span class="n">IOHandler</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="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">delegate</span><span class="p">)</span>
<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="bp">self</span><span class="o">.</span><span class="n">selectables</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">context</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_selectable_updated</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">pass</span>
<span class="k">def</span> <span class="nf">on_selectable_final</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="k">if</span> <span class="n">sel</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">selectables</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span>
<span class="n">sel</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_reactor_quiesced</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">reactor</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">reactor</span>
<span class="c1"># check if we are still quiesced, other handlers of</span>
<span class="c1"># on_reactor_quiesced could have produced events to process</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">reactor</span><span class="o">.</span><span class="n">quiesced</span><span class="p">:</span> <span class="k">return</span>
<span class="n">reading</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">writing</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">deadline</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">sel</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">selectables</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sel</span><span class="o">.</span><span class="n">reading</span><span class="p">:</span>
<span class="n">reading</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sel</span><span class="o">.</span><span class="n">writing</span><span class="p">:</span>
<span class="n">writing</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sel</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sel</span><span class="o">.</span><span class="n">deadline</span><span class="p">:</span>
<span class="k">if</span> <span class="n">deadline</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">deadline</span> <span class="o">=</span> <span class="n">sel</span><span class="o">.</span><span class="n">deadline</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">deadline</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">sel</span><span class="o">.</span><span class="n">deadline</span><span class="p">,</span> <span class="n">deadline</span><span class="p">)</span>
<span class="k">if</span> <span class="n">deadline</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">timeout</span> <span class="o">=</span> <span class="n">deadline</span> <span class="o">-</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">timeout</span> <span class="o">=</span> <span class="n">reactor</span><span class="o">.</span><span class="n">timeout</span>
<span class="k">if</span> <span class="n">timeout</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">timeout</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="n">reactor</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
<span class="n">readable</span><span class="p">,</span> <span class="n">writable</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">IO</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">reading</span><span class="p">,</span> <span class="n">writing</span><span class="p">,</span> <span class="p">[],</span> <span class="n">timeout</span><span class="p">)</span>
<span class="n">now</span> <span class="o">=</span> <span class="n">reactor</span><span class="o">.</span><span class="n">mark</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">readable</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">readable</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">writable</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">writable</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">selectables</span><span class="p">:</span>
<span class="k">if</span> <span class="n">s</span><span class="o">.</span><span class="n">deadline</span> <span class="ow">and</span> <span class="n">now</span> <span class="o">&gt;</span> <span class="n">s</span><span class="o">.</span><span class="n">deadline</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">expired</span><span class="p">()</span>
<span class="n">reactor</span><span class="o">.</span><span class="n">yield_</span><span class="p">()</span>
<span class="c1"># For C style IO handler need to implement Selector</span>
<span class="k">class</span> <span class="nc">IOHandler</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="bp">self</span><span class="o">.</span><span class="n">_selector</span> <span class="o">=</span> <span class="n">IO</span><span class="o">.</span><span class="n">Selector</span><span class="p">()</span>
<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">s</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">selectable</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_selector</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">s</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">_selectables</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">def</span> <span class="nf">on_selectable_updated</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="bp">self</span><span class="o">.</span><span class="n">_selector</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">on_selectable_final</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="bp">self</span><span class="o">.</span><span class="n">_selector</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">s</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">_selectables</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="n">s</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_reactor_quiesced</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">r</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">reactor</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">r</span><span class="o">.</span><span class="n">quiesced</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">timer_deadline</span>
<span class="n">readable</span><span class="p">,</span> <span class="n">writable</span><span class="p">,</span> <span class="n">expired</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_selector</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="n">r</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
<span class="n">now</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">mark</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">readable</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">readable</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">writable</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">writable</span><span class="p">()</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">expired</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">expired</span><span class="p">()</span>
<span class="n">r</span><span class="o">.</span><span class="n">yield_</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">t</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_transport</span>
<span class="c1"># If we&#39;re an acceptor we can&#39;t have a transport</span>
<span class="c1"># and we don&#39;t want to do anything here in any case</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">t</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">capacity</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">capacity</span><span class="p">()</span>
<span class="k">if</span> <span class="n">capacity</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># EOF handling</span>
<span class="bp">self</span><span class="o">.</span><span class="n">on_selectable_error</span><span class="p">(</span><span class="n">event</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="c1"># TODO: What&#39;s the error handling to be here?</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Couldn&#39;t recv: </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_tail</span><span class="p">()</span>
<span class="c1"># Always update as we may have gone to not reading or from</span>
<span class="c1"># not writing to writing when processing the incoming bytes</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_reactor</span>
<span class="bp">self</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">def</span> <span class="nf">on_selectable_writable</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">t</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_transport</span>
<span class="c1"># If we&#39;re an acceptor we can&#39;t have a transport</span>
<span class="c1"># and we don&#39;t want to do anything here in any case</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">t</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">pending</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">pending</span><span class="p">()</span>
<span class="k">if</span> <span class="n">pending</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">peek</span><span class="p">(</span><span class="n">pending</span><span class="p">))</span>
<span class="n">t</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Couldn&#39;t send: </span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="c1"># TODO: Error? or actually an exception</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_head</span><span class="p">()</span>
<span class="n">newpending</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">pending</span><span class="p">()</span>
<span class="k">if</span> <span class="n">newpending</span> <span class="o">!=</span> <span class="n">pending</span><span class="p">:</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_reactor</span>
<span class="bp">self</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">def</span> <span class="nf">on_selectable_error</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">t</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_transport</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_head</span><span class="p">()</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_tail</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">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">t</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">s</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">on_selectable_expired</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">t</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_transport</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">_reactor</span>
<span class="bp">self</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">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="n">c</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">c</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">REMOTE_UNINIT</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">Transport</span><span class="p">()</span>
<span class="c1"># It seems perverse, but the C code ignores bind errors too!</span>
<span class="c1"># and this is required or you get errors because Connector() has already</span>
<span class="c1"># bound the transport and connection!</span>
<span class="n">t</span><span class="o">.</span><span class="n">bind_nothrow</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">on_connection_bound</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">c</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">connection</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span>
<span class="n">reactor</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">_reactor</span>
<span class="c1"># link the new transport to its reactor:</span>
<span class="n">t</span><span class="o">.</span><span class="n">_reactor</span> <span class="o">=</span> <span class="n">reactor</span>
<span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">_acceptor</span><span class="p">:</span>
<span class="c1"># this connection was created by the acceptor. There is already a</span>
<span class="c1"># socket assigned to this connection. Nothing needs to be done.</span>
<span class="k">return</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="n">url</span> <span class="ow">or</span> <span class="n">Url</span><span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">hostname</span><span class="p">)</span>
<span class="n">url</span><span class="o">.</span><span class="n">defaults</span><span class="p">()</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">host</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</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="k">if</span> <span class="ow">not</span> <span class="n">c</span><span class="o">.</span><span class="n">user</span><span class="p">:</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">if</span> <span class="n">user</span><span class="p">:</span>
<span class="n">c</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</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">if</span> <span class="n">password</span><span class="p">:</span>
<span class="n">c</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
<span class="n">addrs</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_UNSPEC</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="c1"># Try first possible address</span>
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Connect trying first transport address: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">addrs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">sock</span> <span class="o">=</span> <span class="n">IO</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">addrs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># At this point we need to arrange to be called back when the socket is writable</span>
<span class="n">ConnectSelectable</span><span class="p">(</span><span class="n">sock</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">addrs</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="c1"># TODO: Don&#39;t understand why we need this now - how can we get PN_TRANSPORT until the connection succeeds?</span>
<span class="n">t</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">transport</span><span class="p">,</span> <span class="n">selectable</span><span class="p">,</span> <span class="n">now</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">capacity</span> <span class="o">=</span> <span class="n">transport</span><span class="o">.</span><span class="n">capacity</span><span class="p">()</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">reading</span> <span class="o">=</span> <span class="n">capacity</span><span class="o">&gt;</span><span class="mi">0</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">if</span> <span class="n">transport</span><span class="o">.</span><span class="n">closed</span><span class="p">:</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">transport</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">pending</span> <span class="o">=</span> <span class="n">transport</span><span class="o">.</span><span class="n">pending</span><span class="p">()</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">writing</span> <span class="o">=</span> <span class="n">pending</span><span class="o">&gt;</span><span class="mi">0</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">if</span> <span class="n">transport</span><span class="o">.</span><span class="n">closed</span><span class="p">:</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">terminate</span><span class="p">()</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">transport</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">selectable</span><span class="o">.</span><span class="n">deadline</span> <span class="o">=</span> <span class="n">transport</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="n">now</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">on_transport</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">t</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">_reactor</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">_selectable</span>
<span class="k">if</span> <span class="n">s</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">s</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">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">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="n">t</span> <span class="o">=</span> <span class="n">event</span><span class="o">.</span><span class="n">transport</span>
<span class="n">r</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">_reactor</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">_selectable</span>
<span class="k">if</span> <span class="n">s</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">s</span><span class="o">.</span><span class="n">is_terminal</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">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">t</span><span class="o">.</span><span class="n">_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">r</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="n">t</span><span class="o">.</span><span class="n">unbind</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">ConnectSelectable</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">sock</span><span class="p">,</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">addrs</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">iohandler</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">ConnectSelectable</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">sock</span><span class="p">,</span> <span class="n">reactor</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">writing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_addrs</span> <span class="o">=</span> <span class="n">addrs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_transport</span> <span class="o">=</span> <span class="n">transport</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_iohandler</span> <span class="o">=</span> <span class="n">iohandler</span>
<span class="n">transport</span><span class="o">.</span><span class="n">_connect_selectable</span> <span class="o">=</span> <span class="bp">self</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="n">e</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_delegate</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_ERROR</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">_transport</span>
<span class="n">t</span><span class="o">.</span><span class="n">_connect_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Always cleanup this ConnectSelectable: either we failed or created a new one</span>
<span class="c1"># Do it first to ensure the socket gets deregistered before being registered again</span>
<span class="c1"># in the case of connecting</span>
<span class="bp">self</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">_transport</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">if</span> <span class="n">e</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Connection succeeded&quot;</span><span class="p">)</span>
<span class="c1"># Disassociate from the socket (which will be passed on)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<span class="n">s</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">selectable</span><span class="p">(</span><span class="n">delegate</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_delegate</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="bp">self</span><span class="o">.</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">t</span><span class="o">.</span><span class="n">_reactor</span><span class="o">.</span><span class="n">now</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">elif</span> <span class="n">e</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">ECONNREFUSED</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_addrs</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Connection refused: trying next transport address: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_addrs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">sock</span> <span class="o">=</span> <span class="n">IO</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">_addrs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># New ConnectSelectable for the new socket with rest of addresses</span>
<span class="n">ConnectSelectable</span><span class="p">(</span><span class="n">sock</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_addrs</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="n">t</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iohandler</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Connection refused, but tried all transport addresses&quot;</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">condition</span> <span class="o">=</span> <span class="n">Condition</span><span class="p">(</span><span class="s2">&quot;proton.pythonio&quot;</span><span class="p">,</span> <span class="s2">&quot;Connection refused to all addresses&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Couldn&#39;t connect: </span><span class="si">%s</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">condition</span> <span class="o">=</span> <span class="n">Condition</span><span class="p">(</span><span class="s2">&quot;proton.pythonio&quot;</span><span class="p">,</span> <span class="s2">&quot;Connection error: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">e</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_tail</span><span class="p">()</span>
<span class="n">t</span><span class="o">.</span><span class="n">close_head</span><span class="p">()</span>
</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._handlers</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>