Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

RequestFsm.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 4.96 KiB


001  <?php
002  namespace GuzzleHttp;
003   
004  use GuzzleHttp\Event\BeforeEvent;
005  use GuzzleHttp\Event\ErrorEvent;
006  use GuzzleHttp\Event\CompleteEvent;
007  use GuzzleHttp\Event\EndEvent;
008  use GuzzleHttp\Exception\StateException;
009  use GuzzleHttp\Exception\RequestException;
010  use GuzzleHttp\Message\FutureResponse;
011  use GuzzleHttp\Message\MessageFactoryInterface;
012  use GuzzleHttp\Ring\Future\FutureInterface;
013   
014  /**
015   * Responsible for transitioning requests through lifecycle events.
016   */
017  class RequestFsm
018  {
019      private $handler;
020      private $mf;
021      private $maxTransitions;
022   
023      public function __construct(
024          callable $handler,
025          MessageFactoryInterface $messageFactory,
026          $maxTransitions = 200
027      ) {
028          $this->mf = $messageFactory;
029          $this->maxTransitions = $maxTransitions;
030          $this->handler = $handler;
031      }
032   
033      /**
034       * Runs the state machine until a terminal state is entered or the
035       * optionally supplied $finalState is entered.
036       *
037       * @param Transaction $trans      Transaction being transitioned.
038       *
039       * @throws \Exception if a terminal state throws an exception.
040       */
041      public function __invoke(Transaction $trans)
042      {
043          $trans->_transitionCount = 0;
044   
045          if (!$trans->state) {
046              $trans->state = 'before';
047          }
048   
049          transition:
050   
051          if (++$trans->_transitionCount > $this->maxTransitions) {
052              throw new StateException("Too many state transitions were "
053                  . "encountered ({$trans->_transitionCount}). This likely "
054                  . "means that a combination of event listeners are in an "
055                  . "infinite loop.");
056          }
057   
058          switch ($trans->state) {
059              case 'before': goto before;
060              case 'complete': goto complete;
061              case 'error': goto error;
062              case 'retry': goto retry;
063              case 'send': goto send;
064              case 'end': goto end;
065              default: throw new StateException("Invalid state: {$trans->state}");
066          }
067   
068          before: {
069              try {
070                  $trans->request->getEmitter()->emit('before', new BeforeEvent($trans));
071                  $trans->state = 'send';
072                  if ((bool) $trans->response) {
073                      $trans->state = 'complete';
074                  }
075              } catch (\Exception $e) {
076                  $trans->state = 'error';
077                  $trans->exception = $e;
078              }
079              goto transition;
080          }
081   
082          complete: {
083              try {
084                  if ($trans->response instanceof FutureInterface) {
085                      // Futures will have their own end events emitted when
086                      // dereferenced.
087                      return;
088                  }
089                  $trans->state = 'end';
090                  $trans->response->setEffectiveUrl($trans->request->getUrl());
091                  $trans->request->getEmitter()->emit('complete', new CompleteEvent($trans));
092              } catch (\Exception $e) {
093                  $trans->state = 'error';
094                  $trans->exception = $e;
095              }
096              goto transition;
097          }
098   
099          error: {
100              try {
101                  // Convert non-request exception to a wrapped exception
102                  $trans->exception = RequestException::wrapException(
103                      $trans->request, $trans->exception
104                  );
105                  $trans->state = 'end';
106                  $trans->request->getEmitter()->emit('error', new ErrorEvent($trans));
107                  // An intercepted request (not retried) transitions to complete
108                  if (!$trans->exception && $trans->state !== 'retry') {
109                      $trans->state = 'complete';
110                  }
111              } catch (\Exception $e) {
112                  $trans->state = 'end';
113                  $trans->exception = $e;
114              }
115              goto transition;
116          }
117   
118          retry: {
119              $trans->retries++;
120              $trans->response = null;
121              $trans->exception = null;
122              $trans->state = 'before';
123              goto transition;
124          }
125   
126          send: {
127              $fn = $this->handler;
128              $trans->response = FutureResponse::proxy(
129                  $fn(RingBridge::prepareRingRequest($trans)),
130                  function ($value) use ($trans) {
131                      RingBridge::completeRingResponse($trans, $value, $this->mf, $this);
132                      $this($trans);
133                      return $trans->response;
134                  }
135              );
136              return;
137          }
138   
139          end: {
140              $trans->request->getEmitter()->emit('end', new EndEvent($trans));
141              // Throw exceptions in the terminal event if the exception
142              // was not handled by an "end" event listener.
143              if ($trans->exception) {
144                  if (!($trans->exception instanceof RequestException)) {
145                      $trans->exception = RequestException::wrapException(
146                          $trans->request, $trans->exception
147                      );
148                  }
149                  throw $trans->exception;
150              }
151          }
152      }
153  }
154