Util   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
dl 0
loc 108
rs 10
c 0
b 0
f 0
wmc 15
lcom 0
cbo 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A urlencodeRfc3986() 0 10 3
A urldecodeRfc3986() 0 4 1
B parseParameters() 0 31 6
B buildHttpQuery() 0 33 5
1
<?php
2
/**
3
 * The MIT License
4
 * Copyright (c) 2007 Andy Smith
5
 */
6
namespace Abraham\TwitterOAuth;
7
8
class Util
9
{
10
    /**
11
     * @param $input
12
     *
13
     * @return array|mixed|string
14
     */
15
    public static function urlencodeRfc3986($input)
16
    {
17
        $output = '';
18
        if (is_array($input)) {
19
            $output = array_map([__NAMESPACE__ . '\Util', 'urlencodeRfc3986'], $input);
20
        } elseif (is_scalar($input)) {
21
            $output = rawurlencode($input);
22
        }
23
        return $output;
24
    }
25
26
    /**
27
     * @param string $string
28
     *
29
     * @return string
30
     */
31
    public static function urldecodeRfc3986($string)
32
    {
33
        return urldecode($string);
34
    }
35
36
    /**
37
     * This function takes a input like a=b&a=c&d=e and returns the parsed
38
     * parameters like this
39
     * array('a' => array('b','c'), 'd' => 'e')
40
     *
41
     * @param string $input
42
     *
43
     * @return array
44
     */
45
    public static function parseParameters($input)
46
    {
47
        if (!is_string($input)) {
48
            return [];
49
        }
50
51
        $pairs = explode('&', $input);
52
53
        $parameters = [];
54
        foreach ($pairs as $pair) {
55
            $split = explode('=', $pair, 2);
56
            $parameter = Util::urldecodeRfc3986($split[0]);
57
            $value = isset($split[1]) ? Util::urldecodeRfc3986($split[1]) : '';
58
59
            if (isset($parameters[$parameter])) {
60
                // We have already recieved parameter(s) with this name, so add to the list
61
                // of parameters with this name
62
63
                if (is_scalar($parameters[$parameter])) {
64
                    // This is the first duplicate, so transform scalar (string) into an array
65
                    // so we can add the duplicates
66
                    $parameters[$parameter] = [$parameters[$parameter]];
67
                }
68
69
                $parameters[$parameter][] = $value;
70
            } else {
71
                $parameters[$parameter] = $value;
72
            }
73
        }
74
        return $parameters;
75
    }
76
77
    /**
78
     * @param array $params
79
     *
80
     * @return string
81
     */
82
    public static function buildHttpQuery(array $params)
83
    {
84
        if (empty($params)) {
85
            return '';
86
        }
87
88
        // Urlencode both keys and values
89
        $keys = Util::urlencodeRfc3986(array_keys($params));
90
        $values = Util::urlencodeRfc3986(array_values($params));
91
        $params = array_combine($keys, $values);
92
93
        // Parameters are sorted by name, using lexicographical byte value ordering.
94
        // Ref: Spec: 9.1.1 (1)
0 ignored issues
show
Unused Code Comprehensibility introduced by
46% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
95
        uksort($params, 'strcmp');
96
97
        $pairs = [];
98
        foreach ($params as $parameter => $value) {
99
            if (is_array($value)) {
100
                // If two or more parameters share the same name, they are sorted by their value
101
                // Ref: Spec: 9.1.1 (1)
0 ignored issues
show
Unused Code Comprehensibility introduced by
46% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
102
                // June 12th, 2010 - changed to sort because of issue 164 by hidetaka
103
                sort($value, SORT_STRING);
104
                foreach ($value as $duplicateValue) {
105
                    $pairs[] = $parameter . '=' . $duplicateValue;
106
                }
107
            } else {
108
                $pairs[] = $parameter . '=' . $value;
109
            }
110
        }
111
        // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61)
112
        // Each name-value pair is separated by an '&' character (ASCII code 38)
113
        return implode('&', $pairs);
114
    }
115
}
116