5
5
namespace League \OpenAPIValidation \PSR7 \Validators \CookiesValidator ;
6
6
7
7
use cebe \openapi \spec \Parameter ;
8
- use Dflydev \FigCookies \Cookie ;
9
- use Dflydev \FigCookies \Cookies ;
10
8
use League \OpenAPIValidation \PSR7 \Exception \Validation \InvalidCookies ;
11
9
use League \OpenAPIValidation \PSR7 \MessageValidator ;
12
10
use League \OpenAPIValidation \PSR7 \OperationAddress ;
18
16
use Psr \Http \Message \RequestInterface ;
19
17
use Webmozart \Assert \Assert ;
20
18
19
+ use function array_key_exists ;
20
+ use function explode ;
21
+ use function implode ;
22
+
21
23
class RequestCookieValidator implements MessageValidator
22
24
{
23
25
use ValidationStrategy;
@@ -39,42 +41,64 @@ public function __construct(array $specs)
39
41
public function validate (OperationAddress $ addr , MessageInterface $ message ): void
40
42
{
41
43
Assert::isInstanceOf ($ message , RequestInterface::class);
42
- $ cookies = Cookies:: fromRequest ($ message );
44
+ $ cookies = $ this -> getCookiesFromMessage ($ message );
43
45
$ this ->checkRequiredCookies ($ cookies , $ addr );
44
46
$ this ->checkCookiesAgainstSchema ($ message , $ addr , $ cookies );
45
47
}
46
48
47
49
/**
50
+ * @param string[] $cookies
51
+ *
48
52
* @throws InvalidCookies
49
53
*/
50
- private function checkRequiredCookies (Cookies $ cookies , OperationAddress $ addr ): void
54
+ private function checkRequiredCookies (array $ cookies , OperationAddress $ addr ): void
51
55
{
52
56
foreach ($ this ->specs as $ cookieName => $ spec ) {
53
- if ($ spec ->required && ! $ cookies -> has ($ cookieName )) {
57
+ if ($ spec ->required && ! array_key_exists ($ cookieName, $ cookies )) {
54
58
throw InvalidCookies::becauseOfMissingRequiredCookie ($ cookieName , $ addr );
55
59
}
56
60
}
57
61
}
58
62
59
63
/**
64
+ * @param string[] $cookies
65
+ *
60
66
* @throws InvalidCookies
61
67
*/
62
- private function checkCookiesAgainstSchema (RequestInterface $ request , OperationAddress $ addr , Cookies $ cookies ): void
68
+ private function checkCookiesAgainstSchema (RequestInterface $ request , OperationAddress $ addr , array $ cookies ): void
63
69
{
64
70
$ validator = new SchemaValidator ($ this ->detectValidationStrategy ($ request ));
65
71
66
- foreach ($ cookies ->getAll () as $ cookie ) {
67
- /** @var Cookie $cookie */
68
- if (! isset ($ this ->specs [$ cookie ->getName ()])) {
72
+ foreach ($ cookies as $ cookieName => $ cookie ) {
73
+ if (! isset ($ this ->specs [$ cookieName ])) {
69
74
continue ;
70
75
}
71
76
72
- $ parameter = SerializedParameter::fromSpec ($ this ->specs [$ cookie -> getName () ]);
77
+ $ parameter = SerializedParameter::fromSpec ($ this ->specs [$ cookieName ]);
73
78
try {
74
- $ validator ->validate ($ parameter ->deserialize ($ cookie-> getValue () ), $ parameter ->getSchema ());
79
+ $ validator ->validate ($ parameter ->deserialize ($ cookie ), $ parameter ->getSchema ());
75
80
} catch (SchemaMismatch $ e ) {
76
- throw InvalidCookies::becauseValueDoesNotMatchSchema ($ cookie -> getName () , $ cookie-> getValue () , $ addr , $ e );
81
+ throw InvalidCookies::becauseValueDoesNotMatchSchema ($ cookieName , $ cookie , $ addr , $ e );
77
82
}
78
83
}
79
84
}
85
+
86
+ /**
87
+ * @return string[]
88
+ */
89
+ private function getCookiesFromMessage (MessageInterface $ message ): array
90
+ {
91
+ // Needed in case it is an array of cookies.
92
+ $ cookieString = implode ('; ' , $ message ->getHeader ('Cookie ' ));
93
+ $ headerCookies = explode ('; ' , $ cookieString );
94
+
95
+ $ cookies = [];
96
+ foreach ($ headerCookies as $ itm ) {
97
+ $ pairParts = explode ('= ' , $ itm , 2 );
98
+ $ pairParts [1 ] = $ pairParts [1 ] ?? '' ;
99
+ $ cookies [$ pairParts [0 ]] = $ pairParts [1 ];
100
+ }
101
+
102
+ return $ cookies ;
103
+ }
80
104
}
0 commit comments