Annotation of embedaddon/php/sapi/phttpd/phttpd.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:    +----------------------------------------------------------------------+
                      3:    | PHP Version 5                                                        |
                      4:    +----------------------------------------------------------------------+
                      5:    | Copyright (c) 1997-2012 The PHP Group                                |
                      6:    +----------------------------------------------------------------------+
                      7:    | This source file is subject to version 3.01 of the PHP license,      |
                      8:    | that is bundled with this package in the file LICENSE, and is        |
                      9:    | available through the world-wide-web at the following url:           |
                     10:    | http://www.php.net/license/3_01.txt                                  |
                     11:    | If you did not receive a copy of the PHP license and are unable to   |
                     12:    | obtain it through the world-wide-web, please send a note to          |
                     13:    | license@php.net so we can mail you a copy immediately.               |
                     14:    +----------------------------------------------------------------------+
                     15:    | Author: Thies C. Arntzen <thies@thieso.net>                                                 |
                     16:    | Based on aolserver SAPI by Sascha Schumann <sascha@schumann.cx>      |
                     17:    +----------------------------------------------------------------------+
                     18: */
                     19: 
                     20: #include "php.h"
                     21: #include "SAPI.h"
                     22: #include "php_main.h"
                     23: 
                     24: #ifdef HAVE_PHTTPD
                     25: 
                     26: #include "ext/standard/info.h"
                     27:  
                     28: #ifndef ZTS
                     29: #error PHTTPD module is only useable in thread-safe mode
                     30: #endif
                     31: 
                     32: #include "php_phttpd.h"
                     33: 
                     34: typedef struct {
                     35:     struct connectioninfo *cip;
                     36:        struct stat sb;
                     37: } phttpd_globals_struct; 
                     38: 
                     39: static int ph_globals_id;
                     40: 
                     41: #define PHG(v) TSRMG(ph_globals_id, phttpd_globals_struct *, v)
                     42: 
                     43: static int
                     44: php_phttpd_startup(sapi_module_struct *sapi_module)
                     45: {
                     46:        fprintf(stderr,"***php_phttpd_startup\n");
                     47: 
                     48:     if (php_module_startup(sapi_module, NULL, 0)) {
                     49:         return FAILURE;
                     50:     } else {
                     51:         return SUCCESS;
                     52:     }
                     53: }
                     54: 
                     55: static int
                     56: php_phttpd_sapi_ub_write(const char *str, uint str_length TSRMLS_DC)
                     57: {
                     58:     int sent_bytes;
                     59: 
                     60:        sent_bytes = fd_write(PHG(cip)->fd, str, str_length);
                     61: 
                     62:        if (sent_bytes == -1) {
                     63:                php_handle_aborted_connection();
                     64:        }
                     65: 
                     66:     return sent_bytes;
                     67: }
                     68: 
                     69: static int
                     70: php_phttpd_sapi_header_handler(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers TSRMLS_DC)
                     71: {
                     72:     char *header_name, *header_content;
                     73:     char *p;
                     74:     TSRMLS_FETCH();
                     75:  
                     76:        http_sendheaders(PHG(cip)->fd, PHG(cip), SG(sapi_headers).http_response_code, NULL);
                     77: 
                     78:     header_name = sapi_header->header;
                     79:     header_content = p = strchr(header_name, ':');
                     80:  
                     81:     if (p) {
                     82:         *p = '\0';
                     83:         do {
                     84:             header_content++;
                     85:         } while (*header_content == ' ');
                     86: 
                     87:                fd_printf(PHG(cip)->fd,"%s: %s\n", header_name, header_content);
                     88:  
                     89:         *p = ':';
                     90:     }
                     91: 
                     92:     sapi_free_header(sapi_header);
                     93: 
                     94:     return 0;
                     95: }
                     96: 
                     97: static int
                     98: php_phttpd_sapi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
                     99: {
                    100:     TSRMLS_FETCH();
                    101:  
                    102:     if (SG(sapi_headers).send_default_content_type) {
                    103:                fd_printf(PHG(cip)->fd,"Content-Type: text/html\n");
                    104:     }
                    105:  
                    106:        fd_putc('\n', PHG(cip)->fd);
                    107:  
                    108:     return SAPI_HEADER_SENT_SUCCESSFULLY;
                    109: }
                    110: 
                    111: static char *
                    112: php_phttpd_sapi_read_cookies(TSRMLS_D)
                    113: {
                    114: 
                    115: /*
                    116:     int i;
                    117:     char *http_cookie = NULL;
                    118:     NTSRMLS_FETCH();
                    119:  
                    120:     i = Ns_SetIFind(NSG(conn->headers), "cookie");
                    121:     if(i != -1) {
                    122:         http_cookie = Ns_SetValue(NSG(conn->headers), i);
                    123:     }
                    124:  
                    125:     return http_cookie;
                    126: */
                    127:        fprintf(stderr,"***php_phttpd_sapi_read_cookies\n");
                    128:  
                    129:        return 0;
                    130: }
                    131: 
                    132: static int
                    133: php_phttpd_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC)
                    134: {
                    135: /*
                    136:     uint max_read;
                    137:     uint total_read = 0;
                    138:     NTSRMLS_FETCH();
                    139:  
                    140:     max_read = MIN(NSG(data_avail), count_bytes);
                    141:  
                    142:     total_read = Ns_ConnRead(NSG(conn), buf, max_read);
                    143:  
                    144:     if(total_read == NS_ERROR) {
                    145:         total_read = -1;
                    146:     } else {
                    147:         NSG(data_avail) -= total_read;
                    148:     }
                    149:  
                    150:     return total_read;
                    151: */
                    152:        fprintf(stderr,"***php_phttpd_sapi_read_post\n");
                    153:        return 0;
                    154: }
                    155: 
                    156: static sapi_module_struct phttpd_sapi_module = {
                    157:     "phttpd",
                    158:     "PHTTPD",
                    159:  
                    160:     php_phttpd_startup,                     /* startup */
                    161:     php_module_shutdown_wrapper,            /* shutdown */
                    162:  
                    163:        NULL,                                                                   /* activate */
                    164:        NULL,                                                                   /* deactivate */
                    165: 
                    166:     php_phttpd_sapi_ub_write,               /* unbuffered write */
                    167:        NULL,                                                                   /* flush */
                    168:        NULL,                                                                   /* get uid */
                    169:        NULL,                                                                   /* getenv */
                    170: 
                    171:     php_error,                              /* error handler */
                    172:  
                    173:     php_phttpd_sapi_header_handler,         /* header handler */
                    174:     php_phttpd_sapi_send_headers,           /* send headers handler */
                    175:     NULL,                                   /* send header handler */
                    176:  
                    177:     php_phttpd_sapi_read_post,              /* read POST data */
                    178:     php_phttpd_sapi_read_cookies,           /* read Cookies */
                    179:  
                    180:        NULL,                                                                   /* register server variables */
                    181:        NULL,                                                                   /* Log message */
                    182:        NULL,                                                                   /* Get request time */
                    183:        NULL,                                                                   /* Child terminate */
                    184: 
                    185:     STANDARD_SAPI_MODULE_PROPERTIES
                    186: };
                    187: 
                    188: static void
                    189: php_phttpd_request_ctor(TSRMLS_D TSRMLS_DC)
                    190: {
                    191:        memset(&SG(request_info), 0, sizeof(sapi_globals_struct)); /* pfusch! */
                    192: 
                    193:     SG(request_info).query_string = PHG(cip)->hip->request;
                    194:     SG(request_info).request_method = PHG(cip)->hip->method;
                    195:        SG(request_info).path_translated = malloc(MAXPATHLEN);
                    196:     SG(sapi_headers).http_response_code = 200;
                    197:        if (url_expand(PHG(cip)->hip->url, SG(request_info).path_translated, MAXPATHLEN, &PHG(sb), NULL, NULL) == NULL) {
                    198:                /* handle error */
                    199:        }
                    200: 
                    201: #if 0
                    202:     char *server;
                    203:     Ns_DString ds;
                    204:     char *root;
                    205:     int index;
                    206:     char *tmp;
                    207:  
                    208:     server = Ns_ConnServer(NSG(conn));
                    209:  
                    210:     Ns_DStringInit(&ds);
                    211:     Ns_UrlToFile(&ds, server, NSG(conn->request->url));
                    212:  
                    213:     /* path_translated is the absolute path to the file */
                    214:     SG(request_info).path_translated = strdup(Ns_DStringValue(&ds));
                    215:     Ns_DStringFree(&ds);
                    216:     root = Ns_PageRoot(server);
                    217:     SG(request_info).request_uri = SG(request_info).path_translated + strlen(root);
                    218:     SG(request_info).content_length = Ns_ConnContentLength(NSG(conn));
                    219:     index = Ns_SetIFind(NSG(conn)->headers, "content-type");
                    220:     SG(request_info).content_type = index == -1 ? NULL :
                    221:         Ns_SetValue(NSG(conn)->headers, index);
                    222:  
                    223:     tmp = Ns_ConnAuthUser(NSG(conn));
                    224:     if(tmp) {
                    225:         tmp = estrdup(tmp);
                    226:     }
                    227:     SG(request_info).auth_user = tmp;
                    228:  
                    229:     tmp = Ns_ConnAuthPasswd(NSG(conn));
                    230:     if(tmp) {
                    231:         tmp = estrdup(tmp);
                    232:     }
                    233:     SG(request_info).auth_password = tmp;
                    234:  
                    235:     NSG(data_avail) = SG(request_info).content_length;
                    236: #endif
                    237: }
                    238: 
                    239: static void
                    240: php_phttpd_request_dtor(TSRMLS_D TSRMLS_DC)
                    241: {
                    242:     free(SG(request_info).path_translated);
                    243: }
                    244: 
                    245: 
                    246: int php_doit(TSRMLS_D TSRMLS_DC)
                    247: {
                    248:        struct stat sb;
                    249:        zend_file_handle file_handle;
                    250:        struct httpinfo *hip = PHG(cip)->hip;
                    251:        TSRMLS_FETCH();
                    252: 
                    253:        if (php_request_startup(TSRMLS_C) == FAILURE) {
                    254:         return -1;
                    255:     }
                    256: 
                    257:     file_handle.type = ZEND_HANDLE_FILENAME;
                    258:     file_handle.filename = SG(request_info).path_translated;
                    259:     file_handle.free_filename = 0;
                    260: 
                    261: /*
                    262:        php_phttpd_hash_environment(TSRMLS_C);
                    263: */
                    264:        php_execute_script(&file_handle TSRMLS_CC);
                    265:        php_request_shutdown(NULL);
                    266: 
                    267:        return SG(sapi_headers).http_response_code;
                    268: }
                    269: 
                    270: int pm_init(const char **argv)
                    271: {
                    272:        tsrm_startup(1, 1, 0, NULL);
                    273:        sapi_startup(&phttpd_sapi_module);
                    274:     phttpd_sapi_module.startup(&phttpd_sapi_module);
                    275: 
                    276:        ts_allocate_id(&ph_globals_id, sizeof(phttpd_globals_struct), NULL, NULL);
                    277: 
                    278:        return 0;
                    279: }
                    280: 
                    281: void pm_exit(void)
                    282: {
                    283:        fprintf(stderr,"***pm_exit\n");
                    284: }
                    285: 
                    286: int pm_request(struct connectioninfo *cip)
                    287: {
                    288:        struct httpinfo *hip = cip->hip;
                    289:        int status;
                    290:        TSRMLS_FETCH();
                    291: 
                    292:        if (strcasecmp(hip->method, "GET") == 0 || 
                    293:            strcasecmp(hip->method, "HEAD") == 0 ||
                    294:            strcasecmp(hip->method, "POST") == 0) {
                    295:                PHG(cip) = cip;
                    296:                
                    297:                php_phttpd_request_ctor(TSRMLS_C);
                    298:                status = php_doit(TSRMLS_C);
                    299:                php_phttpd_request_dtor(TSRMLS_C);
                    300: 
                    301:                return status;  
                    302:        } else {
                    303:                return -2;
                    304:        }
                    305: }
                    306: 
                    307: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>