/* {{{ sapi_lsapi_send_headers */ static int sapi_lsapi_send_headers(sapi_headers_struct *sapi_headers) { sapi_header_struct *h; zend_llist_position pos; if ( lsapi_mode ) { LSAPI_SetRespStatus( SG(sapi_headers).http_response_code ); h = zend_llist_get_first_ex(&sapi_headers->headers, &pos); while (h) { if ( h->header_len > 0 ) { LSAPI_AppendRespHeader(h->header, h->header_len); } h = zend_llist_get_next_ex(&sapi_headers->headers, &pos); } if (SG(sapi_headers).send_default_content_type) { char *hd; int len; char headerBuf[SAPI_LSAPI_MAX_HEADER_LENGTH]; hd = sapi_get_default_content_type(); len = snprintf( headerBuf, SAPI_LSAPI_MAX_HEADER_LENGTH - 1, "Content-type: %s", hd ); efree(hd); LSAPI_AppendRespHeader( headerBuf, len ); } } LSAPI_FinalizeRespHeaders(); return SAPI_HEADER_SENT_SUCCESSFULLY; }
static int php_apache_sapi_send_headers(sapi_headers_struct *sapi_headers) { php_struct *ctx = SG(server_context); const char *sline = SG(sapi_headers).http_status_line; ctx->r->status = SG(sapi_headers).http_response_code; /* httpd requires that r->status_line is set to the first digit of * the status-code: */ if (sline && strlen(sline) > 12 && strncmp(sline, "HTTP/1.", 7) == 0 && sline[8] == ' ') { ctx->r->status_line = apr_pstrdup(ctx->r->pool, sline + 9); ctx->r->proto_num = 1000 + (sline[7]-'0'); if ((sline[7]-'0') == 0) { apr_table_set(ctx->r->subprocess_env, "force-response-1.0", "true"); } } /* call ap_set_content_type only once, else each time we call it, configured output filters for that content type will be added */ if (!ctx->content_type) { ctx->content_type = sapi_get_default_content_type(); } ap_set_content_type(ctx->r, apr_pstrdup(ctx->r->pool, ctx->content_type)); efree(ctx->content_type); ctx->content_type = NULL; return SAPI_HEADER_SENT_SUCCESSFULLY; }
static void php_apache_request_ctor(ap_filter_t *f, php_struct *ctx) { char *content_type; char *content_length; const char *auth; PG(during_request_startup) = 0; SG(sapi_headers).http_response_code = !f->r->status ? HTTP_OK : f->r->status; SG(request_info).content_type = apr_table_get(f->r->headers_in, "Content-Type"); #undef safe_strdup #define safe_strdup(x) ((x)?strdup((x)):NULL) SG(request_info).query_string = safe_strdup(f->r->args); SG(request_info).request_method = f->r->method; SG(request_info).proto_num = f->r->proto_num; SG(request_info).request_uri = safe_strdup(f->r->uri); SG(request_info).path_translated = safe_strdup(f->r->filename); f->r->no_local_copy = 1; content_type = sapi_get_default_content_type(); f->r->content_type = apr_pstrdup(f->r->pool, content_type); efree(content_type); content_length = (char *) apr_table_get(f->r->headers_in, "Content-Length"); SG(request_info).content_length = (content_length ? atol(content_length) : 0); apr_table_unset(f->r->headers_out, "Content-Length"); apr_table_unset(f->r->headers_out, "Last-Modified"); apr_table_unset(f->r->headers_out, "Expires"); apr_table_unset(f->r->headers_out, "ETag"); auth = apr_table_get(f->r->headers_in, "Authorization"); php_handle_auth_data(auth); if (SG(request_info).auth_user == NULL && f->r->user) { SG(request_info).auth_user = estrdup(f->r->user); } ctx->r->user = apr_pstrdup(ctx->r->pool, SG(request_info).auth_user); php_request_startup(); }