}
case PHP_HTTP_HEADER_PARSER_STATE_KEY: {
- const char *colon, *eol_str;
- int eol_len;
+ const char *colon, *eol_str = NULL;
+ int eol_len = 0;
if (buffer->data == (eol_str = php_http_locate_bin_eol(buffer->data, buffer->used, &eol_len))) {
/* end of headers */
#include "php_http_api.h"
-PHP_HTTP_API void php_http_info_default_callback(void **nothing, HashTable **headers, php_http_info_t *info TSRMLS_DC)
-{
- zval array;
- (void) nothing;
-
- INIT_PZVAL_ARRAY(&array, *headers);
-
- switch (info->type) {
- case PHP_HTTP_REQUEST:
- add_assoc_string(&array, "Request Method", PHP_HTTP_INFO(info).request.method, 1);
- add_assoc_string(&array, "Request Url", PHP_HTTP_INFO(info).request.url, 1);
- break;
-
- case PHP_HTTP_RESPONSE:
- add_assoc_long(&array, "Response Code", (long) PHP_HTTP_INFO(info).response.code);
- add_assoc_string(&array, "Response Status", PHP_HTTP_INFO(info).response.status, 1);
- break;
-
- case PHP_HTTP_NONE:
- break;
- }
-}
-
PHP_HTTP_API php_http_info_t *php_http_info_init(php_http_info_t *i TSRMLS_DC)
{
if (!i) {
}
/* is request */
- else if (!http[lenof("HTTP/1.x")] || http[lenof("HTTP/1.x")] == '\r' || http[lenof("HTTP/1.x")] == '\n') {
+ else if (*(http - 1) == ' ' && !http[lenof("HTTP/1.x")] || http[lenof("HTTP/1.x")] == '\r' || http[lenof("HTTP/1.x")] == '\n') {
const char *url = strchr(pre_header, ' ');
info->type = PHP_HTTP_REQUEST;
if (http > url) {
PHP_HTTP_INFO(info).request.url = estrndup(url, http - url);
} else {
- efree(PHP_HTTP_INFO(info).request.method);
+ STR_SET(PHP_HTTP_INFO(info).request.method, NULL);
return NULL;
}
} else {
typedef zend_bool (*php_http_info_callback_t)(void **callback_data, HashTable **headers, php_http_info_t *info TSRMLS_DC);
-PHP_HTTP_API void php_http_info_default_callback(void **nothing, HashTable **headers, php_http_info_t *info TSRMLS_DC);
-
PHP_HTTP_API php_http_info_t *php_http_info_init(php_http_info_t *info TSRMLS_DC);
PHP_HTTP_API php_http_info_t *php_http_info_parse(php_http_info_t *info, const char *pre_header TSRMLS_DC);
PHP_HTTP_API void php_http_info_dtor(php_http_info_t *info);
--- /dev/null
+--TEST--
+invalid HTTP info
+--SKIPIF--
+<?php include "skipif.inc"; ?>
+--FILE--
+<?php
+
+try {
+ var_dump(new http\Message("GET HTTP/1.1"));
+} catch (Exception $e) {
+ echo $e, "\n";
+}
+try {
+ var_dump(new http\Message("GET HTTP/1.123"));
+} catch (Exception $e) {
+ echo $e, "\n";
+}
+try {
+ var_dump(new http\Message("GETHTTP/1.1"));
+} catch (Exception $e) {
+ echo $e, "\n";
+}
+var_dump(new http\Message("GET / HTTP/1.1"));
+?>
+DONE
+--EXPECTF--
+exception 'http\Exception' with message 'could not parse message: GET HTTP/1.1' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GET HTTP/1.1')
+#1 {main}
+exception 'http\Exception' with message 'could not parse message: GET HTTP/1.123' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GET HTTP/1.123')
+#1 {main}
+exception 'http\Exception' with message 'could not parse message: GETHTTP/1.1' in %s
+Stack trace:
+#0 %s: http\Message->__construct('GETHTTP/1.1')
+#1 {main}
+object(http\Message)#%d (10) {
+ ["errorHandling":protected]=>
+ NULL
+ ["type":protected]=>
+ int(1)
+ ["body":protected]=>
+ object(http\Message\Body)#%d (1) {
+ ["errorHandling":protected]=>
+ NULL
+ }
+ ["requestMethod":protected]=>
+ string(3) "GET"
+ ["requestUrl":protected]=>
+ string(1) "/"
+ ["responseStatus":protected]=>
+ string(0) ""
+ ["responseCode":protected]=>
+ int(0)
+ ["httpVersion":protected]=>
+ string(3) "1.1"
+ ["headers":protected]=>
+ array(0) {
+ }
+ ["parentMessage":protected]=>
+ NULL
+}
+DONE