Annotation of embedaddon/php/sapi/apache_hooks/php_apache.c, revision 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: | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
! 16: | Stig Sæther Bakken <ssb@php.net> |
! 17: | David Sklar <sklar@student.net> |
! 18: +----------------------------------------------------------------------+
! 19: */
! 20: /* $Id: php_apache.c 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: #include "php_apache_http.h"
! 23:
! 24: #if defined(PHP_WIN32) || defined(NETWARE)
! 25: #include "zend.h"
! 26: #include "ap_compat.h"
! 27: #else
! 28: #include <build-defs.h>
! 29: #endif
! 30:
! 31: #ifdef ZTS
! 32: int php_apache_info_id;
! 33: #else
! 34: php_apache_info_struct php_apache_info;
! 35: #endif
! 36:
! 37: #define SECTION(name) PUTS("<H2 align=\"center\">" name "</H2>\n")
! 38:
! 39: #undef offsetof
! 40: #define offsetof(s_type,field) ((size_t)&(((s_type*)0)->field))
! 41:
! 42: extern module *top_module;
! 43: extern module **ap_loaded_modules;
! 44: static int le_apachereq;
! 45: static zend_class_entry *apacherequest_class_entry;
! 46:
! 47: static void apache_table_to_zval(table *, int safe_mode, zval *return_value);
! 48:
! 49: PHP_FUNCTION(virtual);
! 50: PHP_FUNCTION(apache_request_headers);
! 51: PHP_FUNCTION(apache_response_headers);
! 52: PHP_FUNCTION(apachelog);
! 53: PHP_FUNCTION(apache_note);
! 54: PHP_FUNCTION(apache_lookup_uri);
! 55: PHP_FUNCTION(apache_child_terminate);
! 56: PHP_FUNCTION(apache_setenv);
! 57: PHP_FUNCTION(apache_get_version);
! 58: PHP_FUNCTION(apache_get_modules);
! 59:
! 60: PHP_MINFO_FUNCTION(apache);
! 61:
! 62: ZEND_BEGIN_ARG_INFO_EX(arginfo_apachehooks_virtual, 0, 0, 1)
! 63: ZEND_ARG_INFO(0, filename)
! 64: ZEND_END_ARG_INFO()
! 65:
! 66: ZEND_BEGIN_ARG_INFO_EX(arginfo_apachehooks_setenv, 0, 0, 2)
! 67: ZEND_ARG_INFO(0, variable)
! 68: ZEND_ARG_INFO(0, value)
! 69: ZEND_ARG_INFO(0, walk_to_top)
! 70: ZEND_END_ARG_INFO()
! 71:
! 72: ZEND_BEGIN_ARG_INFO_EX(arginfo_apachehooks_lookup_uri, 0, 0, 1)
! 73: ZEND_ARG_INFO(0, uri)
! 74: ZEND_END_ARG_INFO()
! 75:
! 76: ZEND_BEGIN_ARG_INFO(arginfo_apachehooks__void, 0)
! 77: ZEND_END_ARG_INFO()
! 78:
! 79: ZEND_BEGIN_ARG_INFO_EX(arginfo_apachehooks_note, 0, 0, 1)
! 80: ZEND_ARG_INFO(0, note_name)
! 81: ZEND_ARG_INFO(0, note_value)
! 82: ZEND_END_ARG_INFO()
! 83:
! 84: const zend_function_entry apache_functions[] = {
! 85: PHP_FE(virtual, arginfo_apachehooks_virtual)
! 86: PHP_FE(apache_request_headers, arginfo_apachehooks__void)
! 87: PHP_FE(apache_note, arginfo_apachehooks_note)
! 88: PHP_FE(apache_lookup_uri, arginfo_apachehooks_lookup_uri)
! 89: PHP_FE(apache_child_terminate, arginfo_apachehooks__void)
! 90: PHP_FE(apache_setenv, arginfo_apachehooks_setenv)
! 91: PHP_FE(apache_response_headers, arginfo_apachehooks__void)
! 92: PHP_FE(apache_get_version, arginfo_apachehooks__void)
! 93: PHP_FE(apache_get_modules, arginfo_apachehooks__void)
! 94: PHP_FALIAS(getallheaders, apache_request_headers, arginfo_apachehooks__void)
! 95: {NULL, NULL, NULL}
! 96: };
! 97:
! 98: /* {{{ php_apache ini entries
! 99: */
! 100: PHP_INI_BEGIN()
! 101: STD_PHP_INI_ENTRY("xbithack", "0", PHP_INI_ALL, OnUpdateLong, xbithack, php_apache_info_struct, php_apache_info)
! 102: STD_PHP_INI_ENTRY("engine", "1", PHP_INI_ALL, OnUpdateLong, engine, php_apache_info_struct, php_apache_info)
! 103: STD_PHP_INI_ENTRY("last_modified", "0", PHP_INI_ALL, OnUpdateLong, last_modified, php_apache_info_struct, php_apache_info)
! 104: STD_PHP_INI_ENTRY("child_terminate", "0", PHP_INI_ALL, OnUpdateLong, terminate_child, php_apache_info_struct, php_apache_info)
! 105: PHP_INI_END()
! 106: /* }}} */
! 107:
! 108: static void php_apache_globals_ctor(php_apache_info_struct *apache_globals TSRMLS_DC)
! 109: {
! 110: apache_globals->in_request = 0;
! 111: }
! 112:
! 113:
! 114: #define APREQ_GET_THIS(ZVAL) if (NULL == (ZVAL = getThis())) { \
! 115: php_error(E_WARNING, "%s(): underlying ApacheRequest object missing", \
! 116: get_active_function_name(TSRMLS_C)); \
! 117: RETURN_FALSE; \
! 118: }
! 119: #define APREQ_GET_REQUEST(ZVAL, R) APREQ_GET_THIS(ZVAL); \
! 120: R = get_apache_request(ZVAL TSRMLS_CC)
! 121:
! 122: static void php_apache_request_free(zend_rsrc_list_entry *rsrc TSRMLS_DC)
! 123: {
! 124: zval *z = (zval *)rsrc->ptr;
! 125: /* fprintf(stderr, "%s() %p\n", __FUNCTION__, z); */
! 126: zval_ptr_dtor(&z);
! 127: }
! 128:
! 129: static request_rec *get_apache_request(zval *z TSRMLS_DC)
! 130: {
! 131: request_rec *r;
! 132: zval **addr;
! 133:
! 134: if (NULL == z) {
! 135: php_error(E_WARNING, "get_apache_request() invalid wrapper passed");
! 136: return NULL;
! 137: }
! 138:
! 139: if (Z_TYPE_P(z) != IS_OBJECT) {
! 140: php_error(E_WARNING, "%s(): wrapper is not an object", get_active_function_name(TSRMLS_C));
! 141: return NULL;
! 142: }
! 143:
! 144: if (zend_hash_index_find(Z_OBJPROP_P(z), 0, (void **)&addr) == FAILURE) {
! 145: php_error(E_WARNING, "%s(): underlying object missing", get_active_function_name(TSRMLS_C));
! 146: return NULL;
! 147: }
! 148:
! 149: r = (request_rec *)Z_LVAL_PP(addr);
! 150: if (!r) {
! 151: php_error(E_WARNING, "%s(): request_rec invalid", get_active_function_name(TSRMLS_C));
! 152: return NULL;
! 153: }
! 154:
! 155: return r;
! 156: }
! 157:
! 158: /* {{{ php_apache_request_new(request_rec *r)
! 159: * create a new zval-instance for ApacheRequest that wraps request_rec
! 160: */
! 161: zval *php_apache_request_new(request_rec *r)
! 162: {
! 163: zval *req;
! 164: zval *addr;
! 165:
! 166: TSRMLS_FETCH();
! 167:
! 168: MAKE_STD_ZVAL(addr);
! 169: Z_TYPE_P(addr) = IS_LONG;
! 170: Z_LVAL_P(addr) = (int) r;
! 171:
! 172: MAKE_STD_ZVAL(req);
! 173: object_init_ex(req, apacherequest_class_entry);
! 174: zend_hash_index_update(Z_OBJPROP_P(req), 0, &addr, sizeof(zval *), NULL);
! 175:
! 176: return req;
! 177: }
! 178: /* }}} */
! 179:
! 180: /* {{{ apache_request_read_string_slot()
! 181: */
! 182: static void apache_request_read_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
! 183: {
! 184: zval *id;
! 185: request_rec *r;
! 186: char *s;
! 187:
! 188: if (zend_parse_parameters_none() == FAILURE) {
! 189: return;
! 190: }
! 191:
! 192: APREQ_GET_REQUEST(id, r);
! 193:
! 194: s = *(char **)((char*)r + offset);
! 195:
! 196: if (s) {
! 197: RETURN_STRING(s, 1);
! 198: }
! 199:
! 200: RETURN_EMPTY_STRING();
! 201: }
! 202: /* }}} */
! 203:
! 204:
! 205: /* {{{ apache_request_string_slot()
! 206: */
! 207: static void apache_request_string_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
! 208: {
! 209: zval *id;
! 210: request_rec *r;
! 211: char *old_value, *new_value = NULL;
! 212: int new_value_len;
! 213: char **target;
! 214:
! 215: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &new_value, &new_value_len) == FAILURE) {
! 216: return;
! 217: }
! 218:
! 219: APREQ_GET_REQUEST(id, r);
! 220:
! 221: target = (char **)((char*)r + offset);
! 222: old_value = *target;
! 223:
! 224: if (new_value) {
! 225: *target = ap_pstrdup(r->pool, new_value);
! 226: }
! 227:
! 228: if (old_value) {
! 229: RETURN_STRING(old_value, 1);
! 230: }
! 231:
! 232: RETURN_EMPTY_STRING();
! 233: }
! 234: /* }}} */
! 235:
! 236: /* {{{ apache_request_read_int_slot()
! 237: */
! 238: static void apache_request_read_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
! 239: {
! 240: zval *id;
! 241: request_rec *r;
! 242: long l;
! 243:
! 244: if (zend_parse_parameters_none() == FAILURE) {
! 245: return;
! 246: }
! 247:
! 248: APREQ_GET_REQUEST(id, r);
! 249:
! 250: l = *(long *)((char*)r + offset);
! 251:
! 252: RETURN_LONG(l);
! 253: }
! 254: /* }}} */
! 255:
! 256: /* {{{ apache_request_int_slot()
! 257: */
! 258: static void apache_request_int_slot(int offset, INTERNAL_FUNCTION_PARAMETERS)
! 259: {
! 260: zval *id;
! 261: request_rec *r;
! 262: long old_value, new_value;
! 263: long *target;
! 264:
! 265: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &new_value) == FAILURE) {
! 266: return;
! 267: }
! 268:
! 269: APREQ_GET_REQUEST(id, r);
! 270:
! 271: target = (long *)((char*)r + offset);
! 272: old_value = *target;
! 273:
! 274: switch (ZEND_NUM_ARGS()) {
! 275: case 0:
! 276: break;
! 277: case 1:
! 278: *target = new_value;
! 279: break;
! 280: default:
! 281: WRONG_PARAM_COUNT;
! 282: break;
! 283: }
! 284:
! 285: RETURN_LONG(old_value);
! 286: }
! 287: /* }}} */
! 288:
! 289:
! 290: /* {{{ access string slots of request rec
! 291: */
! 292:
! 293: /* {{{ proto string ApacheRequest::filename([string new_filename])
! 294: */
! 295: PHP_FUNCTION(apache_request_filename)
! 296: {
! 297: apache_request_string_slot(offsetof(request_rec, filename), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 298: }
! 299: /* }}} */
! 300:
! 301: /* {{{ proto string ApacheRequest::uri([string new_uri])
! 302: */
! 303: PHP_FUNCTION(apache_request_uri)
! 304: {
! 305: apache_request_string_slot(offsetof(request_rec, uri), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 306: }
! 307: /* }}} */
! 308:
! 309: /* {{{ proto string ApacheRequest::unparsed_uri([string new_unparsed_uri])
! 310: */
! 311: PHP_FUNCTION(apache_request_unparsed_uri)
! 312: {
! 313: apache_request_string_slot(offsetof(request_rec, unparsed_uri), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 314: }
! 315: /* }}} */
! 316:
! 317: /* {{{ proto string ApacheRequest::path_info([string new_path_info])
! 318: */
! 319: PHP_FUNCTION(apache_request_path_info)
! 320: {
! 321: apache_request_string_slot(offsetof(request_rec, path_info), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 322: }
! 323: /* }}} */
! 324:
! 325: /* {{{ proto string ApacheRequest::args([string new_args])
! 326: */
! 327: PHP_FUNCTION(apache_request_args)
! 328: {
! 329: apache_request_string_slot(offsetof(request_rec, args), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 330: }
! 331: /* }}} */
! 332:
! 333: /* {{{ proto string ApacheRequest::boundary()
! 334: */
! 335: PHP_FUNCTION(apache_request_boundary)
! 336: {
! 337: apache_request_read_string_slot(offsetof(request_rec, boundary), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 338: }
! 339: /* }}} */
! 340:
! 341:
! 342: /* {{{ proto string ApacheRequest::content_type([string new_type])
! 343: */
! 344: PHP_FUNCTION(apache_request_content_type)
! 345: {
! 346: apache_request_string_slot(offsetof(request_rec, content_type), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 347: }
! 348: /* }}} */
! 349:
! 350: /* {{{ proto string ApacheRequest::content_encoding([string new_encoding])
! 351: */
! 352: PHP_FUNCTION(apache_request_content_encoding)
! 353: {
! 354: apache_request_string_slot(offsetof(request_rec, content_encoding), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 355: }
! 356: /* }}} */
! 357:
! 358: /* {{{ proto string ApacheRequest::handler([string new_handler])
! 359: */
! 360: PHP_FUNCTION(apache_request_handler)
! 361: {
! 362: apache_request_string_slot(offsetof(request_rec, handler), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 363: }
! 364: /* }}} */
! 365:
! 366: /* {{{ proto string ApacheRequest::the_request()
! 367: */
! 368: PHP_FUNCTION(apache_request_the_request)
! 369: {
! 370: apache_request_read_string_slot(offsetof(request_rec, the_request), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 371: }
! 372: /* }}} */
! 373:
! 374: /* {{{ proto string ApacheRequest::protocol()
! 375: */
! 376: PHP_FUNCTION(apache_request_protocol)
! 377: {
! 378: apache_request_read_string_slot(offsetof(request_rec, protocol), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 379: }
! 380: /* }}} */
! 381:
! 382: /* {{{ proto string ApacheRequest::hostname()
! 383: */
! 384: PHP_FUNCTION(apache_request_hostname)
! 385: {
! 386: apache_request_read_string_slot(offsetof(request_rec, hostname), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 387: }
! 388: /* }}} */
! 389:
! 390: /* {{{ proto string ApacheRequest::status_line([string new_status_line])
! 391: */
! 392: PHP_FUNCTION(apache_request_status_line)
! 393: {
! 394: apache_request_string_slot(offsetof(request_rec, status_line), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 395: }
! 396: /* }}} */
! 397:
! 398: /* {{{ proto string ApacheRequest::method()
! 399: */
! 400: PHP_FUNCTION(apache_request_method)
! 401: {
! 402: apache_request_read_string_slot(offsetof(request_rec, method), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 403: }
! 404: /* }}} */
! 405:
! 406: /* }}} access string slots of request rec */
! 407:
! 408: /* {{{ access int slots of request_rec
! 409: */
! 410:
! 411: /* {{{ proto int ApacheRequest::proto_num()
! 412: */
! 413: PHP_FUNCTION(apache_request_proto_num)
! 414: {
! 415: apache_request_read_int_slot(offsetof(request_rec, proto_num), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 416: }
! 417: /* }}} */
! 418:
! 419: /* {{{ proto int ApacheRequest::assbackwards()
! 420: */
! 421: PHP_FUNCTION(apache_request_assbackwards)
! 422: {
! 423: apache_request_read_int_slot(offsetof(request_rec, assbackwards), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 424: }
! 425: /* }}} */
! 426:
! 427:
! 428: /* {{{ proto int ApacheRequest::proxyreq([int new_proxyreq])
! 429: */
! 430: PHP_FUNCTION(apache_request_proxyreq)
! 431: {
! 432: apache_request_int_slot(offsetof(request_rec, proxyreq), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 433: }
! 434: /* }}} */
! 435:
! 436: /* {{{ proto int ApacheRequest::chunked()
! 437: */
! 438: PHP_FUNCTION(apache_request_chunked)
! 439: {
! 440: apache_request_read_int_slot(offsetof(request_rec, chunked), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 441: }
! 442: /* }}} */
! 443:
! 444:
! 445: /* {{{ proto int ApacheRequest::header_only()
! 446: */
! 447: PHP_FUNCTION(apache_request_header_only)
! 448: {
! 449: apache_request_read_int_slot(offsetof(request_rec, header_only), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 450: }
! 451: /* }}} */
! 452:
! 453: /* {{{ proto int ApacheRequest::request_time()
! 454: */
! 455: PHP_FUNCTION(apache_request_request_time)
! 456: {
! 457: apache_request_read_int_slot(offsetof(request_rec, request_time), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 458: }
! 459: /* }}} */
! 460:
! 461: /* {{{ proto int ApacheRequest::status([int new_status])
! 462: */
! 463: PHP_FUNCTION(apache_request_status)
! 464: {
! 465: apache_request_int_slot(offsetof(request_rec, status), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 466: }
! 467: /* }}} */
! 468:
! 469: /* {{{ proto int ApacheRequest::method_number([int method_number])
! 470: */
! 471: PHP_FUNCTION(apache_request_method_number)
! 472: {
! 473: apache_request_read_int_slot(offsetof(request_rec, method_number), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 474: }
! 475: /* }}} */
! 476:
! 477: /* {{{ proto int ApacheRequest::allowed([int allowed])
! 478: */
! 479: PHP_FUNCTION(apache_request_allowed)
! 480: {
! 481: apache_request_int_slot(offsetof(request_rec, allowed), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 482: }
! 483: /* }}} */
! 484:
! 485: /* {{{ proto int ApacheRequest::bytes_sent()
! 486: */
! 487: PHP_FUNCTION(apache_request_bytes_sent)
! 488: {
! 489: apache_request_read_int_slot(offsetof(request_rec, bytes_sent), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 490: }
! 491: /* }}} */
! 492:
! 493: /* {{{ proto int ApacheRequest::mtime()
! 494: */
! 495: PHP_FUNCTION(apache_request_mtime)
! 496: {
! 497: apache_request_read_int_slot(offsetof(request_rec, mtime), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 498: }
! 499: /* }}} */
! 500:
! 501: /* {{{ proto int ApacheRequest::content_length([int new_content_length])
! 502: */
! 503: PHP_FUNCTION(apache_request_content_length)
! 504: {
! 505: zval *id;
! 506: long zlen;
! 507: request_rec *r;
! 508:
! 509: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &zlen) == FAILURE) {
! 510: return;
! 511: }
! 512:
! 513: if (ZEND_NUM_ARGS() == 0) {
! 514: apache_request_read_int_slot(offsetof(request_rec, clength), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 515: } else {
! 516: APREQ_GET_REQUEST(id, r);
! 517:
! 518: (void)ap_set_content_length(r, zlen);
! 519: RETURN_TRUE;
! 520: }
! 521: }
! 522: /* }}} */
! 523:
! 524: /* {{{ proto int ApacheRequest::remaining()
! 525: */
! 526: PHP_FUNCTION(apache_request_remaining)
! 527: {
! 528: apache_request_read_int_slot(offsetof(request_rec, remaining), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 529: }
! 530: /* }}} */
! 531:
! 532: /* {{{ proto int ApacheRequest::no_cache()
! 533: */
! 534: PHP_FUNCTION(apache_request_no_cache)
! 535: {
! 536: apache_request_int_slot(offsetof(request_rec, no_cache), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 537: }
! 538: /* }}} */
! 539:
! 540: /* {{{ proto int ApacheRequest::no_local_copy()
! 541: */
! 542: PHP_FUNCTION(apache_request_no_local_copy)
! 543: {
! 544: apache_request_int_slot(offsetof(request_rec, no_local_copy), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 545: }
! 546: /* }}} */
! 547:
! 548: /* {{{ proto int ApacheRequest::read_body()
! 549: */
! 550: PHP_FUNCTION(apache_request_read_body)
! 551: {
! 552: apache_request_int_slot(offsetof(request_rec, read_body), INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 553: }
! 554: /* }}} */
! 555:
! 556:
! 557: /* }}} access int slots of request_rec */
! 558:
! 559:
! 560: /* {{{ proto array apache_request_headers_in()
! 561: * fetch all incoming request headers
! 562: */
! 563: PHP_FUNCTION(apache_request_headers_in)
! 564: {
! 565: zval *id;
! 566: request_rec *r;
! 567:
! 568: APREQ_GET_REQUEST(id, r);
! 569:
! 570: apache_table_to_zval(r->headers_in, 0, return_value);
! 571: }
! 572: /* }}} */
! 573:
! 574:
! 575: /* {{{ add_header_to_table
! 576: */
! 577: static void add_header_to_table(table *t, INTERNAL_FUNCTION_PARAMETERS)
! 578: {
! 579: zval *first = NULL;
! 580: zval *second = NULL;
! 581: zval **entry, **value;
! 582: char *string_key;
! 583: uint string_key_len;
! 584: ulong num_key;
! 585:
! 586: zend_bool replace = 0;
! 587: HashPosition pos;
! 588:
! 589: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|zb", &first, &second, &replace) == FAILURE) {
! 590: RETURN_FALSE;
! 591: }
! 592:
! 593: if (Z_TYPE_P(first) == IS_ARRAY) {
! 594: switch(ZEND_NUM_ARGS()) {
! 595: case 1:
! 596: case 3:
! 597: zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(first), &pos);
! 598: while (zend_hash_get_current_data_ex(Z_ARRVAL_P(first), (void **)&entry, &pos) == SUCCESS) {
! 599: switch(zend_hash_get_current_key_ex(Z_ARRVAL_P(first), &string_key, &string_key_len, &num_key, 0, &pos)) {
! 600: case HASH_KEY_IS_STRING:
! 601: if (zend_hash_find(Z_ARRVAL_P(first), string_key, string_key_len, (void **)&value) == FAILURE) {
! 602: zend_hash_move_forward_ex(Z_ARRVAL_P(first), &pos);
! 603: continue;
! 604: }
! 605: if (!value) {
! 606: zend_hash_move_forward_ex(Z_ARRVAL_P(first), &pos);
! 607: continue;
! 608: }
! 609:
! 610: convert_to_string_ex(value);
! 611: if (replace) {
! 612: ap_table_set(t, string_key, Z_STRVAL_PP(value));
! 613: } else {
! 614: ap_table_merge(t, string_key, Z_STRVAL_PP(value));
! 615: }
! 616: break;
! 617: case HASH_KEY_IS_LONG:
! 618: default:
! 619: php_error(E_WARNING, "%s(): Can only add STRING keys to headers!", get_active_function_name(TSRMLS_C));
! 620: break;
! 621: }
! 622:
! 623: zend_hash_move_forward_ex(Z_ARRVAL_P(first), &pos);
! 624: }
! 625: break;
! 626: default:
! 627: WRONG_PARAM_COUNT;
! 628: break;
! 629: }
! 630: } else if (Z_TYPE_P(first) == IS_STRING) {
! 631: switch(ZEND_NUM_ARGS()) {
! 632: case 2:
! 633: case 3:
! 634: convert_to_string_ex(&second);
! 635: if (replace) {
! 636: ap_table_set(t, Z_STRVAL_P(first), Z_STRVAL_P(second));
! 637: } else {
! 638: ap_table_merge(t, Z_STRVAL_P(first), Z_STRVAL_P(second));
! 639: }
! 640: break;
! 641: default:
! 642: WRONG_PARAM_COUNT;
! 643: break;
! 644: }
! 645: } else {
! 646: RETURN_FALSE;
! 647: }
! 648: }
! 649:
! 650: /* }}} */
! 651:
! 652:
! 653: /* {{{ proto array apache_request_headers_out([{string name|array list} [, string value [, bool replace = false]]])
! 654: * fetch all outgoing request headers
! 655: */
! 656: PHP_FUNCTION(apache_request_headers_out)
! 657: {
! 658: zval *id;
! 659: request_rec *r;
! 660:
! 661: APREQ_GET_REQUEST(id, r);
! 662:
! 663: if (ZEND_NUM_ARGS() > 0) {
! 664: add_header_to_table(r->headers_out, INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 665: }
! 666:
! 667: apache_table_to_zval(r->headers_out, 0, return_value);
! 668: }
! 669: /* }}} */
! 670:
! 671:
! 672: /* {{{ proto array apache_request_err_headers_out([{string name|array list} [, string value [, bool replace = false]]])
! 673: * fetch all headers that go out in case of an error or a subrequest
! 674: */
! 675: PHP_FUNCTION(apache_request_err_headers_out)
! 676: {
! 677: zval *id;
! 678: request_rec *r;
! 679:
! 680: APREQ_GET_REQUEST(id, r);
! 681:
! 682: if (ZEND_NUM_ARGS() > 0) {
! 683: add_header_to_table(r->err_headers_out, INTERNAL_FUNCTION_PARAM_PASSTHRU);
! 684: }
! 685:
! 686: apache_table_to_zval(r->err_headers_out, 0, return_value);
! 687: }
! 688: /* }}} */
! 689:
! 690:
! 691: /* {{{ proxy functions for the ap_* functions family
! 692: */
! 693:
! 694: /* {{{ proto int apache_request_server_port()
! 695: */
! 696: PHP_FUNCTION(apache_request_server_port)
! 697: {
! 698: zval *id;
! 699: request_rec *r;
! 700:
! 701: if (zend_parse_parameters_none() == FAILURE) {
! 702: return;
! 703: }
! 704:
! 705: APREQ_GET_REQUEST(id, r);
! 706:
! 707: RETURN_LONG(ap_get_server_port(r));
! 708: }
! 709: /* }}} */
! 710:
! 711: /* {{{ proto int apache_request_remote_host([int type])
! 712: */
! 713: PHP_FUNCTION(apache_request_remote_host)
! 714: {
! 715: zval *id;
! 716: long type = 0;
! 717: request_rec *r;
! 718: char *res;
! 719:
! 720: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &type) == FAILURE) {
! 721: return;
! 722: }
! 723:
! 724: if (!type) {
! 725: type = REMOTE_NAME;
! 726: }
! 727:
! 728: APREQ_GET_REQUEST(id, r);
! 729:
! 730: res = (char *)ap_get_remote_host(r->connection, r->per_dir_config, (int)type);
! 731:
! 732: if (res) {
! 733: RETURN_STRING(res, 1);
! 734: }
! 735:
! 736: RETURN_EMPTY_STRING();
! 737: }
! 738: /* }}} */
! 739:
! 740: /* {{{ proto long apache_request_update_mtime([int dependency_mtime])
! 741: */
! 742: PHP_FUNCTION(apache_request_update_mtime)
! 743: {
! 744: zval *id;
! 745: request_rec *r;
! 746: long mtime = 0;
! 747:
! 748: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &mtime) == FAILURE) {
! 749: return;
! 750: }
! 751:
! 752: APREQ_GET_REQUEST(id, r);
! 753:
! 754: RETURN_LONG(ap_update_mtime(r, (int) mtime));
! 755: }
! 756: /* }}} */
! 757:
! 758:
! 759: /* {{{ proto void apache_request_set_etag()
! 760: */
! 761: PHP_FUNCTION(apache_request_set_etag)
! 762: {
! 763: zval *id;
! 764: request_rec *r;
! 765:
! 766: if (zend_parse_parameters_none() == FAILURE) {
! 767: return;
! 768: }
! 769:
! 770: APREQ_GET_REQUEST(id, r);
! 771:
! 772: ap_set_etag(r);
! 773: RETURN_TRUE;
! 774: }
! 775: /* }}} */
! 776:
! 777: /* {{{ proto void apache_request_set_last_modified()
! 778: */
! 779: PHP_FUNCTION(apache_request_set_last_modified)
! 780: {
! 781: zval *id;
! 782: request_rec *r;
! 783:
! 784: if (zend_parse_parameters_none() == FAILURE) {
! 785: return;
! 786: }
! 787:
! 788: APREQ_GET_REQUEST(id, r);
! 789:
! 790: ap_set_last_modified(r);
! 791: RETURN_TRUE;
! 792: }
! 793: /* }}} */
! 794:
! 795: /* {{{ proto long apache_request_meets_conditions()
! 796: */
! 797: PHP_FUNCTION(apache_request_meets_conditions)
! 798: {
! 799: zval *id;
! 800: request_rec *r;
! 801:
! 802: if (zend_parse_parameters_none() == FAILURE) {
! 803: return;
! 804: }
! 805:
! 806: APREQ_GET_REQUEST(id, r);
! 807:
! 808: RETURN_LONG(ap_meets_conditions(r));
! 809: }
! 810: /* }}} */
! 811:
! 812: /* {{{ proto long apache_request_discard_request_body()
! 813: */
! 814: PHP_FUNCTION(apache_request_discard_request_body)
! 815: {
! 816: zval *id;
! 817: request_rec *r;
! 818:
! 819: if (zend_parse_parameters_none() == FAILURE) {
! 820: return;
! 821: }
! 822:
! 823: APREQ_GET_REQUEST(id, r);
! 824:
! 825: RETURN_LONG(ap_discard_request_body(r));
! 826: }
! 827: /* }}} */
! 828:
! 829: /* {{{ proto long apache_request_satisfies()
! 830: */
! 831: PHP_FUNCTION(apache_request_satisfies)
! 832: {
! 833: zval *id;
! 834: request_rec *r;
! 835:
! 836: if (zend_parse_parameters_none() == FAILURE) {
! 837: return;
! 838: }
! 839:
! 840: APREQ_GET_REQUEST(id, r);
! 841:
! 842: RETURN_LONG(ap_satisfies(r));
! 843: }
! 844: /* }}} */
! 845:
! 846:
! 847: /* {{{ proto bool apache_request_is_initial_req()
! 848: */
! 849: PHP_FUNCTION(apache_request_is_initial_req)
! 850: {
! 851: zval *id;
! 852: request_rec *r;
! 853:
! 854: if (zend_parse_parameters_none() == FAILURE) {
! 855: return;
! 856: }
! 857:
! 858: APREQ_GET_REQUEST(id, r);
! 859:
! 860: RETURN_BOOL(ap_is_initial_req(r));
! 861: }
! 862: /* }}} */
! 863:
! 864: /* {{{ proto bool apache_request_some_auth_required()
! 865: */
! 866: PHP_FUNCTION(apache_request_some_auth_required)
! 867: {
! 868: zval *id;
! 869: request_rec *r;
! 870:
! 871: if (zend_parse_parameters_none() == FAILURE) {
! 872: return;
! 873: }
! 874:
! 875: APREQ_GET_REQUEST(id, r);
! 876:
! 877: RETURN_BOOL(ap_some_auth_required(r));
! 878: }
! 879: /* }}} */
! 880:
! 881: /* {{{ proto string apache_request_auth_type()
! 882: */
! 883: PHP_FUNCTION(apache_request_auth_type)
! 884: {
! 885: zval *id;
! 886: request_rec *r;
! 887: char *t;
! 888:
! 889: if (zend_parse_parameters_none() == FAILURE) {
! 890: return;
! 891: }
! 892:
! 893: APREQ_GET_REQUEST(id, r);
! 894:
! 895: t = (char *)ap_auth_type(r);
! 896: if (!t) {
! 897: RETURN_NULL();
! 898: }
! 899:
! 900: RETURN_STRING(t, 1);
! 901: }
! 902: /* }}} */
! 903:
! 904: /* {{{ proto string apache_request_auth_name()
! 905: */
! 906: PHP_FUNCTION(apache_request_auth_name)
! 907: {
! 908: zval *id;
! 909: request_rec *r;
! 910: char *t;
! 911:
! 912: if (zend_parse_parameters_none() == FAILURE) {
! 913: return;
! 914: }
! 915:
! 916: APREQ_GET_REQUEST(id, r);
! 917:
! 918: t = (char *)ap_auth_name(r);
! 919: if (!t) {
! 920: RETURN_NULL();
! 921: }
! 922:
! 923: RETURN_STRING(t, 1);
! 924: }
! 925: /* }}} */
! 926:
! 927: /* {{{ proto apache_request_basic_auth_pw()
! 928: */
! 929: PHP_FUNCTION(apache_request_basic_auth_pw)
! 930: {
! 931: zval *id, *zpw;
! 932: request_rec *r;
! 933: const char *pw;
! 934: long status;
! 935:
! 936: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zpw) == FAILURE) {
! 937: return;
! 938: }
! 939:
! 940: if (!PZVAL_IS_REF(zpw)) {
! 941: zend_error(E_WARNING, "Parameter wasn't passed by reference");
! 942: RETURN_NULL();
! 943: }
! 944:
! 945: APREQ_GET_REQUEST(id, r);
! 946:
! 947: pw = NULL;
! 948: status = ap_get_basic_auth_pw(r, &pw);
! 949: if (status == OK && pw) {
! 950: ZVAL_STRING(zpw, (char *)pw, 1);
! 951: } else {
! 952: ZVAL_NULL(zpw);
! 953: }
! 954: RETURN_LONG(status);
! 955: }
! 956: /* }}} */
! 957:
! 958:
! 959: /* http_protocol.h */
! 960:
! 961: PHP_FUNCTION(apache_request_send_http_header)
! 962: {
! 963: zval *id;
! 964: request_rec *r;
! 965: char *type = NULL;
! 966: int typelen;
! 967:
! 968: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &type, &typelen) == FAILURE) {
! 969: return;
! 970: }
! 971:
! 972: APREQ_GET_REQUEST(id, r);
! 973: if(type) {
! 974: r->content_type = pstrdup(r->pool, type);
! 975: }
! 976: ap_send_http_header(r);
! 977: SG(headers_sent) = 1;
! 978: AP(headers_sent) = 1;
! 979: RETURN_TRUE;
! 980: }
! 981:
! 982: PHP_FUNCTION(apache_request_basic_http_header)
! 983: {
! 984: zval *id;
! 985: request_rec *r;
! 986:
! 987: if (zend_parse_parameters_none() == FAILURE) {
! 988: return;
! 989: }
! 990:
! 991: APREQ_GET_REQUEST(id, r);
! 992:
! 993: ap_basic_http_header((request_rec *)SG(server_context));
! 994: SG(headers_sent) = 1;
! 995: AP(headers_sent) = 1;
! 996: RETURN_TRUE;
! 997: }
! 998:
! 999: PHP_FUNCTION(apache_request_send_http_trace)
! 1000: {
! 1001: zval *id;
! 1002: request_rec *r;
! 1003:
! 1004: if (zend_parse_parameters_none() == FAILURE) {
! 1005: return;
! 1006: }
! 1007:
! 1008: APREQ_GET_REQUEST(id, r);
! 1009:
! 1010: ap_send_http_trace((request_rec *)SG(server_context));
! 1011: SG(headers_sent) = 1;
! 1012: AP(headers_sent) = 1;
! 1013: RETURN_TRUE;
! 1014: }
! 1015:
! 1016: PHP_FUNCTION(apache_request_send_http_options)
! 1017: {
! 1018: zval *id;
! 1019: request_rec *r;
! 1020:
! 1021: if (zend_parse_parameters_none() == FAILURE) {
! 1022: return;
! 1023: }
! 1024:
! 1025: APREQ_GET_REQUEST(id, r);
! 1026:
! 1027: ap_send_http_options((request_rec *)SG(server_context));
! 1028: SG(headers_sent) = 1;
! 1029: AP(headers_sent) = 1;
! 1030: RETURN_TRUE;
! 1031: }
! 1032:
! 1033: PHP_FUNCTION(apache_request_send_error_response)
! 1034: {
! 1035: zval *id;
! 1036: request_rec *r;
! 1037: long rec = 0;
! 1038:
! 1039: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &rec) == FAILURE) {
! 1040: return;
! 1041: }
! 1042:
! 1043: APREQ_GET_REQUEST(id, r);
! 1044: ap_send_error_response(r, (int) rec);
! 1045: RETURN_TRUE;
! 1046: }
! 1047:
! 1048: PHP_FUNCTION(apache_request_set_content_length)
! 1049: {
! 1050: long length;
! 1051: zval *id;
! 1052: request_rec *r;
! 1053:
! 1054: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &length) == FAILURE) {
! 1055: return;
! 1056: }
! 1057:
! 1058: APREQ_GET_REQUEST(id, r);
! 1059:
! 1060: ap_set_content_length(r, length);
! 1061: RETURN_TRUE;
! 1062: }
! 1063:
! 1064: PHP_FUNCTION(apache_request_set_keepalive)
! 1065: {
! 1066: zval *id;
! 1067: request_rec *r;
! 1068:
! 1069: if (zend_parse_parameters_none() == FAILURE) {
! 1070: return;
! 1071: }
! 1072:
! 1073: APREQ_GET_REQUEST(id, r);
! 1074: ap_set_keepalive(r);
! 1075: RETURN_TRUE;
! 1076: }
! 1077:
! 1078: /* This stuff should use streams or however this is implemented now
! 1079:
! 1080: PHP_FUNCTION(apache_request_send_fd)
! 1081: {
! 1082: }
! 1083:
! 1084: PHP_FUNCTION(apache_request_send_fd_length)
! 1085: {
! 1086: }
! 1087: */
! 1088:
! 1089: /* These are for overriding default output behaviour */
! 1090: PHP_FUNCTION(apache_request_rputs)
! 1091: {
! 1092: char *buffer;
! 1093: int buffer_len;
! 1094: zval *id;
! 1095: request_rec *r;
! 1096:
! 1097: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &buffer, &buffer_len) == FAILURE) {
! 1098: return;
! 1099: }
! 1100:
! 1101: APREQ_GET_REQUEST(id, r);
! 1102: ap_rwrite(buffer, buffer_len, (request_rec*)SG(server_context));
! 1103: }
! 1104:
! 1105: /* This stuff would be useful for custom POST handlers,
! 1106: which should be supported. Probably by not using
! 1107: sapi_activate at all inside a phpResponseHandler
! 1108: and instead using a builtin composed of the below
! 1109: calls as a apache_read_request_body() and allow
! 1110: people to custom craft their own.
! 1111:
! 1112: PHP_FUNCTION(apache_request_setup_client_block)
! 1113: {
! 1114: }
! 1115:
! 1116: PHP_FUNCTION(apache_request_should_client_block)
! 1117: {
! 1118: }
! 1119:
! 1120: PHP_FUNCTION(apache_request_get_client_block)
! 1121: {
! 1122: }
! 1123:
! 1124: PHP_FUNCTION(apache_request_discard_request_body)
! 1125: {
! 1126: }
! 1127: */
! 1128:
! 1129: /* http_log.h */
! 1130:
! 1131: /* {{{ proto boolean apache_request_log_error(string message, [long facility])
! 1132: */
! 1133: PHP_FUNCTION(apache_request_log_error)
! 1134: {
! 1135: zval *id;
! 1136: char *z_errstr;
! 1137: int z_errstr_len;
! 1138: long facility = APLOG_ERR;
! 1139: request_rec *r;
! 1140:
! 1141: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &z_errstr, &z_errstr_len, &facility) == FAILURE) {
! 1142: return;
! 1143: }
! 1144:
! 1145: APREQ_GET_REQUEST(id, r);
! 1146: ap_log_error(APLOG_MARK, (int) facility, r->server, "%s", z_errstr);
! 1147: RETURN_TRUE;
! 1148: }
! 1149: /* }}} */
! 1150: /* http_main.h */
! 1151:
! 1152: /* {{{ proto object apache_request_sub_req_lookup_uri(string uri)
! 1153: Returns sub-request for the specified uri. You would
! 1154: need to run it yourself with run()
! 1155: */
! 1156: PHP_FUNCTION(apache_request_sub_req_lookup_uri)
! 1157: {
! 1158: zval *id;
! 1159: char *file;
! 1160: int file_len;
! 1161: request_rec *r, *sub_r;
! 1162:
! 1163: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
! 1164: return;
! 1165: }
! 1166:
! 1167: APREQ_GET_REQUEST(id, r);
! 1168: sub_r = ap_sub_req_lookup_uri(file, r);
! 1169:
! 1170: if (!sub_r) {
! 1171: RETURN_FALSE;
! 1172: }
! 1173: return_value = php_apache_request_new(sub_r);
! 1174: }
! 1175: /* }}} */
! 1176:
! 1177: /* {{{ proto object apache_request_sub_req_lookup_file(string file)
! 1178: Returns sub-request for the specified file. You would
! 1179: need to run it yourself with run().
! 1180: */
! 1181: PHP_FUNCTION(apache_request_sub_req_lookup_file)
! 1182: {
! 1183: zval *id;
! 1184: char *file;
! 1185: int file_len;
! 1186: request_rec *r, *sub_r;
! 1187:
! 1188: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &file, &file_len) == FAILURE) {
! 1189: return;
! 1190: }
! 1191:
! 1192: APREQ_GET_REQUEST(id, r);
! 1193:
! 1194: sub_r = ap_sub_req_lookup_file(file, r);
! 1195:
! 1196: if (!sub_r) {
! 1197: RETURN_FALSE;
! 1198: }
! 1199: return_value = php_apache_request_new(sub_r);
! 1200: }
! 1201: /* }}} */
! 1202:
! 1203: /* {{{ proto object apache_request_sub_req_method_uri(string method, string uri)
! 1204: Returns sub-request for the specified file. You would
! 1205: need to run it yourself with run().
! 1206: */
! 1207: PHP_FUNCTION(apache_request_sub_req_method_uri)
! 1208: {
! 1209: zval *id;
! 1210: char *file, *method;
! 1211: int file_len, method_len;
! 1212: request_rec *r, *sub_r;
! 1213:
! 1214: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &method, &method_len, &file, &file_len) == FAILURE) {
! 1215: return;
! 1216: }
! 1217:
! 1218: APREQ_GET_REQUEST(id, r);
! 1219:
! 1220: sub_r = ap_sub_req_method_uri(method, file, r);
! 1221:
! 1222: if (!sub_r) {
! 1223: RETURN_FALSE;
! 1224: }
! 1225: return_value = php_apache_request_new(sub_r);
! 1226: }
! 1227: /* }}} */
! 1228:
! 1229: /* {{{ proto long apache_request_run()
! 1230: This is a wrapper for ap_sub_run_req and ap_destory_sub_req. It takes
! 1231: sub_request, runs it, destroys it, and returns it's status.
! 1232: */
! 1233: PHP_FUNCTION(apache_request_run)
! 1234: {
! 1235: zval *id;
! 1236: request_rec *r;
! 1237: int status;
! 1238:
! 1239: if (zend_parse_parameters_none() == FAILURE) {
! 1240: return;
! 1241: }
! 1242:
! 1243: APREQ_GET_REQUEST(id, r);
! 1244: if (!r || ap_is_initial_req(r)) {
! 1245: RETURN_FALSE;
! 1246: }
! 1247: status = ap_run_sub_req(r);
! 1248: ap_destroy_sub_req(r);
! 1249: RETURN_LONG(status);
! 1250: }
! 1251: /* }}} */
! 1252:
! 1253: PHP_FUNCTION(apache_request_internal_redirect)
! 1254: {
! 1255: zval *id;
! 1256: char *new_uri;
! 1257: int new_uri_len;
! 1258: request_rec *r;
! 1259:
! 1260: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &new_uri, &new_uri_len) == FAILURE) {
! 1261: return;
! 1262: }
! 1263:
! 1264: APREQ_GET_REQUEST(id, r);
! 1265:
! 1266: ap_internal_redirect(new_uri, r);
! 1267: }
! 1268:
! 1269: PHP_FUNCTION(apache_request_send_header_field)
! 1270: {
! 1271: char *fieldname, *fieldval;
! 1272: int fieldname_len, fieldval_len;
! 1273: zval *id;
! 1274: request_rec *r;
! 1275:
! 1276: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &fieldname, &fieldname_len, &fieldval, &fieldval_len) == FAILURE) {
! 1277: return;
! 1278: }
! 1279:
! 1280: APREQ_GET_REQUEST(id, r);
! 1281:
! 1282: ap_send_header_field(r, fieldname, fieldval);
! 1283: SG(headers_sent) = 1;
! 1284: AP(headers_sent) = 1;
! 1285: }
! 1286:
! 1287:
! 1288:
! 1289: /* }}} */
! 1290:
! 1291: /* {{{ php_apache_request_class_functions
! 1292: */
! 1293: const static zend_function_entry php_apache_request_class_functions[] = {
! 1294: /* string slots */
! 1295: PHP_FALIAS(args, apache_request_args, NULL)
! 1296: PHP_FALIAS(boundary, apache_request_boundary, NULL)
! 1297: PHP_FALIAS(content_encoding, apache_request_content_encoding, NULL)
! 1298: PHP_FALIAS(content_type, apache_request_content_type, NULL)
! 1299: PHP_FALIAS(filename, apache_request_filename, NULL)
! 1300: PHP_FALIAS(handler, apache_request_handler, NULL)
! 1301: PHP_FALIAS(hostname, apache_request_hostname, NULL)
! 1302: PHP_FALIAS(method, apache_request_method, NULL)
! 1303: PHP_FALIAS(path_info, apache_request_path_info, NULL)
! 1304: PHP_FALIAS(protocol, apache_request_protocol, NULL)
! 1305: PHP_FALIAS(status_line, apache_request_status_line, NULL)
! 1306: PHP_FALIAS(the_request, apache_request_the_request, NULL)
! 1307: PHP_FALIAS(unparsed_uri, apache_request_unparsed_uri, NULL)
! 1308: PHP_FALIAS(uri, apache_request_uri, NULL)
! 1309:
! 1310: /* int slots */
! 1311: PHP_FALIAS(allowed, apache_request_allowed, NULL)
! 1312: PHP_FALIAS(bytes_sent, apache_request_bytes_sent, NULL)
! 1313: PHP_FALIAS(chunked, apache_request_chunked, NULL)
! 1314: PHP_FALIAS(content_length, apache_request_content_length, NULL)
! 1315: PHP_FALIAS(header_only, apache_request_header_only, NULL)
! 1316: PHP_FALIAS(method_number, apache_request_method_number, NULL)
! 1317: PHP_FALIAS(mtime, apache_request_mtime, NULL)
! 1318: PHP_FALIAS(no_cache, apache_request_no_cache, NULL)
! 1319: PHP_FALIAS(no_local_copy, apache_request_no_local_copy, NULL)
! 1320: PHP_FALIAS(proto_num, apache_request_proto_num, NULL)
! 1321: PHP_FALIAS(proxyreq, apache_request_proxyreq, NULL)
! 1322: PHP_FALIAS(read_body, apache_request_read_body, NULL)
! 1323: PHP_FALIAS(remaining, apache_request_remaining, NULL)
! 1324: PHP_FALIAS(request_time, apache_request_request_time, NULL)
! 1325: PHP_FALIAS(status, apache_request_status, NULL)
! 1326:
! 1327: /* tables & arrays */
! 1328: PHP_FALIAS(headers_in, apache_request_headers_in, NULL)
! 1329: PHP_FALIAS(headers_out, apache_request_headers_out, NULL)
! 1330: PHP_FALIAS(err_headers_out, apache_request_err_headers_out, NULL)
! 1331:
! 1332:
! 1333: /* proxy functions for the ap_* functions family */
! 1334: #undef auth_name
! 1335: #undef auth_type
! 1336: #undef discard_request_body
! 1337: #undef is_initial_req
! 1338: #undef meets_conditions
! 1339: #undef satisfies
! 1340: #undef set_etag
! 1341: #undef set_last_modified
! 1342: #undef some_auth_required
! 1343: #undef update_mtime
! 1344: #undef send_http_header
! 1345: #undef send_header_field
! 1346: #undef basic_http_header
! 1347: #undef send_http_trace
! 1348: #undef send_http_options
! 1349: #undef send_error_response
! 1350: #undef set_content_length
! 1351: #undef set_keepalive
! 1352: #undef rputs
! 1353: #undef log_error
! 1354: #undef lookup_uri
! 1355: #undef lookup_file
! 1356: #undef method_uri
! 1357: #undef run
! 1358: #undef internal_redirect
! 1359: PHP_FALIAS(auth_name, apache_request_auth_name, NULL)
! 1360: PHP_FALIAS(auth_type, apache_request_auth_type, NULL)
! 1361: PHP_FALIAS(basic_auth_pw, apache_request_basic_auth_pw, NULL)
! 1362: PHP_FALIAS(discard_request_body, apache_request_discard_request_body, NULL)
! 1363: PHP_FALIAS(is_initial_req, apache_request_is_initial_req, NULL)
! 1364: PHP_FALIAS(meets_conditions, apache_request_meets_conditions, NULL)
! 1365: PHP_FALIAS(remote_host, apache_request_remote_host, NULL)
! 1366: PHP_FALIAS(satisfies, apache_request_satisfies, NULL)
! 1367: PHP_FALIAS(server_port, apache_request_server_port, NULL)
! 1368: PHP_FALIAS(set_etag, apache_request_set_etag, NULL)
! 1369: PHP_FALIAS(set_last_modified, apache_request_set_last_modified, NULL)
! 1370: PHP_FALIAS(some_auth_required, apache_request_some_auth_required, NULL)
! 1371: PHP_FALIAS(update_mtime, apache_request_update_mtime, NULL)
! 1372: PHP_FALIAS(send_http_header, apache_request_send_http_header, NULL)
! 1373: PHP_FALIAS(basic_http_header, apache_request_basic_http_header, NULL)
! 1374: PHP_FALIAS(send_header_field, apache_request_send_header_field, NULL)
! 1375: PHP_FALIAS(send_http_trace, apache_request_send_http_trace, NULL)
! 1376: PHP_FALIAS(send_http_options, apache_request_send_http_trace, NULL)
! 1377: PHP_FALIAS(send_error_response, apache_request_send_error_response, NULL)
! 1378: PHP_FALIAS(set_content_length, apache_request_set_content_length, NULL)
! 1379: PHP_FALIAS(set_keepalive, apache_request_set_keepalive, NULL)
! 1380: PHP_FALIAS(rputs, apache_request_rputs, NULL)
! 1381: PHP_FALIAS(log_error, apache_request_log_error, NULL)
! 1382: PHP_FALIAS(lookup_uri, apache_request_sub_req_lookup_uri, NULL)
! 1383: PHP_FALIAS(lookup_file, apache_request_sub_req_lookup_file, NULL)
! 1384: PHP_FALIAS(method_uri, apache_request_sub_req_method_uri, NULL)
! 1385: PHP_FALIAS(run, apache_request_run, NULL)
! 1386: PHP_FALIAS(internal_redirect, apache_request_internal_redirect, NULL)
! 1387: PHP_FE_END
! 1388: };
! 1389: /* }}} */
! 1390:
! 1391:
! 1392: static PHP_MINIT_FUNCTION(apache)
! 1393: {
! 1394: zend_class_entry ce;
! 1395:
! 1396: #ifdef ZTS
! 1397: ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
! 1398: #else
! 1399: php_apache_globals_ctor(&php_apache_info TSRMLS_CC);
! 1400: #endif
! 1401: REGISTER_INI_ENTRIES();
! 1402:
! 1403:
! 1404: le_apachereq = zend_register_list_destructors_ex(php_apache_request_free, NULL, "ApacheRequest", module_number);
! 1405: INIT_OVERLOADED_CLASS_ENTRY(ce, "ApacheRequest", php_apache_request_class_functions, NULL, NULL, NULL);
! 1406: apacherequest_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
! 1407:
! 1408: REGISTER_LONG_CONSTANT("OK", OK, CONST_CS | CONST_PERSISTENT);
! 1409: REGISTER_LONG_CONSTANT("DECLINED", DECLINED, CONST_CS | CONST_PERSISTENT);
! 1410: REGISTER_LONG_CONSTANT("FORBIDDEN", FORBIDDEN, CONST_CS | CONST_PERSISTENT);
! 1411: REGISTER_LONG_CONSTANT("AUTH_REQUIRED", AUTH_REQUIRED, CONST_CS | CONST_PERSISTENT);
! 1412: REGISTER_LONG_CONSTANT("DONE", DONE, CONST_CS | CONST_PERSISTENT);
! 1413: REGISTER_LONG_CONSTANT("SERVER_ERROR", SERVER_ERROR, CONST_CS | CONST_PERSISTENT);
! 1414: REGISTER_LONG_CONSTANT("REDIRECT", REDIRECT, CONST_CS | CONST_PERSISTENT);
! 1415: REGISTER_LONG_CONSTANT("BAD_REQUEST", BAD_REQUEST, CONST_CS | CONST_PERSISTENT);
! 1416: REGISTER_LONG_CONSTANT("NOT_FOUND", NOT_FOUND, CONST_CS | CONST_PERSISTENT);
! 1417: REGISTER_LONG_CONSTANT("HTTP_CONTINUE", HTTP_CONTINUE, CONST_CS | CONST_PERSISTENT);
! 1418: REGISTER_LONG_CONSTANT("HTTP_SWITCHING_PROTOCOLS", HTTP_SWITCHING_PROTOCOLS, CONST_CS | CONST_PERSISTENT);
! 1419: REGISTER_LONG_CONSTANT("HTTP_PROCESSING", HTTP_PROCESSING, CONST_CS | CONST_PERSISTENT);
! 1420: REGISTER_LONG_CONSTANT("HTTP_OK", HTTP_OK, CONST_CS | CONST_PERSISTENT);
! 1421: REGISTER_LONG_CONSTANT("HTTP_CREATED", HTTP_CREATED, CONST_CS | CONST_PERSISTENT);
! 1422: REGISTER_LONG_CONSTANT("HTTP_ACCEPTED", HTTP_ACCEPTED, CONST_CS | CONST_PERSISTENT);
! 1423: REGISTER_LONG_CONSTANT("HTTP_NON_AUTHORITATIVE", HTTP_NON_AUTHORITATIVE, CONST_CS | CONST_PERSISTENT);
! 1424: REGISTER_LONG_CONSTANT("HTTP_NO_CONTENT", HTTP_NO_CONTENT, CONST_CS | CONST_PERSISTENT);
! 1425: REGISTER_LONG_CONSTANT("HTTP_RESET_CONTENT", HTTP_RESET_CONTENT, CONST_CS | CONST_PERSISTENT);
! 1426: REGISTER_LONG_CONSTANT("HTTP_PARTIAL_CONTENT", HTTP_PARTIAL_CONTENT, CONST_CS | CONST_PERSISTENT);
! 1427: REGISTER_LONG_CONSTANT("HTTP_MULTI_STATUS", HTTP_MULTI_STATUS, CONST_CS | CONST_PERSISTENT);
! 1428: REGISTER_LONG_CONSTANT("HTTP_MULTIPLE_CHOICES", HTTP_MULTIPLE_CHOICES, CONST_CS | CONST_PERSISTENT);
! 1429: REGISTER_LONG_CONSTANT("HTTP_MOVED_PERMANENTLY", HTTP_MOVED_PERMANENTLY, CONST_CS | CONST_PERSISTENT);
! 1430: REGISTER_LONG_CONSTANT("HTTP_MOVED_TEMPORARILY", HTTP_MOVED_TEMPORARILY, CONST_CS | CONST_PERSISTENT);
! 1431: REGISTER_LONG_CONSTANT("HTTP_SEE_OTHER", HTTP_SEE_OTHER, CONST_CS | CONST_PERSISTENT);
! 1432: REGISTER_LONG_CONSTANT("HTTP_NOT_MODIFIED", HTTP_NOT_MODIFIED, CONST_CS | CONST_PERSISTENT);
! 1433: REGISTER_LONG_CONSTANT("HTTP_USE_PROXY", HTTP_USE_PROXY, CONST_CS | CONST_PERSISTENT);
! 1434: REGISTER_LONG_CONSTANT("HTTP_TEMPORARY_REDIRECT", HTTP_TEMPORARY_REDIRECT, CONST_CS | CONST_PERSISTENT);
! 1435: REGISTER_LONG_CONSTANT("HTTP_BAD_REQUEST", HTTP_BAD_REQUEST, CONST_CS | CONST_PERSISTENT);
! 1436: REGISTER_LONG_CONSTANT("HTTP_UNAUTHORIZED", HTTP_UNAUTHORIZED, CONST_CS | CONST_PERSISTENT);
! 1437: REGISTER_LONG_CONSTANT("HTTP_PAYMENT_REQUIRED", HTTP_PAYMENT_REQUIRED, CONST_CS | CONST_PERSISTENT);
! 1438: REGISTER_LONG_CONSTANT("HTTP_FORBIDDEN", HTTP_FORBIDDEN, CONST_CS | CONST_PERSISTENT);
! 1439: REGISTER_LONG_CONSTANT("HTTP_NOT_FOUND", HTTP_NOT_FOUND, CONST_CS | CONST_PERSISTENT);
! 1440: REGISTER_LONG_CONSTANT("HTTP_METHOD_NOT_ALLOWED", HTTP_METHOD_NOT_ALLOWED, CONST_CS | CONST_PERSISTENT);
! 1441: REGISTER_LONG_CONSTANT("HTTP_NOT_ACCEPTABLE", HTTP_NOT_ACCEPTABLE, CONST_CS | CONST_PERSISTENT);
! 1442: REGISTER_LONG_CONSTANT("HTTP_PROXY_AUTHENTICATION_REQUIRED", HTTP_PROXY_AUTHENTICATION_REQUIRED, CONST_CS | CONST_PERSISTENT);
! 1443: REGISTER_LONG_CONSTANT("HTTP_REQUEST_TIME_OUT", HTTP_REQUEST_TIME_OUT, CONST_CS | CONST_PERSISTENT);
! 1444: REGISTER_LONG_CONSTANT("HTTP_CONFLICT", HTTP_CONFLICT, CONST_CS | CONST_PERSISTENT);
! 1445: REGISTER_LONG_CONSTANT("HTTP_GONE", HTTP_GONE, CONST_CS | CONST_PERSISTENT);REGISTER_LONG_CONSTANT("HTTP_LENGTH_REQUIRED", HTTP_LENGTH_REQUIRED, CONST_CS | CONST_PERSISTENT);
! 1446: REGISTER_LONG_CONSTANT("HTTP_PRECONDITION_FAILED", HTTP_PRECONDITION_FAILED, CONST_CS | CONST_PERSISTENT);
! 1447: REGISTER_LONG_CONSTANT("HTTP_REQUEST_ENTITY_TOO_LARGE", HTTP_REQUEST_ENTITY_TOO_LARGE, CONST_CS | CONST_PERSISTENT);
! 1448: REGISTER_LONG_CONSTANT("HTTP_REQUEST_URI_TOO_LARGE", HTTP_REQUEST_URI_TOO_LARGE, CONST_CS | CONST_PERSISTENT);
! 1449: REGISTER_LONG_CONSTANT("HTTP_UNSUPPORTED_MEDIA_TYPE", HTTP_UNSUPPORTED_MEDIA_TYPE, CONST_CS | CONST_PERSISTENT);
! 1450: REGISTER_LONG_CONSTANT("HTTP_RANGE_NOT_SATISFIABLE", HTTP_RANGE_NOT_SATISFIABLE, CONST_CS | CONST_PERSISTENT);
! 1451: REGISTER_LONG_CONSTANT("HTTP_EXPECTATION_FAILED", HTTP_EXPECTATION_FAILED, CONST_CS | CONST_PERSISTENT);
! 1452: REGISTER_LONG_CONSTANT("HTTP_UNPROCESSABLE_ENTITY", HTTP_UNPROCESSABLE_ENTITY, CONST_CS | CONST_PERSISTENT);
! 1453: REGISTER_LONG_CONSTANT("HTTP_LOCKED", HTTP_LOCKED, CONST_CS | CONST_PERSISTENT);
! 1454: REGISTER_LONG_CONSTANT("HTTP_FAILED_DEPENDENCY", HTTP_FAILED_DEPENDENCY, CONST_CS | CONST_PERSISTENT);
! 1455: REGISTER_LONG_CONSTANT("HTTP_INTERNAL_SERVER_ERROR", HTTP_INTERNAL_SERVER_ERROR, CONST_CS | CONST_PERSISTENT);
! 1456: REGISTER_LONG_CONSTANT("HTTP_NOT_IMPLEMENTED", HTTP_NOT_IMPLEMENTED, CONST_CS | CONST_PERSISTENT);
! 1457: REGISTER_LONG_CONSTANT("HTTP_BAD_GATEWAY", HTTP_BAD_GATEWAY, CONST_CS | CONST_PERSISTENT);
! 1458: REGISTER_LONG_CONSTANT("HTTP_SERVICE_UNAVAILABLE", HTTP_SERVICE_UNAVAILABLE, CONST_CS | CONST_PERSISTENT);
! 1459: REGISTER_LONG_CONSTANT("HTTP_GATEWAY_TIME_OUT", HTTP_GATEWAY_TIME_OUT, CONST_CS | CONST_PERSISTENT);
! 1460: REGISTER_LONG_CONSTANT("HTTP_VERSION_NOT_SUPPORTED", HTTP_VERSION_NOT_SUPPORTED, CONST_CS | CONST_PERSISTENT);
! 1461: REGISTER_LONG_CONSTANT("HTTP_VARIANT_ALSO_VARIES", HTTP_VARIANT_ALSO_VARIES, CONST_CS | CONST_PERSISTENT);
! 1462: REGISTER_LONG_CONSTANT("HTTP_INSUFFICIENT_STORAGE", HTTP_INSUFFICIENT_STORAGE, CONST_CS | CONST_PERSISTENT);
! 1463: REGISTER_LONG_CONSTANT("HTTP_NOT_EXTENDED", HTTP_NOT_EXTENDED, CONST_CS | CONST_PERSISTENT);
! 1464: REGISTER_LONG_CONSTANT("APLOG_EMERG", APLOG_EMERG, CONST_CS | CONST_PERSISTENT);
! 1465: REGISTER_LONG_CONSTANT("APLOG_ALERT", APLOG_ALERT, CONST_CS | CONST_PERSISTENT);
! 1466: REGISTER_LONG_CONSTANT("APLOG_CRIT", APLOG_CRIT, CONST_CS | CONST_PERSISTENT);
! 1467: REGISTER_LONG_CONSTANT("APLOG_ERR", APLOG_ERR, CONST_CS | CONST_PERSISTENT);
! 1468: REGISTER_LONG_CONSTANT("APLOG_WARNING", APLOG_WARNING, CONST_CS | CONST_PERSISTENT);
! 1469: REGISTER_LONG_CONSTANT("APLOG_NOTICE", APLOG_NOTICE, CONST_CS | CONST_PERSISTENT);
! 1470: REGISTER_LONG_CONSTANT("APLOG_INFO", APLOG_INFO, CONST_CS | CONST_PERSISTENT);
! 1471: REGISTER_LONG_CONSTANT("APLOG_DEBUG", APLOG_DEBUG, CONST_CS | CONST_PERSISTENT);
! 1472: REGISTER_LONG_CONSTANT("M_GET", M_GET, CONST_CS | CONST_PERSISTENT);
! 1473: REGISTER_LONG_CONSTANT("M_PUT", M_PUT, CONST_CS | CONST_PERSISTENT);
! 1474: REGISTER_LONG_CONSTANT("M_POST", M_POST, CONST_CS | CONST_PERSISTENT);
! 1475: REGISTER_LONG_CONSTANT("M_DELETE", M_DELETE, CONST_CS | CONST_PERSISTENT);
! 1476: REGISTER_LONG_CONSTANT("M_CONNECT", M_CONNECT, CONST_CS | CONST_PERSISTENT);
! 1477: REGISTER_LONG_CONSTANT("M_OPTIONS", M_OPTIONS, CONST_CS | CONST_PERSISTENT);
! 1478: REGISTER_LONG_CONSTANT("M_TRACE", M_TRACE, CONST_CS | CONST_PERSISTENT);
! 1479: REGISTER_LONG_CONSTANT("M_PATCH", M_PATCH, CONST_CS | CONST_PERSISTENT);
! 1480: REGISTER_LONG_CONSTANT("M_PROPFIND", M_PROPFIND, CONST_CS | CONST_PERSISTENT);
! 1481: REGISTER_LONG_CONSTANT("M_PROPPATCH", M_PROPPATCH, CONST_CS | CONST_PERSISTENT);
! 1482: REGISTER_LONG_CONSTANT("M_MKCOL", M_MKCOL, CONST_CS | CONST_PERSISTENT);
! 1483: REGISTER_LONG_CONSTANT("M_COPY", M_COPY, CONST_CS | CONST_PERSISTENT);
! 1484: REGISTER_LONG_CONSTANT("M_MOVE", M_MOVE, CONST_CS | CONST_PERSISTENT);
! 1485: REGISTER_LONG_CONSTANT("M_LOCK", M_LOCK, CONST_CS | CONST_PERSISTENT);
! 1486: REGISTER_LONG_CONSTANT("M_UNLOCK", M_UNLOCK, CONST_CS | CONST_PERSISTENT);
! 1487: REGISTER_LONG_CONSTANT("M_INVALID", M_INVALID, CONST_CS | CONST_PERSISTENT);
! 1488:
! 1489: /* Possible values for request_rec.read_body (set by handling module):
! 1490: * REQUEST_NO_BODY Send 413 error if message has any body
! 1491: * REQUEST_CHUNKED_ERROR Send 411 error if body without Content-Length
! 1492: * REQUEST_CHUNKED_DECHUNK If chunked, remove the chunks for me.
! 1493: * REQUEST_CHUNKED_PASS Pass the chunks to me without removal.
! 1494: */
! 1495: REGISTER_LONG_CONSTANT("REQUEST_NO_BODY", REQUEST_NO_BODY, CONST_CS | CONST_PERSISTENT);
! 1496: REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_ERROR", REQUEST_CHUNKED_ERROR, CONST_CS | CONST_PERSISTENT);
! 1497: REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_DECHUNK", REQUEST_CHUNKED_DECHUNK, CONST_CS | CONST_PERSISTENT);
! 1498: REGISTER_LONG_CONSTANT("REQUEST_CHUNKED_PASS", REQUEST_CHUNKED_PASS, CONST_CS | CONST_PERSISTENT);
! 1499:
! 1500: /* resolve types for remote_host() */
! 1501: REGISTER_LONG_CONSTANT("REMOTE_HOST", REMOTE_HOST, CONST_CS | CONST_PERSISTENT);
! 1502: REGISTER_LONG_CONSTANT("REMOTE_NAME", REMOTE_NAME, CONST_CS | CONST_PERSISTENT);
! 1503: REGISTER_LONG_CONSTANT("REMOTE_NOLOOKUP", REMOTE_NOLOOKUP, CONST_CS | CONST_PERSISTENT);
! 1504: REGISTER_LONG_CONSTANT("REMOTE_DOUBLE_REV", REMOTE_DOUBLE_REV, CONST_CS | CONST_PERSISTENT);
! 1505:
! 1506: return SUCCESS;
! 1507: }
! 1508:
! 1509:
! 1510: static PHP_MSHUTDOWN_FUNCTION(apache)
! 1511: {
! 1512: UNREGISTER_INI_ENTRIES();
! 1513: return SUCCESS;
! 1514: }
! 1515:
! 1516: zend_module_entry apache_module_entry = {
! 1517: STANDARD_MODULE_HEADER,
! 1518: "apache",
! 1519: apache_functions,
! 1520: PHP_MINIT(apache),
! 1521: PHP_MSHUTDOWN(apache),
! 1522: NULL,
! 1523: NULL,
! 1524: PHP_MINFO(apache),
! 1525: NO_VERSION_YET,
! 1526: STANDARD_MODULE_PROPERTIES
! 1527: };
! 1528:
! 1529: /* {{{ proto bool apache_child_terminate(void)
! 1530: Terminate apache process after this request */
! 1531: PHP_FUNCTION(apache_child_terminate)
! 1532: {
! 1533: #ifndef MULTITHREAD
! 1534: if (AP(terminate_child)) {
! 1535: ap_child_terminate( ((request_rec *)SG(server_context)) );
! 1536: RETURN_TRUE;
! 1537: } else { /* tell them to get lost! */
! 1538: php_error(E_WARNING, "apache.child_terminate is disabled");
! 1539: RETURN_FALSE;
! 1540: }
! 1541: #else
! 1542: php_error(E_WARNING, "apache_child_terminate() is not supported in this build");
! 1543: RETURN_FALSE;
! 1544: #endif
! 1545: }
! 1546: /* }}} */
! 1547:
! 1548: /* {{{ proto string apache_note(string note_name [, string note_value])
! 1549: Get and set Apache request notes */
! 1550: PHP_FUNCTION(apache_note)
! 1551: {
! 1552: char *arg_name, *arg_val = NULL;
! 1553: int arg_name_len, arg_val_len;
! 1554: char *note_val;
! 1555:
! 1556: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &arg_name, &arg_name_len, &arg_val, &arg_val_len) == FAILURE) {
! 1557: return;
! 1558: }
! 1559:
! 1560: note_val = (char *) table_get(((request_rec *)SG(server_context))->notes, arg_name);
! 1561:
! 1562: if (arg_val) {
! 1563: table_set(((request_rec *)SG(server_context))->notes, arg_name, arg_val);
! 1564: }
! 1565:
! 1566: if (!note_val) {
! 1567: RETURN_FALSE;
! 1568: }
! 1569:
! 1570: RETURN_STRING(note_val, 1);
! 1571: }
! 1572: /* }}} */
! 1573:
! 1574: /* {{{ PHP_MINFO_FUNCTION
! 1575: */
! 1576: PHP_MINFO_FUNCTION(apache)
! 1577: {
! 1578: module *modp = NULL;
! 1579: char output_buf[128];
! 1580: #if !defined(WIN32) && !defined(WINNT)
! 1581: char name[64];
! 1582: char modulenames[1024];
! 1583: char *p;
! 1584: #endif
! 1585: server_rec *serv;
! 1586: extern char server_root[MAX_STRING_LEN];
! 1587: extern uid_t user_id;
! 1588: extern char *user_name;
! 1589: extern gid_t group_id;
! 1590: extern int max_requests_per_child;
! 1591:
! 1592: serv = ((request_rec *) SG(server_context))->server;
! 1593:
! 1594:
! 1595: php_info_print_table_start();
! 1596:
! 1597: #ifdef PHP_WIN32
! 1598: php_info_print_table_row(1, "Apache for Windows 95/NT");
! 1599: php_info_print_table_end();
! 1600: php_info_print_table_start();
! 1601: #elif defined(NETWARE)
! 1602: php_info_print_table_row(1, "Apache for NetWare");
! 1603: php_info_print_table_end();
! 1604: php_info_print_table_start();
! 1605: #else
! 1606: php_info_print_table_row(2, "APACHE_INCLUDE", PHP_APACHE_INCLUDE);
! 1607: php_info_print_table_row(2, "APACHE_TARGET", PHP_APACHE_TARGET);
! 1608: #endif
! 1609:
! 1610: php_info_print_table_row(2, "Apache Version", SERVER_VERSION);
! 1611:
! 1612: #ifdef APACHE_RELEASE
! 1613: snprintf(output_buf, sizeof(output_buf), "%d", APACHE_RELEASE);
! 1614: php_info_print_table_row(2, "Apache Release", output_buf);
! 1615: #endif
! 1616: snprintf(output_buf, sizeof(output_buf), "%d", MODULE_MAGIC_NUMBER);
! 1617: php_info_print_table_row(2, "Apache API Version", output_buf);
! 1618: snprintf(output_buf, sizeof(output_buf), "%s:%u", serv->server_hostname, serv->port);
! 1619: php_info_print_table_row(2, "Hostname:Port", output_buf);
! 1620: #if !defined(WIN32) && !defined(WINNT)
! 1621: snprintf(output_buf, sizeof(output_buf), "%s(%d)/%d", user_name, (int)user_id, (int)group_id);
! 1622: php_info_print_table_row(2, "User/Group", output_buf);
! 1623: snprintf(output_buf, sizeof(output_buf), "Per Child: %d - Keep Alive: %s - Max Per Connection: %d", max_requests_per_child, serv->keep_alive ? "on":"off", serv->keep_alive_max);
! 1624: php_info_print_table_row(2, "Max Requests", output_buf);
! 1625: #endif
! 1626: snprintf(output_buf, sizeof(output_buf), "Connection: %d - Keep-Alive: %d", serv->timeout, serv->keep_alive_timeout);
! 1627: php_info_print_table_row(2, "Timeouts", output_buf);
! 1628: #if !defined(WIN32) && !defined(WINNT)
! 1629: /*
! 1630: This block seems to be working on NetWare; But it seems to be showing
! 1631: all modules instead of just the loaded ones
! 1632: */
! 1633: php_info_print_table_row(2, "Server Root", server_root);
! 1634:
! 1635: strcpy(modulenames, "");
! 1636: for(modp = top_module; modp; modp = modp->next) {
! 1637: strlcpy(name, modp->name, sizeof(name));
! 1638: if ((p = strrchr(name, '.'))) {
! 1639: *p='\0'; /* Cut off ugly .c extensions on module names */
! 1640: }
! 1641: strlcat(modulenames, name, sizeof(modulenames));
! 1642: if (modp->next) {
! 1643: strlcat(modulenames, ", ", sizeof(modulenames));
! 1644: }
! 1645: }
! 1646: php_info_print_table_row(2, "Loaded Modules", modulenames);
! 1647: #endif
! 1648:
! 1649: php_info_print_table_end();
! 1650:
! 1651: DISPLAY_INI_ENTRIES();
! 1652:
! 1653: {
! 1654: register int i;
! 1655: array_header *arr;
! 1656: table_entry *elts;
! 1657: request_rec *r;
! 1658:
! 1659: r = ((request_rec *) SG(server_context));
! 1660: arr = table_elts(r->subprocess_env);
! 1661: elts = (table_entry *)arr->elts;
! 1662:
! 1663: SECTION("Apache Environment");
! 1664: php_info_print_table_start();
! 1665: php_info_print_table_header(2, "Variable", "Value");
! 1666: for (i=0; i < arr->nelts; i++) {
! 1667: php_info_print_table_row(2, elts[i].key, elts[i].val);
! 1668: }
! 1669: php_info_print_table_end();
! 1670: }
! 1671:
! 1672: {
! 1673: array_header *env_arr;
! 1674: table_entry *env;
! 1675: int i;
! 1676: request_rec *r;
! 1677:
! 1678: r = ((request_rec *) SG(server_context));
! 1679: SECTION("HTTP Headers Information");
! 1680: php_info_print_table_start();
! 1681: php_info_print_table_colspan_header(2, "HTTP Request Headers");
! 1682: php_info_print_table_row(2, "HTTP Request", r->the_request);
! 1683: env_arr = table_elts(r->headers_in);
! 1684: env = (table_entry *)env_arr->elts;
! 1685: for (i = 0; i < env_arr->nelts; ++i) {
! 1686: if (env[i].key && (!PG(safe_mode) || (PG(safe_mode) && strncasecmp(env[i].key, "authorization", 13)))) {
! 1687: php_info_print_table_row(2, env[i].key, env[i].val);
! 1688: }
! 1689: }
! 1690: php_info_print_table_colspan_header(2, "HTTP Response Headers");
! 1691: env_arr = table_elts(r->headers_out);
! 1692: env = (table_entry *)env_arr->elts;
! 1693: for(i = 0; i < env_arr->nelts; ++i) {
! 1694: if (env[i].key) {
! 1695: php_info_print_table_row(2, env[i].key, env[i].val);
! 1696: }
! 1697: }
! 1698: php_info_print_table_end();
! 1699: }
! 1700: }
! 1701: /* }}} */
! 1702:
! 1703: /* {{{ proto bool virtual(string filename)
! 1704: Perform an Apache sub-request */
! 1705: /* This function is equivalent to <!--#include virtual...-->
! 1706: * in mod_include. It does an Apache sub-request. It is useful
! 1707: * for including CGI scripts or .shtml files, or anything else
! 1708: * that you'd parse through Apache (for .phtml files, you'd probably
! 1709: * want to use <?Include>. This only works when PHP is compiled
! 1710: * as an Apache module, since it uses the Apache API for doing
! 1711: * sub requests.
! 1712: */
! 1713: PHP_FUNCTION(virtual)
! 1714: {
! 1715: char *filename;
! 1716: int filename_len;
! 1717: request_rec *rr = NULL;
! 1718:
! 1719: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
! 1720: return;
! 1721: }
! 1722:
! 1723: if (!(rr = sub_req_lookup_uri (filename, ((request_rec *) SG(server_context))))) {
! 1724: php_error(E_WARNING, "Unable to include '%s' - URI lookup failed", filename);
! 1725: if (rr)
! 1726: destroy_sub_req (rr);
! 1727: RETURN_FALSE;
! 1728: }
! 1729:
! 1730: if (rr->status != 200) {
! 1731: php_error(E_WARNING, "Unable to include '%s' - error finding URI", filename);
! 1732: if (rr)
! 1733: destroy_sub_req (rr);
! 1734: RETURN_FALSE;
! 1735: }
! 1736:
! 1737: php_end_ob_buffers(1 TSRMLS_CC);
! 1738: php_header(TSRMLS_C);
! 1739:
! 1740: if (run_sub_req(rr)) {
! 1741: php_error(E_WARNING, "Unable to include '%s' - request execution failed", filename);
! 1742: if (rr)
! 1743: destroy_sub_req (rr);
! 1744: RETURN_FALSE;
! 1745: }
! 1746:
! 1747: if (rr)
! 1748: destroy_sub_req (rr);
! 1749: RETURN_TRUE;
! 1750: }
! 1751: /* }}} */
! 1752:
! 1753:
! 1754: /* {{{ apache_table_to_zval(table *, int safe_mode, zval *return_value)
! 1755: Fetch all HTTP request headers */
! 1756: static void apache_table_to_zval(table *t, int safe_mode, zval *return_value)
! 1757: {
! 1758: array_header *env_arr;
! 1759: table_entry *tenv;
! 1760: int i;
! 1761:
! 1762: array_init(return_value);
! 1763: env_arr = table_elts(t);
! 1764: tenv = (table_entry *)env_arr->elts;
! 1765: for (i = 0; i < env_arr->nelts; ++i) {
! 1766: if (!tenv[i].key ||
! 1767: (safe_mode && !strncasecmp(tenv[i].key, "authorization", 13))) {
! 1768: continue;
! 1769: }
! 1770: if (add_assoc_string(return_value, tenv[i].key, (tenv[i].val==NULL) ? "" : tenv[i].val, 1)==FAILURE) {
! 1771: RETURN_FALSE;
! 1772: }
! 1773: }
! 1774:
! 1775: }
! 1776: /* }}} */
! 1777:
! 1778:
! 1779: /* {{{ proto array getallheaders(void)
! 1780: */
! 1781: /* Alias for apache_request_headers() */
! 1782: /* }}} */
! 1783:
! 1784: /* {{{ proto array apache_request_headers(void)
! 1785: Fetch all HTTP request headers */
! 1786: PHP_FUNCTION(apache_request_headers)
! 1787: {
! 1788: if (zend_parse_parameters_none() == FAILURE) {
! 1789: return;
! 1790: }
! 1791:
! 1792: apache_table_to_zval(((request_rec *)SG(server_context))->headers_in, PG(safe_mode), return_value);
! 1793: }
! 1794: /* }}} */
! 1795:
! 1796: /* {{{ proto array apache_response_headers(void)
! 1797: Fetch all HTTP response headers */
! 1798: PHP_FUNCTION(apache_response_headers)
! 1799: {
! 1800: if (zend_parse_parameters_none() == FAILURE) {
! 1801: return;
! 1802: }
! 1803:
! 1804: apache_table_to_zval(((request_rec *) SG(server_context))->headers_out, 0, return_value);
! 1805: }
! 1806: /* }}} */
! 1807:
! 1808: /* {{{ proto bool apache_setenv(string variable, string value [, bool walk_to_top])
! 1809: Set an Apache subprocess_env variable */
! 1810: PHP_FUNCTION(apache_setenv)
! 1811: {
! 1812: int var_len, val_len;
! 1813: zend_bool top=0;
! 1814: char *var = NULL, *val = NULL;
! 1815: request_rec *r = (request_rec *) SG(server_context);
! 1816:
! 1817: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|b", &var, &var_len, &val, &val_len, &top) == FAILURE) {
! 1818: RETURN_FALSE;
! 1819: }
! 1820:
! 1821: while(top) {
! 1822: if (r->prev) {
! 1823: r = r->prev;
! 1824: }
! 1825: else break;
! 1826: }
! 1827:
! 1828: ap_table_setn(r->subprocess_env, ap_pstrndup(r->pool, var, var_len), ap_pstrndup(r->pool, val, val_len));
! 1829: RETURN_TRUE;
! 1830: }
! 1831: /* }}} */
! 1832:
! 1833: /* {{{ proto object apache_lookup_uri(string URI)
! 1834: Perform a partial request of the given URI to obtain information about it */
! 1835: PHP_FUNCTION(apache_lookup_uri)
! 1836: {
! 1837: char *filename;
! 1838: int filename_len;
! 1839: request_rec *rr=NULL;
! 1840:
! 1841: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
! 1842: return;
! 1843: }
! 1844:
! 1845: if(!(rr = sub_req_lookup_uri(filename, ((request_rec *) SG(server_context))))) {
! 1846: php_error(E_WARNING, "URI lookup failed", filename);
! 1847: RETURN_FALSE;
! 1848: }
! 1849:
! 1850: object_init(return_value);
! 1851: add_property_long(return_value,"status", rr->status);
! 1852:
! 1853: if (rr->the_request) {
! 1854: add_property_string(return_value,"the_request", rr->the_request, 1);
! 1855: }
! 1856: if (rr->status_line) {
! 1857: add_property_string(return_value,"status_line", (char *)rr->status_line, 1);
! 1858: }
! 1859: if (rr->method) {
! 1860: add_property_string(return_value,"method", (char *)rr->method, 1);
! 1861: }
! 1862: if (rr->content_type) {
! 1863: add_property_string(return_value,"content_type", (char *)rr->content_type, 1);
! 1864: }
! 1865: if (rr->handler) {
! 1866: add_property_string(return_value,"handler", (char *)rr->handler, 1);
! 1867: }
! 1868: if (rr->uri) {
! 1869: add_property_string(return_value,"uri", rr->uri, 1);
! 1870: }
! 1871: if (rr->filename) {
! 1872: add_property_string(return_value,"filename", rr->filename, 1);
! 1873: }
! 1874: if (rr->path_info) {
! 1875: add_property_string(return_value,"path_info", rr->path_info, 1);
! 1876: }
! 1877: if (rr->args) {
! 1878: add_property_string(return_value,"args", rr->args, 1);
! 1879: }
! 1880: if (rr->boundary) {
! 1881: add_property_string(return_value,"boundary", rr->boundary, 1);
! 1882: }
! 1883: add_property_long(return_value,"no_cache", rr->no_cache);
! 1884: add_property_long(return_value,"no_local_copy", rr->no_local_copy);
! 1885: add_property_long(return_value,"allowed", rr->allowed);
! 1886: add_property_long(return_value,"sent_bodyct", rr->sent_bodyct);
! 1887: add_property_long(return_value,"bytes_sent", rr->bytes_sent);
! 1888: add_property_long(return_value,"byterange", rr->byterange);
! 1889: add_property_long(return_value,"clength", rr->clength);
! 1890:
! 1891: #if MODULE_MAGIC_NUMBER >= 19980324
! 1892: if (rr->unparsed_uri) {
! 1893: add_property_string(return_value,"unparsed_uri", rr->unparsed_uri, 1);
! 1894: }
! 1895: if(rr->mtime) {
! 1896: add_property_long(return_value,"mtime", rr->mtime);
! 1897: }
! 1898: #endif
! 1899: if(rr->request_time) {
! 1900: add_property_long(return_value,"request_time", rr->request_time);
! 1901: }
! 1902:
! 1903: destroy_sub_req(rr);
! 1904: }
! 1905: /* }}} */
! 1906:
! 1907:
! 1908: #if 0
! 1909: This function is most likely a bad idea. Just playing with it for now.
! 1910:
! 1911: PHP_FUNCTION(apache_exec_uri)
! 1912: {
! 1913: zval **filename;
! 1914: request_rec *rr=NULL;
! 1915: TSRMLS_FETCH();
! 1916:
! 1917: if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &filename) == FAILURE) {
! 1918: WRONG_PARAM_COUNT;
! 1919: }
! 1920: convert_to_string_ex(filename);
! 1921:
! 1922: if(!(rr = ap_sub_req_lookup_uri((*filename)->value.str.val, ((request_rec *) SG(server_context))))) {
! 1923: php_error(E_WARNING, "URI lookup failed", (*filename)->value.str.val);
! 1924: RETURN_FALSE;
! 1925: }
! 1926: RETVAL_LONG(ap_run_sub_req(rr));
! 1927: ap_destroy_sub_req(rr);
! 1928: }
! 1929: #endif
! 1930:
! 1931: /* {{{ proto string apache_get_version(void)
! 1932: Fetch Apache version */
! 1933: PHP_FUNCTION(apache_get_version)
! 1934: {
! 1935: char *apv = (char *) ap_get_server_version();
! 1936:
! 1937: if (apv && *apv) {
! 1938: RETURN_STRING(apv, 1);
! 1939: } else {
! 1940: RETURN_FALSE;
! 1941: }
! 1942: }
! 1943: /* }}} */
! 1944:
! 1945: /* {{{ proto array apache_get_modules(void)
! 1946: Get a list of loaded Apache modules */
! 1947: PHP_FUNCTION(apache_get_modules)
! 1948: {
! 1949: int n;
! 1950: char *p;
! 1951:
! 1952: array_init(return_value);
! 1953:
! 1954: for (n = 0; ap_loaded_modules[n]; ++n) {
! 1955: char *s = (char *) ap_loaded_modules[n]->name;
! 1956: if ((p = strchr(s, '.'))) {
! 1957: add_next_index_stringl(return_value, s, (p - s), 1);
! 1958: } else {
! 1959: add_next_index_string(return_value, s, 1);
! 1960: }
! 1961: }
! 1962: }
! 1963: /* }}} */
! 1964:
! 1965: /*
! 1966: * Local variables:
! 1967: * tab-width: 4
! 1968: * c-basic-offset: 4
! 1969: * End:
! 1970: * vim600: sw=4 ts=4 fdm=marker
! 1971: * vim<600: sw=4 ts=4
! 1972: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>