-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Added patches for HTTPS keepalive support both in core and the
upstream keepalive module.
- Loading branch information
António P. P. Almeida
committed
Aug 25, 2011
1 parent
2bdf841
commit 0e71676
Showing
2 changed files
with
155 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# HG changeset patch | ||
# User Maxim Dounin <mdounin@mdounin.ru> | ||
# Date 1314229425 -14400 | ||
# Node ID ac0a7fd4de491e64d42f218691b681f7b3fa931b | ||
# Parent e865cb2cc06a88c01a439bfdd0d0d7dec54713f0 | ||
Upstream: create separate pool for peer connections. | ||
|
||
This is required to support persistant https connections as various ssl | ||
structures are allocated from connection's pool. | ||
|
||
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c | ||
--- a/src/http/ngx_http_upstream.c | ||
+++ b/src/http/ngx_http_upstream.c | ||
@@ -1146,8 +1146,17 @@ ngx_http_upstream_connect(ngx_http_reque | ||
c->sendfile &= r->connection->sendfile; | ||
u->output.sendfile = c->sendfile; | ||
|
||
- c->pool = r->pool; | ||
+ if (c->pool == NULL) { | ||
+ c->pool = ngx_create_pool(128, r->connection->log); | ||
+ if (c->pool == NULL) { | ||
+ ngx_http_upstream_finalize_request(r, u, | ||
+ NGX_HTTP_INTERNAL_SERVER_ERROR); | ||
+ return; | ||
+ } | ||
+ } | ||
+ | ||
c->log = r->connection->log; | ||
+ c->pool->log = c->log; | ||
c->read->log = c->log; | ||
c->write->log = c->log; | ||
|
||
@@ -2912,6 +2921,7 @@ ngx_http_upstream_next(ngx_http_request_ | ||
} | ||
#endif | ||
|
||
+ ngx_destroy_pool(u->peer.connection->pool); | ||
ngx_close_connection(u->peer.connection); | ||
} | ||
|
||
@@ -3006,6 +3016,7 @@ ngx_http_upstream_finalize_request(ngx_h | ||
"close http upstream connection: %d", | ||
u->peer.connection->fd); | ||
|
||
+ ngx_destroy_pool(u->peer.connection->pool); | ||
ngx_close_connection(u->peer.connection); | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
# HG changeset patch | ||
# User Maxim Dounin <mdounin@mdounin.ru> | ||
# Date 1314229646 -14400 | ||
# Node ID 67b12141506c6be2115b6b0aa151068188b97975 | ||
# Parent f3b50effc1d476b040908700bb772197d31fbd80 | ||
Keepalive: set_session and save_session callbacks. | ||
|
||
diff --git a/ngx_http_upstream_keepalive_module.c b/ngx_http_upstream_keepalive_module.c | ||
--- a/ngx_http_upstream_keepalive_module.c | ||
+++ b/ngx_http_upstream_keepalive_module.c | ||
@@ -32,6 +32,11 @@ typedef struct { | ||
ngx_event_get_peer_pt original_get_peer; | ||
ngx_event_free_peer_pt original_free_peer; | ||
|
||
+#if (NGX_HTTP_SSL) | ||
+ ngx_event_set_peer_session_pt original_set_session; | ||
+ ngx_event_save_peer_session_pt original_save_session; | ||
+#endif | ||
+ | ||
ngx_uint_t failed; /* unsigned:1 */ | ||
|
||
} ngx_http_upstream_keepalive_peer_data_t; | ||
@@ -59,6 +64,13 @@ static void ngx_http_upstream_free_keepa | ||
static void ngx_http_upstream_keepalive_dummy_handler(ngx_event_t *ev); | ||
static void ngx_http_upstream_keepalive_close_handler(ngx_event_t *ev); | ||
|
||
+#if (NGX_HTTP_SSL) | ||
+static ngx_int_t ngx_http_upstream_keepalive_set_session( | ||
+ ngx_peer_connection_t *pc, void *data); | ||
+static void ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, | ||
+ void *data); | ||
+#endif | ||
+ | ||
static void *ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf); | ||
static char *ngx_http_upstream_keepalive(ngx_conf_t *cf, ngx_command_t *cmd, | ||
void *conf); | ||
@@ -182,6 +194,13 @@ ngx_http_upstream_init_keepalive_peer(ng | ||
r->upstream->peer.get = ngx_http_upstream_get_keepalive_peer; | ||
r->upstream->peer.free = ngx_http_upstream_free_keepalive_peer; | ||
|
||
+#if (NGX_HTTP_SSL) | ||
+ kp->original_set_session = r->upstream->peer.set_session; | ||
+ kp->original_save_session = r->upstream->peer.save_session; | ||
+ r->upstream->peer.set_session = ngx_http_upstream_keepalive_set_session; | ||
+ r->upstream->peer.save_session = ngx_http_upstream_keepalive_save_session; | ||
+#endif | ||
+ | ||
return NGX_OK; | ||
} | ||
|
||
@@ -423,6 +442,29 @@ close: | ||
} | ||
|
||
|
||
+#if (NGX_HTTP_SSL) | ||
+ | ||
+static ngx_int_t | ||
+ngx_http_upstream_keepalive_set_session(ngx_peer_connection_t *pc, void *data) | ||
+{ | ||
+ ngx_http_upstream_keepalive_peer_data_t *kp = data; | ||
+ | ||
+ return kp->original_set_session(pc, kp->data); | ||
+} | ||
+ | ||
+ | ||
+static void | ||
+ngx_http_upstream_keepalive_save_session(ngx_peer_connection_t *pc, void *data) | ||
+{ | ||
+ ngx_http_upstream_keepalive_peer_data_t *kp = data; | ||
+ | ||
+ kp->original_save_session(pc, kp->data); | ||
+ return; | ||
+} | ||
+ | ||
+#endif | ||
+ | ||
+ | ||
static void * | ||
ngx_http_upstream_keepalive_create_conf(ngx_conf_t *cf) | ||
{ | ||
# HG changeset patch | ||
# User Maxim Dounin <mdounin@mdounin.ru> | ||
# Date 1314229663 -14400 | ||
# Node ID 3affea1af30649ac1934b01ab30d175abd4fb3be | ||
# Parent 67b12141506c6be2115b6b0aa151068188b97975 | ||
Keepalive: destroy connection pool. | ||
|
||
diff --git a/ngx_http_upstream_keepalive_module.c b/ngx_http_upstream_keepalive_module.c | ||
--- a/ngx_http_upstream_keepalive_module.c | ||
+++ b/ngx_http_upstream_keepalive_module.c | ||
@@ -353,6 +353,7 @@ ngx_http_upstream_free_keepalive_peer(ng | ||
item = ngx_queue_data(q, ngx_http_upstream_keepalive_cache_t, | ||
queue); | ||
|
||
+ ngx_destroy_pool(item->connection->pool); | ||
ngx_close_connection(item->connection); | ||
|
||
} else { | ||
@@ -437,6 +438,7 @@ close: | ||
conf = item->conf; | ||
|
||
ngx_queue_remove(&item->queue); | ||
+ ngx_destroy_pool(item->connection->pool); | ||
ngx_close_connection(item->connection); | ||
ngx_queue_insert_head(&conf->free, &item->queue); | ||
} | ||
|