Skip to content

Instantly share code, notes, and snippets.

@zlojkashtan
Forked from clsource/401-response.php
Last active August 29, 2015 14:28
Show Gist options
  • Select an option

  • Save zlojkashtan/10da7a98fcf42b12caeb to your computer and use it in GitHub Desktop.

Select an option

Save zlojkashtan/10da7a98fcf42b12caeb to your computer and use it in GitHub Desktop.

Revisions

  1. @clsource clsource created this gist Jul 30, 2014.
    58 changes: 58 additions & 0 deletions 401-response.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    <?php

    /*
    * 401 Response
    *
    * Sends a 401 Response Unauthorized
    *
    * @author Camilo Castro
    *
    * @date 29/07/2014
    */


    require_once('./helpers/Rest.php');

    $status = Rest\Header::$statusCodes;

    $code = 401;

    $output['data']['error'] = $code;

    $output['data']['message'] = $status[$code];


    $output['data']['params'] = array(
    'data' => Rest\Request::params(),
    );

    $output['data']['request_type'] = Rest\Request::currentType();

    // Set Headers
    http_response_code($code);

    header(Rest\Header::mimeType('json'));

    /*
    Example Output
    {
    "data": {
    "error": 401,
    "message": "Unauthorized",
    "params": {
    "data": {
    "foo": "bar",
    "_ga": "GA1.2.1366044274.1403732906",
    "_at_id_eig_hostgator_f4d3": "f31f89bb05d7440a.1399644288.7.1406659587.1406657624.2.1108.",
    "wire": "a82e089e012e129b6e0b426bd87ac4a2",
    "wire_challenge": "b93acdb397a33e4c2a55d454c18a68ca"
    }
    },
    "request_type": "put"
    }
    }
    */

    echo json_encode($output);

    /* end of /templates/401-response.php */
    316 changes: 316 additions & 0 deletions Rest.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,316 @@
    <?php
    /*
    * ProcessWire REST Helper.
    *
    * Copyright (c) 2014 Camilo Castro <camilo@cervezapps.cl>
    *
    * Some portions of code are based on the Lime Project
    * https://github.com/aheinze/Lime/
    * Copyright (c) 2014 Artur Heinze
    *
    * Permission is hereby granted, free of charge, to any person obtaining a copy
    * of this software and associated documentation files (the "Software"), to deal
    * in the Software without restriction, including without limitation the rights
    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    * copies of the Software, and to permit persons to whom the Software is furnished
    * to do so, subject to the following conditions:
    *
    * The above copyright notice and this permission notice shall be included in all
    * copies or substantial portions of the Software.
    *
    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    * THE SOFTWARE.
    */

    namespace Rest;

    class Header {
    public static $statusCodes = array(
    // Informational 1xx
    100 => 'Continue',
    101 => 'Switching Protocols',
    // Successful 2xx
    200 => 'OK',
    201 => 'Created',
    202 => 'Accepted',
    203 => 'Non-Authoritative Information',
    204 => 'No Content',
    205 => 'Reset Content',
    206 => 'Partial Content',
    // Redirection 3xx
    300 => 'Multiple Choices',
    301 => 'Moved Permanently',
    302 => 'Found',
    303 => 'See Other',
    304 => 'Not Modified',
    305 => 'Use Proxy',
    307 => 'Temporary Redirect',
    // Client Error 4xx
    400 => 'Bad Request',
    401 => 'Unauthorized',
    402 => 'Payment Required',
    403 => 'Forbidden',
    404 => 'Not Found',
    405 => 'Method Not Allowed',
    406 => 'Not Acceptable',
    407 => 'Proxy Authentication Required',
    408 => 'Request Timeout',
    409 => 'Conflict',
    410 => 'Gone',
    411 => 'Length Required',
    412 => 'Precondition Failed',
    413 => 'Request Entity Too Large',
    414 => 'Request-URI Too Long',
    415 => 'Unsupported Media Type',
    416 => 'Request Range Not Satisfiable',
    417 => 'Expectation Failed',
    // Server Error 5xx
    500 => 'Internal Server Error',
    501 => 'Not Implemented',
    502 => 'Bad Gateway',
    503 => 'Service Unavailable',
    504 => 'Gateway Timeout',
    505 => 'HTTP Version Not Supported'
    );

    /* mime types */
    public static $mimeTypes = array(
    'asc' => 'text/plain',
    'au' => 'audio/basic',
    'avi' => 'video/x-msvideo',
    'bin' => 'application/octet-stream',
    'class' => 'application/octet-stream',
    'css' => 'text/css',
    'csv' => 'application/vnd.ms-excel',
    'doc' => 'application/msword',
    'dll' => 'application/octet-stream',
    'dvi' => 'application/x-dvi',
    'exe' => 'application/octet-stream',
    'htm' => 'text/html',
    'html' => 'text/html',
    'json' => 'application/json',
    'js' => 'application/x-javascript',
    'txt' => 'text/plain',
    'bmp' => 'image/bmp',
    'rss' => 'application/rss+xml',
    'atom' => 'application/atom+xml',
    'gif' => 'image/gif',
    'jpeg' => 'image/jpeg',
    'jpg' => 'image/jpeg',
    'jpe' => 'image/jpeg',
    'png' => 'image/png',
    'ico' => 'image/vnd.microsoft.icon',
    'mpeg' => 'video/mpeg',
    'mpg' => 'video/mpeg',
    'mpe' => 'video/mpeg',
    'qt' => 'video/quicktime',
    'mov' => 'video/quicktime',
    'wmv' => 'video/x-ms-wmv',
    'mp2' => 'audio/mpeg',
    'mp3' => 'audio/mpeg',
    'rm' => 'audio/x-pn-realaudio',
    'ram' => 'audio/x-pn-realaudio',
    'rpm' => 'audio/x-pn-realaudio-plugin',
    'ra' => 'audio/x-realaudio',
    'wav' => 'audio/x-wav',
    'zip' => 'application/zip',
    'pdf' => 'application/pdf',
    'xls' => 'application/vnd.ms-excel',
    'ppt' => 'application/vnd.ms-powerpoint',
    'wbxml' => 'application/vnd.wap.wbxml',
    'wmlc' => 'application/vnd.wap.wmlc',
    'wmlsc' => 'application/vnd.wap.wmlscriptc',
    'spl' => 'application/x-futuresplash',
    'gtar' => 'application/x-gtar',
    'gzip' => 'application/x-gzip',
    'swf' => 'application/x-shockwave-flash',
    'tar' => 'application/x-tar',
    'xhtml' => 'application/xhtml+xml',
    'snd' => 'audio/basic',
    'midi' => 'audio/midi',
    'mid' => 'audio/midi',
    'm3u' => 'audio/x-mpegurl',
    'tiff' => 'image/tiff',
    'tif' => 'image/tiff',
    'rtf' => 'text/rtf',
    'wml' => 'text/vnd.wap.wml',
    'wmls' => 'text/vnd.wap.wmlscript',
    'xsl' => 'text/xml',
    'xml' => 'text/xml'
    );

    public static function mimeType($_mime) {
    $mime = Header::$mimeTypes[$_mime];
    $mime = "Content-Type: $mime";
    return $mime;
    }
    }

    class Request {
    public static $types = array
    (
    'get',
    'post',
    'put',
    'patch',
    'delete',
    'options',
    'ajax',
    'mobile',
    'ssl'
    );

    /**
    * Request helper function
    * @param String $type
    * @return Boolean
    */
    public static function is($type){

    switch(strtolower($type)){
    case 'ajax':
    return (
    (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) ||
    (isset($_SERVER["CONTENT_TYPE"]) && stripos($_SERVER["CONTENT_TYPE"],'application/json')!==false) ||
    (isset($_SERVER["HTTP_CONTENT_TYPE"]) && stripos($_SERVER["HTTP_CONTENT_TYPE"],'application/json')!==false)
    );
    break;

    case 'mobile':

    $mobileDevices = array(
    "midp","240x320","blackberry","netfront","nokia","panasonic","portalmmm","sharp","sie-","sonyericsson",
    "symbian","windows ce","benq","mda","mot-","opera mini","philips","pocket pc","sagem","samsung",
    "sda","sgh-","vodafone","xda","iphone", "ipod","android"
    );

    return preg_match('/(' . implode('|', $mobileDevices). ')/i',strtolower($_SERVER['HTTP_USER_AGENT']));
    break;

    case 'post':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'post');
    break;

    case 'get':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'get');
    break;

    case 'put':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'put');
    break;

    case 'options':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'options');
    break;

    case 'patch':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'patch');
    break;

    case 'delete':
    return (strtolower($_SERVER['REQUEST_METHOD']) == 'delete');
    break;

    case 'ssl':
    return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');
    break;
    }

    return false;
    }

    /**
    * Get current request type
    * @return String
    */
    public static function currentType() {
    $currentType = null;
    foreach(Request::$types as $type) {
    if(Request::is($type)){
    $currentType = $type;
    break;
    }
    }

    return $currentType;
    }

    /**
    * Get request variables
    * @param String $index
    * @param Misc $default
    * @param Array $source
    * @return Misc
    */
    public static function params($index=null, $default = null, $source = null) {

    // check for php://input and merge with $_REQUEST
    if ((isset($_SERVER["CONTENT_TYPE"]) &&
    stripos($_SERVER["CONTENT_TYPE"],'application/json') !== false) ||
    (isset($_SERVER["HTTP_CONTENT_TYPE"]) &&
    stripos($_SERVER["HTTP_CONTENT_TYPE"],'application/json') !== false) // PHP build in Webserver !?
    ) {
    if ($json = json_decode(@file_get_contents('php://input'), true)) {
    $_REQUEST = array_merge($_REQUEST, $json);
    }
    }

    $src = $source ? $source : $_REQUEST;
    return REQUEST::fetch_from_array($src, $index, $default);
    }

    /**
    * Helper function for params method
    */
    public static function fetch_from_array(&$array, $index=null, $default = null) {

    if (is_null($index)) {

    return $array;

    } elseif (isset($array[$index])) {

    return $array[$index];

    } elseif (strpos($index, '/')) {

    $keys = explode('/', $index);

    switch(count($keys)){

    case 1:
    if (isset($array[$keys[0]])){
    return $array[$keys[0]];
    }
    break;

    case 2:
    if (isset($array[$keys[0]][$keys[1]])){
    return $array[$keys[0]][$keys[1]];
    }
    break;

    case 3:
    if (isset($array[$keys[0]][$keys[1]][$keys[2]])){
    return $array[$keys[0]][$keys[1]][$keys[2]];
    }
    break;

    case 4:
    if (isset($array[$keys[0]][$keys[1]][$keys[2]][$keys[3]])){
    return $array[$keys[0]][$keys[1]][$keys[2]][$keys[3]];
    }
    break;
    }
    }

    return $default;
    }
    }

    /* end of file templates/helpers/Rest.php */