public function testGetters() { $annotations = Mockery::mock(AnnotationProvider::class); $body = Mockery::mock(Body::class); $printer = Mockery::mock(ArrayPrinter::class); $context = new HandlerContext($annotations, $body, $printer); $this->assertSame($annotations, $context->annotations()); $this->assertSame($body, $context->body()); $this->assertSame($printer, $context->printer()); }
/** * Get content type and set to header * * @param HandlerContext $context * @return array */ private function getContentTypeHeader(HandlerContext $context) { if ($context->annotations()->isJsonEncoded()) { return ['Content-Type' => 'application/json']; } if ($context->annotations()->isFormUrlEncoded()) { return ['Content-Type' => 'application/x-www-form-urlencoded']; } if ($context->annotations()->isMultipart()) { return ['Content-Type' => 'multipart/form-data; boundary=' . $context->annotations()->getMultipartBoundary()]; } $contentType = ['Content-Type' => 'application/x-www-form-urlencoded']; if (!$context->annotations()->hasBody()) { return $contentType; } trigger_error('Retrofit Deprecation: The default content type is changing in the next' . ' major version of Retrofit from application/x-www-form-urlencoded' . ' to application/json. In order to ensure a clean upgrade, make' . ' sure you specify a specific content type with the proper annotation', E_USER_DEPRECATED); return $contentType; }
/** * Create response * * @param HandlerContext $context * @return null * @throws LogicException * @throws RetrofitException */ public function __invoke(HandlerContext $context) { $callback = $context->annotations()->getCallback(); $context->body()->add('$request = new \\GuzzleHttp\\Psr7\\Request("%s", $requestUrl, $headers, $body);', strtoupper($context->annotations()->getRequestMethod())); $context->body()->add('$beforeSendEvent = new \\Tebru\\Retrofit\\Event\\BeforeSendEvent($request);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.beforeSend", $beforeSendEvent);'); $context->body()->add('$request = $beforeSendEvent->getRequest();'); $context->body()->add('try {'); if (null !== $callback) { if ($context->annotations()->isCallbackOptional()) { $context->body()->add('if (%s !== null) {', $callback); $context->body()->add('$response = $this->client->sendAsync($request, %s);', $callback); $context->body()->add('} else {'); $context->body()->add('$response = $this->client->send($request);'); $context->body()->add('}'); } else { $context->body()->add('$response = $this->client->sendAsync($request, %s);', $callback); } } else { $context->body()->add('$response = $this->client->send($request);'); } $context->body()->add('} catch (\\Exception $exception) {'); $context->body()->add('$apiExceptionEvent = new \\Tebru\\Retrofit\\Event\\ApiExceptionEvent($exception, $request);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.apiException", $apiExceptionEvent);'); $context->body()->add('$exception = $apiExceptionEvent->getException();'); $context->body()->add('throw new \\Tebru\\Retrofit\\Exception\\RetrofitApiException(get_class($this), $exception->getMessage(), $exception->getCode(), $exception);'); $context->body()->add('}'); if (null !== $callback && $context->annotations()->isCallbackOptional()) { $context->body()->add('if (%s === null) {', $callback); } if (null === $callback || null !== $callback && $context->annotations()->isCallbackOptional()) { $context->body()->add('$afterSendEvent = new \\Tebru\\Retrofit\\Event\\AfterSendEvent($request, $response);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.afterSend", $afterSendEvent);'); $context->body()->add('$response = $afterSendEvent->getResponse();'); } if (null !== $callback && $context->annotations()->isCallbackOptional()) { $context->body()->add('}'); } }
/** * Create request object and handle send/response * * @param HandlerContext $context * @return null * @throws LogicException * @throws RetrofitException */ public function __invoke(HandlerContext $context) { $callback = $context->annotations()->getCallback(); if ($callback !== null) { if ($context->annotations()->isCallbackOptional()) { $context->body()->add('if (%s !== null) {', $callback); $context->body()->add('$returnEvent = new \\Tebru\\Retrofit\\Event\\ReturnEvent(null);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.return", $returnEvent);'); $context->body()->add('return $returnEvent->getReturn();'); $context->body()->add('}'); } else { $context->body()->add('$returnEvent = new \\Tebru\\Retrofit\\Event\\ReturnEvent(null);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.return", $returnEvent);'); $context->body()->add('return $returnEvent->getReturn();'); return; } } $returnType = 'array'; if (null !== $context->annotations()->getReturnType()) { $returnType = $context->annotations()->getReturnType(); } $responseReturn = null !== $context->annotations()->getResponseType(); if ($responseReturn) { $returnType = $context->annotations()->getResponseType(); } $deserializationContext = null !== $context->annotations()->getDeserializationContext() ? $context->annotations()->getDeserializationContext() : []; if ('Response' === $returnType && false === $responseReturn) { throw new RetrofitException('A method return a Response must include a @ResponseType annotation.'); } $context->body()->add('$retrofitResponse = new \\Tebru\\Retrofit\\Http\\Response($response, "%s", $this->deserializerAdapter, %s);', $returnType, $context->printer()->printArray($deserializationContext)); if ($responseReturn) { $context->body()->add('$return = $retrofitResponse;'); } else { $context->body()->add('$return = $retrofitResponse->body();'); } $context->body()->add('$returnEvent = new \\Tebru\\Retrofit\\Event\\ReturnEvent($return);'); $context->body()->add('$this->eventDispatcher->dispatch("retrofit.return", $returnEvent);'); $context->body()->add('return $returnEvent->getReturn();'); }
/** * Handle request url code generation * * @param HandlerContext $context * @return null * @throws LogicException */ public function __invoke(HandlerContext $context) { $baseUrl = $context->annotations()->getBaseUrl() ?: '$this->baseUrl'; $queryMap = $context->annotations()->getQueryMap(); $queries = $context->annotations()->getQueries(); $uri = $context->annotations()->getRequestUri(); // if there aren't queries or a query map, just set request url if (null === $queryMap && null === $queries) { $context->body()->add('$requestUrl = %s . "%s";', $baseUrl, $uri); return null; } // if there's a query map, check to see if there are also queries if (null !== $queryMap) { // if we have regular queries, add them to the query builder if (null !== $queries) { $queryArray = $context->printer()->printArray($queries); $context->body()->add('$queryArray = \\Tebru\\Retrofit\\Generation\\Manipulator\\QueryManipulator::boolToString(%s + %s);', $queryArray, $queryMap); $context->body()->add('$queryString = http_build_query($queryArray);'); } else { $context->body()->add('$queryArray = \\Tebru\\Retrofit\\Generation\\Manipulator\\QueryManipulator::boolToString(%s);', $queryMap); $context->body()->add('$queryString = http_build_query($queryArray);'); } $context->body()->add('$requestUrl = %s . "%s?" . $queryString;', $baseUrl, $uri); return null; } // add queries to request url $queryArray = $context->printer()->printArray($queries); $context->body()->add('$queryArray = \\Tebru\\Retrofit\\Generation\\Manipulator\\QueryManipulator::boolToString(%s);', $queryArray); $context->body()->add('$queryString = http_build_query($queryArray);'); $context->body()->add('$requestUrl = %s . "%s" . "?" . $queryString;', $baseUrl, $uri); }
/** * Create serialization context * * @param HandlerContext $context * @param string $contextVar * @return null */ private function createContext(HandlerContext $context, $contextVar) { $serializationContext = $context->annotations()->getSerializationContext(); $context->body()->add('%s = \\JMS\\Serializer\\SerializationContext::create();', $contextVar); if (0 === count($serializationContext)) { return null; } if (!empty($serializationContext['groups'])) { $context->body()->add('%s->setGroups(%s);', $contextVar, $context->printer()->printArray($serializationContext['groups'])); } if (!empty($serializationContext['version'])) { $context->body()->add('%s->setVersion(%d);', $contextVar, (int) $serializationContext['version']); } if (!empty($serializationContext['serializeNull'])) { $serializeNull = QueryManipulator::boolToString([(bool) $serializationContext['serializeNull']])[0]; $context->body()->add('%s->setSerializeNull(%s);', $contextVar, $serializeNull); } if (!empty($serializationContext['enableMaxDepthChecks'])) { $context->body()->add('%s->enableMaxDepthChecks();', $contextVar); } if (!empty($serializationContext['attributes'])) { foreach ($serializationContext['attributes'] as $key => $value) { $context->body()->add('%s->setAttribute("%s", "%s");', $contextVar, $key, $value); } } }
/** * Create serialization context * * @param HandlerContext $context * @param string $contextVar * @return void */ private function createContext(HandlerContext $context, $contextVar) { $serializationContext = $context->annotations()->getSerializationContext(); if (null === $serializationContext) { $serializationContext = []; } $context->body()->add('%s = %s;', $contextVar, $context->printer()->printArray($serializationContext)); }