version 1.1.1.2, 2013/07/22 01:32:13
|
version 1.1.1.3, 2013/10/14 08:02:45
|
Line 20
|
Line 20
|
/* $Id$ */ |
/* $Id$ */ |
|
|
#include <stdio.h> |
#include <stdio.h> |
|
#include <stdlib.h> |
#include <fcntl.h> |
#include <fcntl.h> |
#include <assert.h> |
#include <assert.h> |
|
|
Line 192 typedef struct php_cli_server {
|
Line 193 typedef struct php_cli_server {
|
HashTable clients; |
HashTable clients; |
} php_cli_server; |
} php_cli_server; |
|
|
typedef struct php_cli_server_http_reponse_status_code_pair { | typedef struct php_cli_server_http_response_status_code_pair { |
int code; |
int code; |
const char *str; |
const char *str; |
} php_cli_server_http_reponse_status_code_pair; | } php_cli_server_http_response_status_code_pair; |
|
|
typedef struct php_cli_server_ext_mime_type_pair { |
typedef struct php_cli_server_ext_mime_type_pair { |
const char *ext; |
const char *ext; |
const char *mime_type; |
const char *mime_type; |
} php_cli_server_ext_mime_type_pair; |
} php_cli_server_ext_mime_type_pair; |
|
|
static php_cli_server_http_reponse_status_code_pair status_map[] = { | static php_cli_server_http_response_status_code_pair status_map[] = { |
{ 100, "Continue" }, |
{ 100, "Continue" }, |
{ 101, "Switching Protocols" }, |
{ 101, "Switching Protocols" }, |
{ 200, "OK" }, |
{ 200, "OK" }, |
Line 249 static php_cli_server_http_reponse_status_code_pair st
|
Line 250 static php_cli_server_http_reponse_status_code_pair st
|
{ 511, "Network Authentication Required" }, |
{ 511, "Network Authentication Required" }, |
}; |
}; |
|
|
static php_cli_server_http_reponse_status_code_pair template_map[] = { | static php_cli_server_http_response_status_code_pair template_map[] = { |
{ 400, "<h1>%s</h1><p>Your browser sent a request that this server could not understand.</p>" }, |
{ 400, "<h1>%s</h1><p>Your browser sent a request that this server could not understand.</p>" }, |
{ 404, "<h1>%s</h1><p>The requested resource %s was not found on this server.</p>" }, |
{ 404, "<h1>%s</h1><p>The requested resource %s was not found on this server.</p>" }, |
{ 500, "<h1>%s</h1><p>The server is temporarily unavailable.</p>" }, |
{ 500, "<h1>%s</h1><p>The server is temporarily unavailable.</p>" }, |
Line 333 static char *get_last_error() /* {{{ */
|
Line 334 static char *get_last_error() /* {{{ */
|
return pestrdup(strerror(errno), 1); |
return pestrdup(strerror(errno), 1); |
} /* }}} */ |
} /* }}} */ |
|
|
|
static int status_comp(const void *a, const void *b) /* {{{ */ |
|
{ |
|
const php_cli_server_http_response_status_code_pair *pa = (const php_cli_server_http_response_status_code_pair *) a; |
|
const php_cli_server_http_response_status_code_pair *pb = (const php_cli_server_http_response_status_code_pair *) b; |
|
|
|
if (pa->code < pb->code) { |
|
return -1; |
|
} else if (pa->code > pb->code) { |
|
return 1; |
|
} |
|
|
|
return 0; |
|
} /* }}} */ |
|
|
static const char *get_status_string(int code) /* {{{ */ |
static const char *get_status_string(int code) /* {{{ */ |
{ |
{ |
size_t e = (sizeof(status_map) / sizeof(php_cli_server_http_reponse_status_code_pair)); | php_cli_server_http_response_status_code_pair needle, *result = NULL; |
size_t s = 0; | |
|
|
while (e != s) { | needle.code = code; |
size_t c = MIN((e + s + 1) / 2, e - 1); | needle.str = NULL; |
int d = status_map[c].code; | |
if (d > code) { | result = bsearch(&needle, status_map, sizeof(status_map) / sizeof(needle), sizeof(needle), status_comp); |
e = c; | |
} else if (d < code) { | if (result) { |
s = c; | return result->str; |
} else { | |
return status_map[c].str; | |
} | |
} |
} |
return NULL; | |
| /* Returning NULL would require complicating append_http_status_line() to |
| * not segfault in that case, so let's just return a placeholder, since RFC |
| * 2616 requires a reason phrase. This is basically what a lot of other Web |
| * servers do in this case anyway. */ |
| return "Unknown Status Code"; |
} /* }}} */ |
} /* }}} */ |
|
|
static const char *get_template_string(int code) /* {{{ */ |
static const char *get_template_string(int code) /* {{{ */ |
{ |
{ |
size_t e = (sizeof(template_map) / sizeof(php_cli_server_http_reponse_status_code_pair)); | size_t e = (sizeof(template_map) / sizeof(php_cli_server_http_response_status_code_pair)); |
size_t s = 0; |
size_t s = 0; |
|
|
while (e != s) { |
while (e != s) { |
Line 1309 static void php_cli_server_request_translate_vpath(php
|
Line 1325 static void php_cli_server_request_translate_vpath(php
|
static const char *index_files[] = { "index.php", "index.html", NULL }; |
static const char *index_files[] = { "index.php", "index.html", NULL }; |
char *buf = safe_pemalloc(1, request->vpath_len, 1 + document_root_len + 1 + sizeof("index.html"), 1); |
char *buf = safe_pemalloc(1, request->vpath_len, 1 + document_root_len + 1 + sizeof("index.html"), 1); |
char *p = buf, *prev_path = NULL, *q, *vpath; |
char *p = buf, *prev_path = NULL, *q, *vpath; |
size_t prev_path_len; | size_t prev_path_len = 0; |
int is_static_file = 0; |
int is_static_file = 0; |
|
|
if (!buf) { |
if (!buf) { |