[PHP4BETA] CVS update: php4

From: Date: Wed, 05 May 1999 18:25:20 +0000
Subject: [PHP4BETA] CVS update: php4
Groups: php.version4 
Request: Send a blank email to php-version4+get-653@lists.php.net to get a copy of this message
Date: Wednesday May 5, 1999 @ 14:25 Author: andi Update of /repository/php4 In directory php:/tmp/cvs-serv4330 Modified Files: SAPI.c SAPI.h logos.h main.c output.c Log Message: Added initial headers support in SAPI *untested* It definitely broke the thread-safe CGI, it may have broken other stuff as well. Index: php4/SAPI.c diff -u php4/SAPI.c:1.4 php4/SAPI.c:1.5 --- php4/SAPI.c:1.4 Sun May 2 14:07:40 1999 +++ php4/SAPI.c Wed May 5 14:25:20 1999 @@ -3,20 +3,107 @@ #include "TSRM.h" #endif +#if WIN32||WINNT +#define STRCASECMP stricmp +#else +#define STRCASECMP strcasecmp +#endif + #ifdef ZTS SAPI_API int sapi_globals_id; #else sapi_globals_struct sapi_globals; #endif + /* A true global (no need for thread safety) */ sapi_module_struct sapi_module; + SAPI_API void sapi_startup(sapi_module_struct *sf) { sapi_module = *sf; #ifdef ZTS sapi_globals_id = ts_allocate_id(sizeof(sapi_globals_struct), NULL, NULL); #endif -} \ No newline at end of file +} + + +static void sapi_free_header(sapi_header_struct *sapi_header) +{ + efree(sapi_header->header); +} + + +SAPI_API void sapi_activate(SLS_D) +{ + zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void (*)(void *)) sapi_free_header, 0); + SG(sapi_headers).content_type.header = NULL; + SG(sapi_headers).http_response_code = 200; +} + + +SAPI_API void sapi_deactivate(SLS_D) +{ + zend_llist_destroy(&SG(sapi_headers).headers); +} + + +/* This function expects a *duplicated* string, that was previously emalloc()'d. + * Pointers sent to this functions will be automatically freed by the framework. + */ +SAPI_API int sapi_add_header(const char *header_line, uint header_line_len) +{ + int retval; + sapi_header_struct sapi_header; + SLS_FETCH(); + + sapi_header.header = (char *) header_line; + sapi_header.header_len = header_line_len; + + retval = sapi_module.header_handler(&sapi_header, &SG(sapi_headers)); + + if (retval & SAPI_HEADER_DELETE_ALL) { + zend_llist_clean(&SG(sapi_headers).headers); + } + if (retval & SAPI_HEADER_ADD) { + char *colon_offset = strchr(header_line, ':'); + + if (colon_offset) { + *colon_offset = 0; + if (!STRCASECMP(header_line, "Content-Type")) { + if (SG(sapi_headers).content_type.header) { + efree(SG(sapi_headers).content_type.header); + } + *colon_offset = ':'; + SG(sapi_headers).content_type.header = (char *) header_line; + SG(sapi_headers).content_type.header_len = header_line_len; + return SUCCESS; + } + *colon_offset = ':'; + } + zend_llist_add_element(&SG(sapi_headers).headers, (void *) &sapi_header); + } + return SUCCESS; +} + + +SAPI_API int sapi_send_headers() +{ + SLS_FETCH(); + + switch (sapi_module.send_headers(&SG(sapi_headers) SLS_CC)) { + case SAPI_HEADER_SENT_SUCCESSFULLY: + return SUCCESS; + break; + case SAPI_HEADER_DO_SEND: + zend_llist_apply_with_argument(&SG(sapi_headers).headers, (void (*)(void *, void *)) sapi_module.send_header, SG(server_context)); + return SUCCESS; + break; + case SAPI_HEADER_SEND_FAILED: + return FAILURE; + break; + } + return FAILURE; +} Index: php4/SAPI.h diff -u php4/SAPI.h:1.4 php4/SAPI.h:1.5 --- php4/SAPI.h:1.4 Sun May 2 15:31:56 1999 +++ php4/SAPI.h Wed May 5 14:25:20 1999 @@ -1,7 +1,10 @@ #ifndef _NEW_SAPI_H #define _NEW_SAPI_H +#include "zend.h" +#include "zend_llist.h" + #if WIN32||WINNT # ifdef SAPI_EXPORTS # define SAPI_API __declspec(dllexport) @@ -13,16 +16,22 @@ #endif -typedef struct _sapi_module_struct { - char *name; +typedef struct { + char *header; + uint header_len; +} sapi_header_struct; - int (*startup)(struct _sapi_module_struct *sapi_module); - int (*shutdown)(struct _sapi_module_struct *sapi_module); - int (*ub_write)(const char *str, unsigned int str_length); -} sapi_module_struct; +typedef struct { + zend_llist headers; + sapi_header_struct content_type; + int http_response_code; +} sapi_headers_struct; +typedef struct _sapi_module_struct sapi_module_struct; + + extern sapi_module_struct sapi_module; /* true global */ @@ -31,17 +40,25 @@ char *path_translated; char *request_uri; + + unsigned char headers_only; } sapi_request_info; typedef struct { void *server_context; sapi_request_info request_info; + sapi_headers_struct sapi_headers; } sapi_globals_struct; SAPI_API void sapi_startup(sapi_module_struct *sf); +SAPI_API void sapi_activate(SLS_D); +SAPI_API void sapi_deactivate(SLS_D); +SAPI_API int sapi_add_header(const char *header_line, uint header_line_len); +SAPI_API int sapi_send_headers(); + #ifdef ZTS # define SLS_D sapi_globals_struct *sapi_globals # define SLS_DC , SLS_D @@ -60,5 +77,33 @@ extern SAPI_API sapi_globals_struct sapi_globals; #endif + + +struct _sapi_module_struct { + char *name; + + int (*startup)(struct _sapi_module_struct *sapi_module); + int (*shutdown)(struct _sapi_module_struct *sapi_module); + + int (*ub_write)(const char *str, unsigned int str_length); + + int (*header_handler)(sapi_header_struct *sapi_header, sapi_headers_struct *sapi_headers); + int (*send_headers)(sapi_headers_struct *sapi_headers SLS_DC); + void (*send_header)(void *server_context, sapi_header_struct *sapi_header); +}; + + + +/* header_handler() constants */ +#define SAPI_HEADER_ADD (1<<0) +#define SAPI_HEADER_DELETE_ALL (1<<1) +#define SAPI_HEADER_SEND_NOW (1<<2) + + +#define SAPI_HEADER_SENT_SUCCESSFULLY 1 +#define SAPI_HEADER_DO_SEND 2 +#define SAPI_HEADER_SEND_FAILED 3 + +#define DEFAULT_CONTENT_TYPE "Content-Type: text/html" #endif /* _NEW_SAPI_H */ Index: php4/logos.h diff -u php4/logos.h:1.1.1.1 php4/logos.h:1.2 --- php4/logos.h:1.1.1.1 Wed Apr 7 17:02:14 1999 +++ php4/logos.h Wed May 5 14:25:20 1999 @@ -1,3 +1,5 @@ +#define CONTEXT_TYPE_IMAGE_GIF "Content-Type: image/gif" + unsigned char zendtech_logo[] = { 71, 73, 70, 56, 57, 97, 100, 0, 89, 0, 247, 255, 0, 255, 255, 255, 8, 8, 8, 16, Index: php4/main.c diff -u php4/main.c:1.43 php4/main.c:1.44 --- php4/main.c:1.43 Sun May 2 15:54:01 1999 +++ php4/main.c Wed May 5 14:25:20 1999 @@ -29,7 +29,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.43 1999/05/02 19:54:01 zeev Exp $ */ +/* $Id: main.c,v 1.44 1999/05/05 18:25:20 andi Exp $ */ #include <stdio.h> @@ -1124,16 +1124,16 @@ if (SG(request_info).query_string && SG(request_info).query_string[0]=='=') { if (!strcmp(SG(request_info).query_string+1, "PHPE9568F34-D428-11d2-A769-00AA001ACF42")) { - char *header_line = estrndup("Content-type: image/gif", sizeof("Content-type: image/gif")-1); + char *header_line = estrndup(CONTEXT_TYPE_IMAGE_GIF, sizeof(CONTEXT_TYPE_IMAGE_GIF)); - php4i_add_header_information(header_line); + php4i_add_header_information(header_line, sizeof(CONTEXT_TYPE_IMAGE_GIF)); PHPWRITE(php4_logo, sizeof(php4_logo)); efree(header_line); return; } else if (!strcmp(SG(request_info).query_string+1, "PHPE9568F35-D428-11d2-A769-00AA001ACF42")) { - char *header_line = estrndup("Content-type: image/gif", sizeof("Content-type: image/gif")-1); + char *header_line = estrndup(CONTEXT_TYPE_IMAGE_GIF, sizeof(CONTEXT_TYPE_IMAGE_GIF)); - php4i_add_header_information(header_line); + php4i_add_header_information(header_line, sizeof(CONTEXT_TYPE_IMAGE_GIF)); PHPWRITE(zendtech_logo, sizeof(zendtech_logo)); efree(header_line); return; Index: php4/output.c diff -u php4/output.c:1.6 php4/output.c:1.7 --- php4/output.c:1.6 Sun May 2 14:07:40 1999 +++ php4/output.c Wed May 5 14:25:20 1999 @@ -35,10 +35,7 @@ void zend_ob_prepend(const char *text, uint text_length); static inline void zend_ob_send(); -/* HEAD support */ -static int header_request; - /* * Main */ @@ -47,7 +44,6 @@ { ob_buffer = NULL; zend_body_write = zend_ub_body_write; - header_request=0; zend_header_write = sapi_module.ub_write; } @@ -172,7 +168,9 @@ static int zend_ub_body_write(const char *str, uint str_length) { - if (header_request) { + SLS_FETCH(); + + if (SG(request_info).headers_only) { zend_bailout(); } if (php3_header()) { @@ -189,5 +187,5 @@ void set_header_request(int value) { - header_request = value; + /* deprecated */ } -- PHP 4 Beta

« previous php.version4 (#653) next »