+/* {{{ proto static bool HttpResponse::setHeader(string name, mixed value[, bool replace = true])
+ *
+ * Send an HTTP header.
+ *
+ * Expects a string parameter containing the name of the header and a mixed
+ * parameter containing the value of the header, which will be converted to
+ * a string. Additionally accepts an optional boolean parameter, which
+ * specifies whether an existing header should be replaced. If the second
+ * parameter is unset no header with this name will be sent.
+ *
+ * Returns TRUE on success, or FALSE on failure.
+ *
+ * Throws HttpHeaderException if http.only_exceptions is TRUE.
+ */
+PHP_METHOD(HttpResponse, setHeader)
+{
+ zend_bool replace = 1;
+ char *name;
+ int name_len = 0;
+ zval *value = NULL, *orig = NULL;
+
+ if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz/!|b", &name, &name_len, &value, &replace)) {
+ RETURN_FALSE;
+ }
+ if (SG(headers_sent)) {
+ http_error(HE_WARNING, HTTP_E_HEADER, "Cannot add another header when headers have already been sent");
+ RETURN_FALSE;
+ }
+ if (!name_len) {
+ http_error(HE_WARNING, HTTP_E_HEADER, "Cannot send anonymous headers");
+ RETURN_FALSE;
+ }
+
+ /* delete header if value == null */
+ if (!value || Z_TYPE_P(value) == IS_NULL) {
+ RETURN_SUCCESS(http_send_header_ex(name, name_len, "", 0, replace, NULL));
+ }
+ /* send multiple header if replace is false and value is an array */
+ if (!replace && Z_TYPE_P(value) == IS_ARRAY) {
+ zval **data;
+ HashPosition pos;
+
+ FOREACH_VAL(pos, value, data) {
+ zval *orig = *data;
+
+ convert_to_string_ex(data);
+ if (SUCCESS != http_send_header_ex(name, name_len, Z_STRVAL_PP(data), Z_STRLEN_PP(data), 0, NULL)) {
+ if (orig != *data) {
+ zval_ptr_dtor(data);
+ }
+ RETURN_FALSE;
+ }
+ if (orig != *data) {
+ zval_ptr_dtor(data);
+ }
+ }
+ RETURN_TRUE;
+ }
+ /* send standard header */
+ orig = value;
+ convert_to_string_ex(&value);
+ RETVAL_SUCCESS(http_send_header_ex(name, name_len, Z_STRVAL_P(value), Z_STRLEN_P(value), replace, NULL));
+ if (orig != value) {
+ zval_ptr_dtor(&value);
+ }
+}
+/* }}} */
+
+/* {{{ proto static mixed HttpResponse::getHeader([string name])