| |
| <!DOCTYPE html> |
| |
| <html> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| <title>proton._handlers — 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> »</li> |
| <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> »</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"># "License"); 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"># "AS IS" 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">"proton"</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">"""</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"> """</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">&</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">&</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">"""</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"> """</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">'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_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">"""</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"> """</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">'on_accepted'</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">"""</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"> """</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">'on_rejected'</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">"""</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"> """</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">'on_released'</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">"""</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"> """</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">'on_settled'</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">"""</span> |
| <span class="sd"> An exception that indicates a message should be rejected.</span> |
| <span class="sd"> """</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">"""</span> |
| <span class="sd"> An exception that indicates a message should be released.</span> |
| <span class="sd"> """</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">"""</span> |
| <span class="sd"> A class containing methods for handling received messages.</span> |
| <span class="sd"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">&</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">"""</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"> """</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">'on_message'</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">"""</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"> """</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">'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_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">"""</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"> """</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">'on_aborted'</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">"""</span> |
| <span class="sd"> A utility that exposes 'endpoint' 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"> """</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">"""</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"> """</span> |
| <span class="k">return</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">state</span> <span class="o">&</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">"""</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"> """</span> |
| <span class="k">return</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">state</span> <span class="o">&</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">"""</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"> """</span> |
| <span class="k">return</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">state</span> <span class="o">&</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">"""</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"> """</span> |
| <span class="k">return</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">state</span> <span class="o">&</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">"""</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"> """</span> |
| <span class="k">return</span> <span class="n">endpoint</span><span class="o">.</span><span class="n">state</span> <span class="o">&</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">"""</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"> """</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">"</span><span class="si">%s</span><span class="s2"> closed by peer"</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">"amqp:connection:forced"</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">"""</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"> """</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">'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_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">"""</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"> """</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">'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_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">"""</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"> """</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">'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_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">"""</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"> """</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">'on_connection_opening'</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">"""</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"> """</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">'on_session_opening'</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">"""</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"> """</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">'on_link_opening'</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">"""</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"> """</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">'on_connection_error'</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">"connection"</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">"""</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"> """</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">'on_session_error'</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">"session"</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">"""</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"> """</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">'on_link_error'</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">"link"</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">"""</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"> """</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">'on_connection_closed'</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">"""</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"> """</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">'on_session_closed'</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">"""</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"> """</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">'on_link_closed'</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">"""</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"> """</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">'on_connection_closing'</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">"""</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"> """</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">'on_session_closing'</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">"""</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"> """</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">'on_link_closing'</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">"""</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"> """</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">"""</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"> """</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">'on_disconnected'</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">"""</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"> """</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">"amqp:unauthorized-access"</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">"""</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"> """</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">"</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</span> <span class="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">"</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">"</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">"Unspecified transport error"</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">"""</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"> """</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">"connection"</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">"""</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"> """</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">"session"</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">"""</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"> """</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">"link"</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">"""</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"> """</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">'subclass'</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">"""</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"> """</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">&</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">&</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">&</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">&</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">&</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">&</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"><</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">></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're an acceptor we can't have a transport</span> |
| <span class="c1"># and we don'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">></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">></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'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">"Couldn't recv: </span><span class="si">%r</span><span class="s2">"</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're an acceptor we can't have a transport</span> |
| <span class="c1"># and we don'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">></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">"Couldn't send: </span><span class="si">%r</span><span class="s2">"</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">&</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">"Connect trying first transport address: </span><span class="si">%s</span><span class="s2">"</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'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">></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">></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">"Connection succeeded"</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">></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">"Connection refused: trying next transport address: </span><span class="si">%s</span><span class="s2">"</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">"Connection refused, but tried all transport addresses"</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">"proton.pythonio"</span><span class="p">,</span> <span class="s2">"Connection refused to all addresses"</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">"Couldn't connect: </span><span class="si">%s</span><span class="s2">"</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">"proton.pythonio"</span><span class="p">,</span> <span class="s2">"Connection error: </span><span class="si">%s</span><span class="s2">"</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> »</li> |
| <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> »</li> |
| <li class="nav-item nav-item-this"><a href="">proton._handlers</a></li> |
| </ul> |
| </div> |
| <div class="footer" role="contentinfo"> |
| © Copyright 2019, Apache Qpid Contributors. |
| Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1. |
| </div> |
| </body> |
| </html> |