]> granicus.if.org Git - apache/commitdiff
saving some bytes and cycles by not create h2_ctx for every connection and checking...
authorStefan Eissing <icing@apache.org>
Mon, 14 Dec 2015 11:09:31 +0000 (11:09 +0000)
committerStefan Eissing <icing@apache.org>
Mon, 14 Dec 2015 11:09:31 +0000 (11:09 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1719881 13f79535-47bb-0310-9956-ffa450edef68

modules/http2/h2_alt_svc.c
modules/http2/h2_config.c
modules/http2/h2_ctx.c
modules/http2/h2_ctx.h
modules/http2/h2_h2.c
modules/http2/h2_switch.c
modules/http2/h2_task.c

index 6bc3cd0dff5358ec2425fe3fa4e54f91097f7271..dea16af7ebefc56a85d276e8510c81d21a3f04c7 100644 (file)
@@ -73,7 +73,6 @@ h2_alt_svc *h2_alt_svc_parse(const char *s, apr_pool_t *pool) {
 
 static int h2_alt_svc_handler(request_rec *r)
 {
-    h2_ctx *ctx;
     const h2_config *cfg;
     int i;
     
@@ -82,8 +81,7 @@ static int h2_alt_svc_handler(request_rec *r)
         return DECLINED;
     }
     
-    ctx = h2_ctx_rget(r);
-    if (h2_ctx_is_active(ctx) || h2_ctx_is_task(ctx)) {
+    if (h2_ctx_rget(r)) {
         return DECLINED;
     }
     
index 047142470526256add09ed02b726f8b24f64e60a..5e7af79a6922f2d4419ba624a322cf31f0bb253e 100644 (file)
@@ -561,14 +561,16 @@ const h2_config *h2_config_rget(request_rec *r)
 
 const h2_config *h2_config_get(conn_rec *c)
 {
-    h2_ctx *ctx = h2_ctx_get(c);
+    h2_ctx *ctx = h2_ctx_get(c, 0);
     
-    if (ctx->config) {
-        return ctx->config;
-    }
-    else if (ctx->server) {
-        ctx->config = h2_config_sget(ctx->server);
-        return ctx->config;
+    if (ctx) {
+        if (ctx->config) {
+            return ctx->config;
+        }
+        else if (ctx->server) {
+            ctx->config = h2_config_sget(ctx->server);
+            return ctx->config;
+        }
     }
     
     return h2_config_sget(c->base_server);
index 08bdd8612dec4eb71de96c4b9d7cd3e4ef62a841..cedab8a09c65b396b3da47a9f5ce5be2f954dd26 100644 (file)
@@ -20,6 +20,7 @@
 #include <http_config.h>
 
 #include "h2_private.h"
+#include "h2_session.h"
 #include "h2_task.h"
 #include "h2_ctx.h"
 #include "h2_private.h"
@@ -41,10 +42,10 @@ h2_ctx *h2_ctx_create_for(const conn_rec *c, h2_task *task)
     return ctx;
 }
 
-h2_ctx *h2_ctx_get(const conn_rec *c)
+h2_ctx *h2_ctx_get(const conn_rec *c, int create)
 {
     h2_ctx *ctx = (h2_ctx*)ap_get_module_config(c->conn_config, &http2_module);
-    if (ctx == NULL) {
+    if (ctx == NULL && create) {
         ctx = h2_ctx_create(c);
     }
     return ctx;
@@ -52,7 +53,7 @@ h2_ctx *h2_ctx_get(const conn_rec *c)
 
 h2_ctx *h2_ctx_rget(const request_rec *r)
 {
-    return h2_ctx_get(r->connection);
+    return h2_ctx_get(r->connection, 0);
 }
 
 const char *h2_ctx_protocol_get(const conn_rec *c)
@@ -64,10 +65,19 @@ const char *h2_ctx_protocol_get(const conn_rec *c)
 h2_ctx *h2_ctx_protocol_set(h2_ctx *ctx, const char *proto)
 {
     ctx->protocol = proto;
-    ctx->is_h2 = (proto != NULL);
     return ctx;
 }
 
+h2_session *h2_ctx_session_get(h2_ctx *ctx)
+{
+    return ctx? ctx->session : NULL;
+}
+
+void h2_ctx_session_set(h2_ctx *ctx, struct h2_session *session)
+{
+    ctx->session = session;
+}
+
 h2_ctx *h2_ctx_server_set(h2_ctx *ctx, server_rec *s)
 {
     ctx->server = s;
@@ -79,12 +89,7 @@ int h2_ctx_is_task(h2_ctx *ctx)
     return ctx && !!ctx->task;
 }
 
-int h2_ctx_is_active(h2_ctx *ctx)
-{
-    return ctx && ctx->is_h2;
-}
-
 struct h2_task *h2_ctx_get_task(h2_ctx *ctx)
 {
-    return ctx->task;
+    return ctx? ctx->task : NULL;
 }
index 7f8f2b5949d262b8871cf06aadc550135da74ad8..09b9766d74424356b3a1397a4b553fbffddfc4e9 100644 (file)
@@ -16,6 +16,7 @@
 #ifndef __mod_h2__h2_ctx__
 #define __mod_h2__h2_ctx__
 
+struct h2_session;
 struct h2_task;
 struct h2_config;
 
@@ -28,15 +29,22 @@ struct h2_config;
  * - those created by ourself to perform work on HTTP/2 streams
  */
 typedef struct h2_ctx {
-    int is_h2;                      /* h2 engine is used */
     const char *protocol;           /* the protocol negotiated */
+    struct h2_session *session;     /* the session established */
     struct h2_task *task;           /* the h2_task executing or NULL */
     const char *hostname;           /* hostname negotiated via SNI, optional */
     server_rec *server;             /* httpd server config selected. */
     const struct h2_config *config; /* effective config in this context */
 } h2_ctx;
 
-h2_ctx *h2_ctx_get(const conn_rec *c);
+/**
+ * Get (or create) a h2 context record for this connection.
+ * @param c the connection to look at
+ * @param create != 0 iff missing context shall be created
+ * @return h2 context of this connection
+ */
+h2_ctx *h2_ctx_get(const conn_rec *c, int create);
+
 h2_ctx *h2_ctx_rget(const request_rec *r);
 h2_ctx *h2_ctx_create_for(const conn_rec *c, struct h2_task *task);
 
@@ -50,13 +58,15 @@ h2_ctx *h2_ctx_protocol_set(h2_ctx *ctx, const char *proto);
  */
 h2_ctx *h2_ctx_server_set(h2_ctx *ctx, server_rec *s);
 
+struct h2_session *h2_ctx_session_get(h2_ctx *ctx);
+void h2_ctx_session_set(h2_ctx *ctx, struct h2_session *session);
+
 /**
  * Get the h2 protocol negotiated for this connection, or NULL.
  */
 const char *h2_ctx_protocol_get(const conn_rec *c);
 
 int h2_ctx_is_task(h2_ctx *ctx);
-int h2_ctx_is_active(h2_ctx *ctx);
 
 struct h2_task *h2_ctx_get_task(h2_ctx *ctx);
 
index 20fbe30d1ed252750d9c1977886fae5dc190b433..912b7a88f3988128dcfdea3fb7ba738d59ae82c2 100644 (file)
@@ -574,8 +574,13 @@ void h2_h2_register_hooks(void)
 
 int h2_h2_process_conn(conn_rec* c)
 {
-    h2_ctx *ctx = h2_ctx_get(c);
+    h2_ctx *ctx;
     
+    if (c->master) {
+        return DECLINED;
+    }
+    
+    ctx = h2_ctx_get(c, 0);
     ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, c, "h2_h2, process_conn");
     if (h2_ctx_is_task(ctx)) {
         /* our stream pseudo connection */
@@ -612,6 +617,9 @@ int h2_h2_process_conn(conn_rec* c)
         if ((slen >= 24) && !memcmp(H2_MAGIC_TOKEN, s, 24)) {
             ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, c,
                           "h2_h2, direct mode detected");
+            if (!ctx) {
+                ctx = h2_ctx_get(c, 1);
+            }
             h2_ctx_protocol_set(ctx, h2_h2_is_tls(c)? "h2" : "h2c");
         }
         else {
@@ -630,7 +638,7 @@ int h2_h2_process_conn(conn_rec* c)
     /* If "h2" was selected as protocol (by whatever mechanism), take over
      * the connection.
      */
-    if (h2_ctx_is_active(ctx)) {
+    if (ctx) {
         ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, c,
                       "h2_h2, connection, h2 active");
         
index ab8b90f7cc597b5d436cc6b59cd661368466f72a..daddb8d3103ce12b783650aacfda358133fffa4e 100644 (file)
@@ -136,7 +136,7 @@ static int h2_protocol_switch(conn_rec *c, request_rec *r, server_rec *s,
     }
     
     if (found) {
-        h2_ctx *ctx = h2_ctx_get(c);
+        h2_ctx *ctx = h2_ctx_get(c, 1);
         
         ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, c,
                       "switching protocol to '%s'", protocol);
index 55bcec7293480a682eaafbec5679a5b11b64ace6..f4aa068760fe90e7c967822c8ab8763ab1aec26a 100644 (file)
@@ -118,8 +118,13 @@ void h2_task_register_hooks(void)
 static int h2_task_pre_conn(conn_rec* c, void *arg)
 {
     
-    h2_ctx *ctx = h2_ctx_get(c);
+    h2_ctx *ctx;
     
+    if (!c->master) {
+        return OK;
+    }
+    
+    ctx = h2_ctx_get(c, 0);
     (void)arg;
     if (h2_ctx_is_task(ctx)) {
         h2_task *task = h2_ctx_get_task(ctx);
@@ -246,8 +251,13 @@ static apr_status_t h2_task_process_request(const h2_request *req, conn_rec *c)
 
 static int h2_task_process_conn(conn_rec* c)
 {
-    h2_ctx *ctx = h2_ctx_get(c);
+    h2_ctx *ctx;
+    
+    if (!c->master) {
+        return DECLINED;
+    }
     
+    ctx = h2_ctx_get(c, 0);
     if (h2_ctx_is_task(ctx)) {
         if (!ctx->task->serialize_headers) {
             ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, c,