function request($type, $uri, $get = [], $post = []) { $request = ['method' => $type, 'protocol_version' => '1.1', 'header' => 'Connection: Close', 'ignore_errors' => true]; foreach ($post as $name => &$param) { if (is_array($param) and empty($param)) { $param = '_empty_array'; } } if (!empty($post)) { $request['header'] .= "\r\nContent-type: application/x-www-form-urlencoded"; $request['content'] = http_build_query($post); } $ctx = stream_context_create(['http' => $request]); $response = file_get_contents($this->endpoint . (empty($get) ? $uri : $uri . '?' . http_build_query($get)), false, $ctx); preg_match('/\\A[^ ]+ (\\d+) .+\\Z/', $http_response_header[0], $matches); if ($matches[1] == 200) { if (!empty($response)) { $result = json\decode($response); $result !== null or error('bad_backend_response', "Response from backend server is not valid JSON: {$response}"); return $result; } else { error('bad_backend_response', 'Empty backend response'); } } else { error('bad_backend_response', 'Backend HTTP response is not 200: ' . $response); } }
function extend($extensions) { if (!isset($extensions->filters)) { $extensions->filters = []; } if (!isset($extensions->functions)) { $extensions->functions = []; } $extensions->filters += ['array' => function ($object) { return (array) $object; }, 'ceil' => function ($value) { return ceil($value); }, 'local' => function ($alias) { return $this->locale->get($alias); }, 'md5' => function ($value) { return md5($value); }]; $extensions->functions += ['json' => function ($filename) { return \json\decode(\fs\read($this->data . $filename)); }]; foreach ($extensions->filters as $name => $closure) { if ($closure instanceof \Closure) { $this->twig->addFilter(new \Twig_SimpleFilter($name, $closure->bindTo($this, $this))); } else { $options = []; if (isset($closure->escape) and !$closure->escape) { $options['is_safe'] = ['html']; } $this->twig->addFilter(new \Twig_SimpleFilter($name, $closure->function->bindTo($this, $this), $options)); } } foreach ($extensions->functions as $name => $closure) { $this->twig->addFunction(new \Twig_SimpleFunction($name, $closure)); } }
private static function embed(&$object, $metadata) { if (($json = json\decode($object->{$metadata}, true)) !== null) { if (is_array($json)) { foreach ($json as $name => $value) { $object->{$name} = $value; } } } }
function query_direct($args) { switch ($this->method) { case 'photos': isset($args['_venue_id']) or error('missing_parameter', 'Foursquare _venue_id argument missing'); $photos = []; if ($result = json\decode(file_get_contents('https://api.foursquare.com/v2/venues/' . $args['_venue_id'] . '/photos?' . $this->foursquare->get()))) { foreach ($result->response->photos->groups as $group) { if ($group->type == 'venue') { foreach ($group->items as $item) { $photo = (object) ['url' => $item->url, 'created' => $item->createdAt, 'user' => (object) ['id' => $item->user->id, 'first_name' => $item->user->firstName, 'gender' => $item->user->gender, 'photo' => $item->user->photo]]; if ($item->user->lastName) { $photo->user->last_name = $item->user->lastName; } $resampled = []; foreach ($item->sizes->items as $size) { $resampled[] = (object) ['url' => $size->url, 'width' => $size->width, 'height' => $size->height]; } $photo->resampled = $resampled; $photos[] = $photo; } } } } !(empty($photos) and $this->required) or error('empty_query_result', 'Empty response from Froursquare procedure'); return (object) $photos; case 'venues': isset($args['_latitude']) or error('missing_parameter', 'Foursquare _latitude argument missing'); isset($args['_longitude']) or error('missing_parameter', 'Foursquare _longitude argument missing'); $venues = []; if ($result = json\decode(file_get_contents('https://api.foursquare.com/v2/venues/search?ll=' . $args['_latitude'] . ',' . $args['_longitude'] . '&' . $this->foursquare->get()))) { foreach ($result->response->groups as $group) { if ($group->type == 'nearby') { foreach ($group->items as $item) { $venue[] = (object) ['id' => $item->id, 'name' => $item->name, 'url' => $item->canonicalUrl]; $categories = []; foreach ($item->categories as $category) { $categories[] = (object) ['id' => $category->id, 'name' => $category->name, 'plural_name' => $category->pluralName, 'short_name' => $category->shortName, 'icon' => $category->icon]; } $venue->categories = $categories; $venues[] = $venue; } } } } !(empty($venues) and $this->required) or error('empty_query_result', 'Empty response from Froursquare procedure'); return (object) $venues; } }
static function unwrap($token, $host = null) { if ($package = base64_decode($token, true)) { if ($package = json\decode($package)) { if (isset($package->value) and isset($package->expire_at) and isset($package->digest)) { $digest = $package->digest; unset($package->digest); if ($digest === self::digest($package)) { if (isset($package->host) and $package->host !== $host) { return null; } if ($package->expire_at === 0 or $package->expire_at > @time()) { return $package->value; } } } } } return null; }
<?php $this->api = new api($config->schema); $this->locale = new locale($options->language, $options->country); $this->locale->load($config->locale); $this->vars = json\decode(fs\read($config->vars)); if ($config->engine == 'twig') { $this->templaters[$config->engine] = new twig\engine($config->templates, isset($options->cache) ? ['cache' => $options->cache] : [], $config->data, $this->locale); } foreach ($config->pages as $page) { $templater = isset($page->engine) ? $page->engine : $config->engine; $this->router->attach(isset($page->method) ? $page->method : 'GET', new page($page->uri, $page->params, isset($page->template) ? $this->templaters[$templater]->load($page->template) : null, isset($page->script) ? new script($this, $page->script) : null, $this->api)); } foreach ($config->schemas as $name => $src) { $this->schemas[$name] = json\schema::load($src); }