<?php
namespace Ratchet\Protocol\WebSocket\Util;

/**
 * A helper class for handling HTTP requests
 */
class HTTP {
    /**
     * @todo Probably should iterate through the array, strtolower all the things, then return it
     * @param string
     * @return array
     */
    public static function getHeaders($http_message) {
        return function_exists('http_parse_headers') ? http_parse_headers($http_message) : self::http_parse_headers($http_message);
    }

    /**
     * @param string
     * @return array
     * This is a fallback method for http_parse_headers as not all php installs have the HTTP module present
     * @internal
     */
    protected static function http_parse_headers($http_message) {
        $retVal = array();
        $fields = explode("br", preg_replace("%(<|/\>|>)%", "", nl2br($http_message)));

        foreach ($fields as $field) {
            if (preg_match('%^(GET|POST|PUT|DELETE|PATCH)(\s)(.*)%', $field, $matchReq)) {
                $retVal["Request Method"] = $matchReq[1];
                $retVal["Request Url"]    = $matchReq[3];
            } elseif (preg_match('/([^:]+): (.+)/m', $field, $match) ) {
                $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
                if (isset($retVal[$match[1]])) {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                } else {
                    $retVal[$match[1]] = trim($match[2]);
                }
            }
        }

        return $retVal;
    }
}