Skip to content

Commit 8d2f281

Browse files
vedranmileticMarin Martuslović
andcommitted
Respond without body to HEAD request on a static resource
Co-authored-by: Marin Martuslović <[email protected]>
1 parent 733023b commit 8d2f281

File tree

2 files changed

+48
-43
lines changed

2 files changed

+48
-43
lines changed

sapi/cli/php_cli_server.c

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,49 +1944,51 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server
19441944
php_cli_server_content_sender_ctor(&client->content_sender);
19451945
client->content_sender_initialized = 1;
19461946

1947-
escaped_request_uri = php_escape_html_entities_ex((const unsigned char *) client->request.request_uri, client->request.request_uri_len, 0, ENT_QUOTES, NULL, /* double_encode */ 0, /* quiet */ 0);
1947+
if (client->request.request_method != PHP_HTTP_HEAD) {
1948+
escaped_request_uri = php_escape_html_entities_ex((const unsigned char *) client->request.request_uri, client->request.request_uri_len, 0, ENT_QUOTES, NULL, /* double_encode */ 0, /* quiet */ 0);
19481949

1949-
{
1950-
static const char prologue_template[] = "<!doctype html><html><head><title>%d %s</title>";
1951-
php_cli_server_chunk *chunk = php_cli_server_chunk_heap_new_self_contained(strlen(prologue_template) + 3 + strlen(status_string) + 1);
1952-
if (!chunk) {
1953-
goto fail;
1950+
{
1951+
static const char prologue_template[] = "<!doctype html><html><head><title>%d %s</title>";
1952+
php_cli_server_chunk *chunk = php_cli_server_chunk_heap_new_self_contained(strlen(prologue_template) + 3 + strlen(status_string) + 1);
1953+
if (!chunk) {
1954+
goto fail;
1955+
}
1956+
snprintf(chunk->data.heap.p, chunk->data.heap.len, prologue_template, status, status_string);
1957+
chunk->data.heap.len = strlen(chunk->data.heap.p);
1958+
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19541959
}
1955-
snprintf(chunk->data.heap.p, chunk->data.heap.len, prologue_template, status, status_string);
1956-
chunk->data.heap.len = strlen(chunk->data.heap.p);
1957-
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
1958-
}
1959-
{
1960-
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(php_cli_server_css, sizeof(php_cli_server_css) - 1);
1961-
if (!chunk) {
1962-
goto fail;
1960+
{
1961+
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(php_cli_server_css, sizeof(php_cli_server_css) - 1);
1962+
if (!chunk) {
1963+
goto fail;
1964+
}
1965+
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19631966
}
1964-
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
1965-
}
1966-
{
1967-
static const char template[] = "</head><body>";
1968-
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(template, sizeof(template) - 1);
1969-
if (!chunk) {
1970-
goto fail;
1967+
{
1968+
static const char template[] = "</head><body>";
1969+
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(template, sizeof(template) - 1);
1970+
if (!chunk) {
1971+
goto fail;
1972+
}
1973+
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19711974
}
1972-
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
1973-
}
1974-
{
1975-
php_cli_server_chunk *chunk = php_cli_server_chunk_heap_new_self_contained(strlen(content_template) + ZSTR_LEN(escaped_request_uri) + 3 + strlen(status_string) + 1);
1976-
if (!chunk) {
1977-
goto fail;
1975+
{
1976+
php_cli_server_chunk *chunk = php_cli_server_chunk_heap_new_self_contained(strlen(content_template) + ZSTR_LEN(escaped_request_uri) + 3 + strlen(status_string) + 1);
1977+
if (!chunk) {
1978+
goto fail;
1979+
}
1980+
snprintf(chunk->data.heap.p, chunk->data.heap.len, content_template, status_string, ZSTR_VAL(escaped_request_uri));
1981+
chunk->data.heap.len = strlen(chunk->data.heap.p);
1982+
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19781983
}
1979-
snprintf(chunk->data.heap.p, chunk->data.heap.len, content_template, status_string, ZSTR_VAL(escaped_request_uri));
1980-
chunk->data.heap.len = strlen(chunk->data.heap.p);
1981-
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
1982-
}
1983-
{
1984-
static const char epilogue_template[] = "</body></html>";
1985-
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(epilogue_template, sizeof(epilogue_template) - 1);
1986-
if (!chunk) {
1987-
goto fail;
1984+
{
1985+
static const char epilogue_template[] = "</body></html>";
1986+
php_cli_server_chunk *chunk = php_cli_server_chunk_immortal_new(epilogue_template, sizeof(epilogue_template) - 1);
1987+
if (!chunk) {
1988+
goto fail;
1989+
}
1990+
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19881991
}
1989-
php_cli_server_buffer_append(&client->content_sender.buffer, chunk);
19901992
}
19911993

19921994
{
@@ -2017,14 +2019,18 @@ static int php_cli_server_send_error_page(php_cli_server *server, php_cli_server
20172019
if (errstr) {
20182020
pefree(errstr, 1);
20192021
}
2020-
zend_string_free(escaped_request_uri);
2022+
if (escaped_request_uri) {
2023+
zend_string_free(escaped_request_uri);
2024+
}
20212025
return SUCCESS;
20222026

20232027
fail:
20242028
if (errstr) {
20252029
pefree(errstr, 1);
20262030
}
2027-
zend_string_free(escaped_request_uri);
2031+
if (escaped_request_uri) {
2032+
zend_string_free(escaped_request_uri);
2033+
}
20282034
return FAILURE;
20292035
} /* }}} */
20302036

@@ -2080,7 +2086,9 @@ static int php_cli_server_begin_send_static(php_cli_server *server, php_cli_serv
20802086

20812087
php_cli_server_content_sender_ctor(&client->content_sender);
20822088
client->content_sender_initialized = 1;
2083-
client->file_fd = fd;
2089+
if (client->request.request_method != PHP_HTTP_HEAD) {
2090+
client->file_fd = fd;
2091+
}
20842092

20852093
{
20862094
php_cli_server_chunk *chunk;

sapi/cli/tests/php_cli_server_013.phpt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,3 @@ Date: %s
9393
Connection: close
9494
Content-Type: text/html; charset=UTF-8
9595
Content-Length: %d
96-
97-
<!doctype html><html><head><title>404 Not Found</title><style>AAA</style>
98-
</head><body><h1>Not Found</h1><p>The requested resource <code class="url">/main/foo/bar</code> was not found on this server.</p></body></html>

0 commit comments

Comments
 (0)