View source
<?php
function rest_server_server_info() {
return array(
'name' => 'REST',
'path' => 'rest',
'settings' => array(
'file' => array(
'inc',
'rest_server',
),
'form' => '_rest_server_settings',
'submit' => '_rest_server_settings_submit',
),
);
}
function rest_server_autoload_info() {
module_load_include('inc', 'rest_server');
return _rest_server_autoload_info();
}
function rest_server_enable() {
autoload_flush_caches();
}
function rest_server_server() {
$endpoint_path = services_get_server_info('endpoint_path', 'services/rest');
$endpoint_path_len = drupal_strlen($endpoint_path) + 1;
$canonical_path = drupal_substr($_GET['q'], $endpoint_path_len, drupal_strlen($_GET['q']) - $endpoint_path_len);
if (empty($canonical_path)) {
return;
}
try {
$server = new RESTServer();
return $server
->handle($canonical_path, $endpoint_path);
} catch (Exception $e) {
$server
->handleException($e);
}
}
function rest_server_request_parsers() {
static $parsers = NULL;
if (!$parsers) {
$parsers = array(
'application/x-www-form-urlencoded' => 'RESTServer::parseURLEncoded',
'application/json' => 'RESTServer::parseJSON',
'application/vnd.php.serialized' => 'RESTServer::parsePHP',
'multipart/form-data' => 'RESTServer::parseMultipart',
);
if (_rest_server_get_spyc_location() !== false) {
$parsers['application/x-yaml'] = 'RESTServer::parseYAML';
}
drupal_alter('rest_server_request_parsers', $parsers);
}
return $parsers;
}
function rest_server_response_formatters() {
static $formatters = NULL;
if (!$formatters) {
$formatters = array(
'xml' => array(
'mime types' => array(
'application/xml',
'text/xml',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'xml',
),
),
'json' => array(
'mime types' => array(
'application/json',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'json',
),
),
'jsonp' => array(
'mime types' => array(
'text/javascript',
'application/javascript',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'jsonp',
),
),
'php' => array(
'mime types' => array(
'application/vnd.php.serialized',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'php',
),
),
'bencode' => array(
'mime types' => array(
'application/x-bencode',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'bencode',
),
),
'rss' => array(
'model' => 'ResourceFeedModel',
'mime types' => array(
'text/xml',
),
'view' => 'RssFormatView',
),
);
if (_rest_server_get_spyc_location() !== false) {
$formatters['yaml'] = array(
'mime types' => array(
'text/plain',
'application/x-yaml',
'text/yaml',
),
'view' => 'RESTServerViewBuiltIn',
'view arguments' => array(
'format' => 'yaml',
),
);
}
drupal_alter('rest_server_response_formatters', $formatters);
}
return $formatters;
}
function rest_server_setup_settings($settings = array()) {
$settings = $settings + array(
'formatters' => array(
'jsonp' => FALSE,
),
'parsers' => array(
'application/x-www-form-urlencoded' => FALSE,
),
);
$parsers = rest_server_request_parsers();
$formatters = rest_server_response_formatters();
_rest_server_add_default_and_remove_unknown($settings['parsers'], array_keys($parsers), TRUE);
_rest_server_add_default_and_remove_unknown($settings['formatters'], array_keys($formatters), TRUE);
return $settings;
}
function _rest_server_add_default_and_remove_unknown(&$array, $keys, $default) {
foreach ($keys as $k) {
if (!isset($array[$k])) {
$array[$k] = $default;
}
}
foreach (array_keys($array) as $key) {
if (!in_array($key, $keys)) {
unset($array[$key]);
}
}
}
function rest_server_services_resources_alter(&$resources, $endpoint) {
if (isset($resources['node'])) {
if (isset($resources['node']['retrieve'])) {
if (!isset($resources['node']['retrieve']['models'])) {
$resources['node']['retrieve']['models'] = array();
}
$resources['node']['retrieve']['models'] += array(
'ResourceFeedModel' => array(
'class' => 'NodeResourceFeedModel',
'arguments' => array(
'source' => 'single',
),
),
);
}
if (isset($resources['node']['index'])) {
if (!isset($resources['node']['index']['models'])) {
$resources['node']['index']['models'] = array();
}
$resources['node']['index']['models'] += array(
'ResourceFeedModel' => array(
'class' => 'NodeResourceFeedModel',
),
'ResourceTimeFeedModel' => array(
'class' => 'NodeResourceFeedModel',
),
);
}
}
}
function _rest_server_get_spyc_location() {
if (function_exists('libraries_get_path')) {
$libraries_spyc_loc = libraries_get_path('spyc') . '/spyc.php';
if (file_exists($libraries_spyc_loc)) {
return $libraries_spyc_loc;
}
}
$services_spyc_loc = dirname(__FILE__) . '/lib/spyc.php';
return file_exists($services_spyc_loc) ? $services_spyc_loc : false;
}