-
-
Notifications
You must be signed in to change notification settings - Fork 64
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Request HTTP method defaults to empty string #26
Comments
What would you consider a valid default? GET? HEAD? OPTIONS? Additionally, IIRC, somebody presented a use case for allowing a nullable
Originally posted by @weierophinney at zendframework/zend-diactoros#150 (comment) |
That is a good question, but I'm fairly sure that 90% of the web traffic is just Overall, this logic can be encapsulated in a tiny Originally posted by @Ocramius at zendframework/zend-diactoros#150 (comment) |
I've just remembered that i implemented psr-7 starting from phly/http and added a default method in the constructor ('GET') and a simple http-method filtering method (mwop would have nameed it marhallMethod). Juts to get an idea form ths code fragment //...
protected static $validMethods = [
'OPTIONS' => true,
'GET' => true,
'HEAD' => true,
'POST' => true,
'PUT' => true,
'DELETE' => true,
'TRACE' => true,
'CONNECT' => true,
'PATCH' => true,
'PROPFIND' => true,
];
/**
* Array of possible CSRF Header names
* @var array
*/
protected static $csrfHeaderNames = [
'X-CSRF-Token',
'X-CSRFToken',
'X-XSRF-TOKEN',
];
/**
* Constructor
* @param UriInterface $uri
* @param string $method
* @param array $headers
* @param Stream|resource|string $body
* @param string $protocolVersion
* @throws InvalidArgumentExceptions
*/
public function __construct(
$uri = null,
$method = 'GET',
$headers = [],
$body = 'php://temp',
$protocolVersion = '1.1'
) {
parent::__construct($protocolVersion, $headers, $body);
$this->method = $this->filterMethod($method);
// Initialize uri from constructor argument or build uri from request
// environment
if (null === $uri) {
$this->uri = new Uri('');
} else if (is_string($uri)) {
$this->uri = new Uri($uri);
} elseif($uri instanceof UriInterface) {
$this->uri = $uri;
} else {
throw new InvalidArgumentException(
'The constructor $uri must be a string, an instance of UriInterface or null'
);
}
}
//...
/**
* Validate the HTTP method
*
* @param null|string $method
* @throws InvalidArgumentException on invalid HTTP method.
*/
protected function filterMethod($method)
{
if (null === $method) {
return 'GET';
}
if (! is_string($method)) {
throw new InvalidArgumentException(
'The HTTP method must be a string'
);
}
$method = strtoupper($method);
if (! isset(static::$validMethods[$method])) {
throw new InvalidArgumentException(sprintf(
'Unsupported HTTP method "%s"',
$method
));
}
return $method;
} Originally posted by @pine3ree at zendframework/zend-diactoros#150 (comment) |
@Ocramius is this still relevant? |
Haven't used it in a while, but I don't remember us validating this input anywhere. |
@Ocramius behavior is unchanged since the issue was opened. I was rather asking if it is a behavior that you still think needs to be changed. |
Yeah, I'd say that an empty HTTP method is not viable, so we'd need some default or some exception |
Nevermind. I tested it wrong and missed default method value in the trait. laminas-diactoros/src/RequestTrait.php Line 34 in 800f287
This is already handled. |
Discovered while digging in php-http/curl-client#14
Apparently, diactoros defaults the HTTP method when building a
new Request('http://example.com')
to''
(empty string). As far as I know, an empty string is not a valid HTTP method (not sure if that assumption is reflected in the HTTP spec), and therefore the initial state of a diactoros HTTP request is invalid, and should lead to an exception.Originally posted by @Ocramius at zendframework/zend-diactoros#150
The text was updated successfully, but these errors were encountered: