/**
  * Handle an incoming request.
  *
  * @param  LaravelRequest $request
  * @param  Closure $next
  *
  * @return mixed
  */
 public function handle(LaravelRequest $request, Closure $next)
 {
     $message = new Request($request->getMethod(), new Uri($request->getUri()), $request->headers->all(), $request->getContent());
     $result = $this->extractor->getRequest($message);
     $event = $this->logger->begin($result['request'], $request->getUri(), $request->getMethod(), '');
     $response = null;
     try {
         /** @var LaravelResponse $response */
         $response = $next($request);
     } catch (Exception $e) {
         $response = LaravelResponse::create($e->getMessage(), 500);
     } finally {
         $this->logResponse($response, $event);
     }
     return $response;
 }
 function it_handles_communication_logging(CommunicationLogger $logger, CommunicationExtractor $extractor, Request $request, Response $response, HeaderBag $requestHeaders, IEvent $event)
 {
     $request->getMethod()->shouldBeCalled()->willReturn('POST');
     $request->getContent()->shouldBeCalled()->willReturn('request');
     $request->getUri()->shouldBeCalled()->willReturn('http://example.com');
     $request->headers = $requestHeaders;
     $requestHeaders->all()->shouldBeCalled()->willReturn([]);
     $next = function (Request $request) use($response) {
         return new Response();
     };
     $extractor->getRequest(Argument::type(GuzzleRequest::class))->shouldBeCalled()->willReturn(['request' => 'request']);
     $extractor->getResponse(Argument::type(GuzzleResponse::class))->shouldBeCalled()->willReturn(['response' => 'response']);
     $logger->begin('request', 'http://example.com', 'POST', '')->shouldBeCalled()->willReturn($event);
     $logger->end($event, 'response')->shouldBeCalled();
     $this->handle($request, $next);
 }