| modification, are permitted provided that the conditions mentioned |
| in the accompanying LICENSE file are met. |
+--------------------------------------------------------------------+
- | Copyright (c) 2004-2005, Michael Wallner <mike@php.net> |
+ | Copyright (c) 2004-2006, Michael Wallner <mike@php.net> |
+--------------------------------------------------------------------+
*/
#include "ext/standard/php_string.h"
#include "zend_operators.h"
-#if defined(HAVE_PHP_SESSION) && !defined(COMPILE_DL_SESSION)
+#ifdef HAVE_PHP_SESSION
# include "ext/session/php_session.h"
#endif
*
* Redirect to the given url.
*
- * The supplied url will be expanded with http_build_uri(), the params array will
+ * The supplied url will be expanded with http_build_url(), the params array will
* be treated with http_build_query() and the session identification will be appended
* if session is true.
*
* The HTTP response code will be set according to status.
* You can use one of the following constants for convenience:
* - HTTP_REDIRECT 302 Found
+ * - HTTP_REDIRECT_AUTO 303 See Other for POST, else 302 Found
* - HTTP_REDIRECT_PERM 301 Moved Permanently
* - HTTP_REDIRECT_POST 303 See Other
* - HTTP_REDIRECT_TEMP 307 Temporary Redirect
* Please see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3
* for which redirect response code to use in which situation.
*
- * To be RFC compliant, "Redirecting to <a>URI</a>." will be displayed,
+ * To be RFC compliant, "Redirecting to <a>URL</a>." will be displayed,
* if the client doesn't redirect immediatly, and the request method was
* another one than HEAD.
*
size_t query_len = 0;
zend_bool session = 0, free_params = 0;
zval *params = NULL;
- long status = 302;
+ long status = HTTP_REDIRECT_AUTO;
char *query = NULL, *url = NULL, *URI, *LOC, *RED = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bl", &url, &url_len, ¶ms, &session, &status) != SUCCESS) {
RETURN_FALSE;
}
+#ifdef HAVE_PHP_SESSION
/* append session info */
if (session) {
if (!params) {
MAKE_STD_ZVAL(params);
array_init(params);
}
-#ifdef HAVE_PHP_SESSION
-# ifdef COMPILE_DL_SESSION
- if (SUCCESS == zend_get_module_started("session")) {
- zval nm_retval, id_retval, func;
-
- INIT_PZVAL(&func);
- INIT_PZVAL(&nm_retval);
- INIT_PZVAL(&id_retval);
- ZVAL_NULL(&nm_retval);
- ZVAL_NULL(&id_retval);
-
- ZVAL_STRINGL(&func, "session_id", lenof("session_id"), 0);
- call_user_function(EG(function_table), NULL, &func, &id_retval, 0, NULL TSRMLS_CC);
- ZVAL_STRINGL(&func, "session_name", lenof("session_name"), 0);
- call_user_function(EG(function_table), NULL, &func, &nm_retval, 0, NULL TSRMLS_CC);
-
- if ( Z_TYPE(nm_retval) == IS_STRING && Z_STRLEN(nm_retval) &&
- Z_TYPE(id_retval) == IS_STRING && Z_STRLEN(id_retval)) {
- if (add_assoc_stringl_ex(params, Z_STRVAL(nm_retval), Z_STRLEN(nm_retval)+1,
- Z_STRVAL(id_retval), Z_STRLEN(id_retval), 0) != SUCCESS) {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Could not append session information");
- }
- }
- }
-# else
if (PS(session_status) == php_session_active) {
if (add_assoc_string(params, PS(session_name), PS(id), 1) != SUCCESS) {
http_error(HE_WARNING, HTTP_E_RUNTIME, "Could not append session information");
}
}
-# endif
-#endif
}
+#endif
/* treat params array with http_build_query() */
if (params) {
if (query_len) {
spprintf(&LOC, 0, "Location: %s?%s", URI, query);
- if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) {
- spprintf(&RED, 0, "Redirecting to <a href=\"%s?%s\">%s?%s</a>.\n", URI, query, URI, query);
- }
+ spprintf(&RED, 0, "Redirecting to <a href=\"%s?%s\">%s?%s</a>.\n", URI, query, URI, query);
} else {
spprintf(&LOC, 0, "Location: %s", URI);
- if (SG(request_info).request_method && strcmp(SG(request_info).request_method, "HEAD")) {
- spprintf(&RED, 0, "Redirecting to <a href=\"%s\">%s</a>.\n", URI, URI);
- }
+ spprintf(&RED, 0, "Redirecting to <a href=\"%s\">%s</a>.\n", URI, URI);
}
efree(URI);
zval_dtor(params);
FREE_ZVAL(params);
}
-
+
+#ifndef ZEND_ENGINE_2
+ if (!status && SG(request_info).request_method && !strcasecmp(SG(request_info).request_method, "POST")) {
+ status = HTTP_REDIRECT_POST;
+ }
+#endif
+
RETURN_SUCCESS(http_exit_ex(status, LOC, RED, 1));
}
/* }}} */