[PHP4BETA] CVS update: php4
| From: | andi | 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