X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http.c;h=5aac8211837c9e01dd24b68e5cb3e81fffac4cbb;hb=48332dd93149488fe3f40b2163378d7988e10599;hp=f189a1a58a5c48fae60e865a334b382278edfcc4;hpb=c162ccee5b55f236c2a41cac42f64be3db37915a;p=m6w6%2Fext-http diff --git a/http.c b/http.c index f189a1a..5aac821 100644 --- a/http.c +++ b/http.c @@ -1069,12 +1069,27 @@ static void php_http_init_globals(zend_http_globals *http_globals) } /* }}} */ +/* {{{ static inline STATUS http_check_allowed_methods(char *, int) */ +#define http_check_allowed_methods(m, l) _http_check_allowed_methods((m), (l) TSRMLS_CC) +static inline STATUS _http_check_allowed_methods(char *methods, int length TSRMLS_DC) +{ + if (length && SG(request_info).request_method && (!strstr(methods, SG(request_info).request_method))) { + char *allow_header = emalloc(length + sizeof("Allow: ")); + sprintf(allow_header, "Allow: %s", methods); + http_send_header(allow_header); + efree(allow_header); + http_send_status(405); + return FAILURE; + } + return SUCCESS; +} +/* }}} */ + /* {{{ PHP_INI */ PHP_INI_MH(update_allowed_methods) { - if (SG(request_info).request_method && new_value_length && (!strstr(new_value, SG(request_info).request_method))) { - http_send_status(405); - return SUCCESS; + if (SUCCESS != http_check_allowed_methods(new_value, new_value_length)) { + return FAILURE; } return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC); } @@ -1110,10 +1125,7 @@ PHP_MSHUTDOWN_FUNCTION(http) PHP_RINIT_FUNCTION(http) { char *allowed_methods = INI_STR("http.allowed_methods"); - if (SG(request_info).request_method && strlen(allowed_methods) && (!strstr(allowed_methods, SG(request_info).request_method))) { - http_send_status(405); - } - return SUCCESS; + return http_check_allowed_methods(allowed_methods, strlen(allowed_methods)); } /* }}} */ @@ -1156,7 +1168,7 @@ PHP_MINFO_FUNCTION(http) #endif ); php_info_print_table_end(); - + DISPLAY_INI_ENTRIES(); } /* }}} */