Altered MediaType parse routine.

This commit is contained in:
flash 2023-02-01 20:24:42 +00:00
parent 1a8344c1c3
commit bce5ba77a2
2 changed files with 12 additions and 13 deletions

View File

@ -1 +1 @@
0.2301.252226 0.2302.12024

View File

@ -1,7 +1,7 @@
<?php <?php
// MediaType.php // MediaType.php
// Created: 2022-02-10 // Created: 2022-02-10
// Updated: 2022-02-27 // Updated: 2023-02-01
namespace Index; namespace Index;
@ -133,25 +133,24 @@ class MediaType implements Stringable, IComparable, IEquatable {
} }
public static function parse(string $mediaTypeStr): MediaType { public static function parse(string $mediaTypeStr): MediaType {
if(preg_match('#^([A-Za-z0-9\!\#\$%&\'\*\+\.\-_\{\}\|]+)/([A-Za-z0-9\!\#\$%&\'\*\+\.\-_\{\}\|]+)(?: ?; ?([A-Za-z0-9\!\#\$%&\'\*\+\.\-_\{\}\|\=; ]+))?$#', $mediaTypeStr, $matches) !== 1) $parts = explode(';', $mediaTypeStr);
if(empty($parts))
throw new InvalidArgumentException('Invalid media type supplied.'); throw new InvalidArgumentException('Invalid media type supplied.');
$category = $matches[1]; $mediaTypeStr = array_shift($parts);
$mediaTypeParts = explode('/', $mediaTypeStr, 2);
$kindSplit = explode('+', $matches[2], 2); $category = $mediaTypeParts[0];
$kindSplit = explode('+', $mediaTypeParts[1] ?? '', 2);
$kind = $kindSplit[0]; $kind = $kindSplit[0];
$suffix = $kindSplit[1] ?? ''; $suffix = $kindSplit[1] ?? '';
$params = []; $params = [];
if(isset($matches[3])) { foreach($parts as $part) {
$rawParams = explode(';', $matches[3]); $paramSplit = explode('=', trim($part), 2);
foreach($rawParams as $param) { $params[trim($paramSplit[0])] = trim($paramSplit[1] ?? '', " \n\r\t\v\0\"");
$parts = explode('=', trim($param), 2);
if(!isset($parts[1]))
continue;
$params[$parts[0]] = $parts[1];
}
} }
return new MediaType($category, $kind, $suffix, $params); return new MediaType($category, $kind, $suffix, $params);