mirror of
https://github.com/apache/httpd.git
synced 2025-08-07 04:02:58 +03:00
Fix a compile of compiler warnings. I don't know how these slipped past.
Also, uncomment a line of code that the last commit should have uncommented. Randall found this line and the fix, but I forgot to uncomment this line along with the fix. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@97179 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -577,6 +577,85 @@ static apr_status_t ssl_filter_write(ap_filter_t *f,
|
||||
return APR_SUCCESS;
|
||||
}
|
||||
|
||||
static apr_status_t ssl_io_filter_Upgrade(ap_filter_t *f,
|
||||
apr_bucket_brigade *bb)
|
||||
|
||||
{
|
||||
#define SWITCH_STATUS_LINE "101 Switching Protocols"
|
||||
#define UPGRADE_HEADER "Upgrade: TLS/1.0 HTTP/1.1"
|
||||
#define CONNECTION_HEADER "Conenction: Upgrade"
|
||||
const char *upgrade;
|
||||
const char *connection;
|
||||
apr_bucket_brigade *upgradebb;
|
||||
request_rec *r = f->r;
|
||||
SSLConnRec *sslconn;
|
||||
SSL *ssl;
|
||||
|
||||
/* Just remove the filter, if it doesn't work the first time, it won't
|
||||
* work at all for this request.
|
||||
*/
|
||||
ap_remove_output_filter(f);
|
||||
|
||||
/* No need to ensure that this is a server with optional SSL, the filter
|
||||
* is only inserted if that is true.
|
||||
*/
|
||||
|
||||
upgrade = apr_table_get(r->headers_in, "Upgrade");
|
||||
if (upgrade == NULL) {
|
||||
return ap_pass_brigade(f->next, bb);
|
||||
}
|
||||
connection = apr_table_get(r->headers_in, "Connection");
|
||||
|
||||
apr_table_unset(r->headers_out, "Upgrade");
|
||||
|
||||
if (strcmp(connection, "Upgrade") || strcmp(upgrade, "TLS/1.0")) {
|
||||
return ap_pass_brigade(f->next, bb);
|
||||
}
|
||||
|
||||
if (r->method_number == M_OPTIONS) {
|
||||
apr_bucket *b = NULL;
|
||||
/* This is a mandatory SSL upgrade. */
|
||||
|
||||
upgradebb = apr_brigade_create(r->pool, f->c->bucket_alloc);
|
||||
|
||||
ap_fputstrs(f->next, upgradebb, SWITCH_STATUS_LINE, CRLF,
|
||||
UPGRADE_HEADER, CRLF, CONNECTION_HEADER, CRLF, CRLF, NULL);
|
||||
|
||||
b = apr_bucket_flush_create(f->c->bucket_alloc);
|
||||
APR_BRIGADE_INSERT_TAIL(upgradebb, b);
|
||||
|
||||
ap_pass_brigade(f->next, upgradebb);
|
||||
}
|
||||
else {
|
||||
/* This is optional, and should be configurable, for now don't bother
|
||||
* doing anything.
|
||||
*/
|
||||
return ap_pass_brigade(f->next, bb);
|
||||
}
|
||||
|
||||
ssl_init_ssl_connection(f->c);
|
||||
|
||||
ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
|
||||
"Awaiting re-negotiation handshake");
|
||||
|
||||
sslconn = myConnConfig(f->c);
|
||||
ssl = sslconn->ssl;
|
||||
|
||||
SSL_set_state(ssl, SSL_ST_ACCEPT);
|
||||
SSL_do_handshake(ssl);
|
||||
|
||||
if (SSL_get_state(ssl) != SSL_ST_OK) {
|
||||
ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
|
||||
"Re-negotiation handshake failed: "
|
||||
"Not accepted by client!?");
|
||||
|
||||
return AP_FILTER_ERROR;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
}
|
||||
|
||||
static apr_status_t ssl_io_filter_Output(ap_filter_t *f,
|
||||
apr_bucket_brigade *bb)
|
||||
{
|
||||
@@ -943,6 +1022,11 @@ void ssl_io_filter_init(conn_rec *c, SSL *ssl)
|
||||
|
||||
void ssl_io_filter_register(apr_pool_t *p)
|
||||
{
|
||||
/* This filter MUST be after the HTTP_HEADER filter, but it also must be
|
||||
* a resource-level filter so it has the request_rec.
|
||||
*/
|
||||
ap_register_output_filter ("UPGRADE_FILTER", ssl_io_filter_Upgrade, NULL, AP_FTYPE_PROTOCOL + 5);
|
||||
|
||||
ap_register_input_filter (ssl_io_filter, ssl_io_filter_Input, NULL, AP_FTYPE_CONNECTION + 5);
|
||||
ap_register_output_filter (ssl_io_filter, ssl_io_filter_Output, NULL, AP_FTYPE_CONNECTION + 5);
|
||||
return;
|
||||
|
Reference in New Issue
Block a user