Annotation of embedaddon/nginx/src/http/ngx_http_spdy_module.c, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * Copyright (C) Nginx, Inc.
        !             4:  * Copyright (C) Valentin V. Bartenev
        !             5:  */
        !             6: 
        !             7: 
        !             8: #include <ngx_config.h>
        !             9: #include <ngx_core.h>
        !            10: #include <ngx_http.h>
        !            11: #include <ngx_http_spdy_module.h>
        !            12: 
        !            13: 
        !            14: static ngx_int_t ngx_http_spdy_add_variables(ngx_conf_t *cf);
        !            15: 
        !            16: static ngx_int_t ngx_http_spdy_variable(ngx_http_request_t *r,
        !            17:     ngx_http_variable_value_t *v, uintptr_t data);
        !            18: static ngx_int_t ngx_http_spdy_request_priority_variable(ngx_http_request_t *r,
        !            19:     ngx_http_variable_value_t *v, uintptr_t data);
        !            20: 
        !            21: static ngx_int_t ngx_http_spdy_module_init(ngx_cycle_t *cycle);
        !            22: 
        !            23: static void *ngx_http_spdy_create_main_conf(ngx_conf_t *cf);
        !            24: static char *ngx_http_spdy_init_main_conf(ngx_conf_t *cf, void *conf);
        !            25: 
        !            26: static void *ngx_http_spdy_create_srv_conf(ngx_conf_t *cf);
        !            27: static char *ngx_http_spdy_merge_srv_conf(ngx_conf_t *cf, void *parent,
        !            28:     void *child);
        !            29: 
        !            30: static char *ngx_http_spdy_recv_buffer_size(ngx_conf_t *cf, void *post,
        !            31:     void *data);
        !            32: static char *ngx_http_spdy_pool_size(ngx_conf_t *cf, void *post, void *data);
        !            33: static char *ngx_http_spdy_streams_index_mask(ngx_conf_t *cf, void *post,
        !            34:     void *data);
        !            35: 
        !            36: 
        !            37: static ngx_conf_num_bounds_t  ngx_http_spdy_headers_comp_bounds = {
        !            38:     ngx_conf_check_num_bounds, 0, 9
        !            39: };
        !            40: 
        !            41: static ngx_conf_post_t  ngx_http_spdy_recv_buffer_size_post =
        !            42:     { ngx_http_spdy_recv_buffer_size };
        !            43: static ngx_conf_post_t  ngx_http_spdy_pool_size_post =
        !            44:     { ngx_http_spdy_pool_size };
        !            45: static ngx_conf_post_t  ngx_http_spdy_streams_index_mask_post =
        !            46:     { ngx_http_spdy_streams_index_mask };
        !            47: 
        !            48: 
        !            49: static ngx_command_t  ngx_http_spdy_commands[] = {
        !            50: 
        !            51:     { ngx_string("spdy_recv_buffer_size"),
        !            52:       NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,
        !            53:       ngx_conf_set_size_slot,
        !            54:       NGX_HTTP_MAIN_CONF_OFFSET,
        !            55:       offsetof(ngx_http_spdy_main_conf_t, recv_buffer_size),
        !            56:       &ngx_http_spdy_recv_buffer_size_post },
        !            57: 
        !            58:     { ngx_string("spdy_pool_size"),
        !            59:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            60:       ngx_conf_set_size_slot,
        !            61:       NGX_HTTP_SRV_CONF_OFFSET,
        !            62:       offsetof(ngx_http_spdy_srv_conf_t, pool_size),
        !            63:       &ngx_http_spdy_pool_size_post },
        !            64: 
        !            65:     { ngx_string("spdy_max_concurrent_streams"),
        !            66:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            67:       ngx_conf_set_num_slot,
        !            68:       NGX_HTTP_SRV_CONF_OFFSET,
        !            69:       offsetof(ngx_http_spdy_srv_conf_t, concurrent_streams),
        !            70:       NULL },
        !            71: 
        !            72:     { ngx_string("spdy_streams_index_size"),
        !            73:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            74:       ngx_conf_set_num_slot,
        !            75:       NGX_HTTP_SRV_CONF_OFFSET,
        !            76:       offsetof(ngx_http_spdy_srv_conf_t, streams_index_mask),
        !            77:       &ngx_http_spdy_streams_index_mask_post },
        !            78: 
        !            79:     { ngx_string("spdy_recv_timeout"),
        !            80:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            81:       ngx_conf_set_msec_slot,
        !            82:       NGX_HTTP_SRV_CONF_OFFSET,
        !            83:       offsetof(ngx_http_spdy_srv_conf_t, recv_timeout),
        !            84:       NULL },
        !            85: 
        !            86:     { ngx_string("spdy_keepalive_timeout"),
        !            87:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            88:       ngx_conf_set_msec_slot,
        !            89:       NGX_HTTP_SRV_CONF_OFFSET,
        !            90:       offsetof(ngx_http_spdy_srv_conf_t, keepalive_timeout),
        !            91:       NULL },
        !            92: 
        !            93:     { ngx_string("spdy_headers_comp"),
        !            94:       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,
        !            95:       ngx_conf_set_num_slot,
        !            96:       NGX_HTTP_SRV_CONF_OFFSET,
        !            97:       offsetof(ngx_http_spdy_srv_conf_t, headers_comp),
        !            98:       &ngx_http_spdy_headers_comp_bounds },
        !            99: 
        !           100:       ngx_null_command
        !           101: };
        !           102: 
        !           103: 
        !           104: static ngx_http_module_t  ngx_http_spdy_module_ctx = {
        !           105:     ngx_http_spdy_add_variables,           /* preconfiguration */
        !           106:     NULL,                                  /* postconfiguration */
        !           107: 
        !           108:     ngx_http_spdy_create_main_conf,        /* create main configuration */
        !           109:     ngx_http_spdy_init_main_conf,          /* init main configuration */
        !           110: 
        !           111:     ngx_http_spdy_create_srv_conf,         /* create server configuration */
        !           112:     ngx_http_spdy_merge_srv_conf,          /* merge server configuration */
        !           113: 
        !           114:     NULL,                                  /* create location configuration */
        !           115:     NULL                                   /* merge location configuration */
        !           116: };
        !           117: 
        !           118: 
        !           119: ngx_module_t  ngx_http_spdy_module = {
        !           120:     NGX_MODULE_V1,
        !           121:     &ngx_http_spdy_module_ctx,             /* module context */
        !           122:     ngx_http_spdy_commands,                /* module directives */
        !           123:     NGX_HTTP_MODULE,                       /* module type */
        !           124:     NULL,                                  /* init master */
        !           125:     ngx_http_spdy_module_init,             /* init module */
        !           126:     NULL,                                  /* init process */
        !           127:     NULL,                                  /* init thread */
        !           128:     NULL,                                  /* exit thread */
        !           129:     NULL,                                  /* exit process */
        !           130:     NULL,                                  /* exit master */
        !           131:     NGX_MODULE_V1_PADDING
        !           132: };
        !           133: 
        !           134: 
        !           135: static ngx_http_variable_t  ngx_http_spdy_vars[] = {
        !           136: 
        !           137:     { ngx_string("spdy"), NULL,
        !           138:       ngx_http_spdy_variable, 0, 0, 0 },
        !           139: 
        !           140:     { ngx_string("spdy_request_priority"), NULL,
        !           141:       ngx_http_spdy_request_priority_variable, 0, 0, 0 },
        !           142: 
        !           143:     { ngx_null_string, NULL, NULL, 0, 0, 0 }
        !           144: };
        !           145: 
        !           146: 
        !           147: static ngx_int_t
        !           148: ngx_http_spdy_add_variables(ngx_conf_t *cf)
        !           149: {
        !           150:    ngx_http_variable_t  *var, *v;
        !           151: 
        !           152:     for (v = ngx_http_spdy_vars; v->name.len; v++) {
        !           153:         var = ngx_http_add_variable(cf, &v->name, v->flags);
        !           154:         if (var == NULL) {
        !           155:             return NGX_ERROR;
        !           156:         }
        !           157: 
        !           158:         var->get_handler = v->get_handler;
        !           159:         var->data = v->data;
        !           160:     }
        !           161: 
        !           162:     return NGX_OK;
        !           163: }
        !           164: 
        !           165: 
        !           166: static ngx_int_t
        !           167: ngx_http_spdy_variable(ngx_http_request_t *r,
        !           168:     ngx_http_variable_value_t *v, uintptr_t data)
        !           169: {
        !           170:     if (r->spdy_stream) {
        !           171:         v->len = 1;
        !           172:         v->valid = 1;
        !           173:         v->no_cacheable = 0;
        !           174:         v->not_found = 0;
        !           175:         v->data = (u_char *) "2";
        !           176: 
        !           177:         return NGX_OK;
        !           178:     }
        !           179: 
        !           180:     *v = ngx_http_variable_null_value;
        !           181: 
        !           182:     return NGX_OK;
        !           183: }
        !           184: 
        !           185: 
        !           186: static ngx_int_t
        !           187: ngx_http_spdy_request_priority_variable(ngx_http_request_t *r,
        !           188:     ngx_http_variable_value_t *v, uintptr_t data)
        !           189: {
        !           190:     if (r->spdy_stream) {
        !           191:         v->len = 1;
        !           192:         v->valid = 1;
        !           193:         v->no_cacheable = 0;
        !           194:         v->not_found = 0;
        !           195: 
        !           196:         v->data = ngx_pnalloc(r->pool, 1);
        !           197:         if (v->data == NULL) {
        !           198:             return NGX_ERROR;
        !           199:         }
        !           200: 
        !           201:         v->data[0] = '0' + (u_char) r->spdy_stream->priority;
        !           202: 
        !           203:         return NGX_OK;
        !           204:     }
        !           205: 
        !           206:     *v = ngx_http_variable_null_value;
        !           207: 
        !           208:     return NGX_OK;
        !           209: }
        !           210: 
        !           211: 
        !           212: static ngx_int_t
        !           213: ngx_http_spdy_module_init(ngx_cycle_t *cycle)
        !           214: {
        !           215:     ngx_http_spdy_request_headers_init();
        !           216: 
        !           217:     return NGX_OK;
        !           218: }
        !           219: 
        !           220: 
        !           221: static void *
        !           222: ngx_http_spdy_create_main_conf(ngx_conf_t *cf)
        !           223: {
        !           224:     ngx_http_spdy_main_conf_t  *smcf;
        !           225: 
        !           226:     smcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_spdy_main_conf_t));
        !           227:     if (smcf == NULL) {
        !           228:         return NULL;
        !           229:     }
        !           230: 
        !           231:     smcf->recv_buffer_size = NGX_CONF_UNSET_SIZE;
        !           232: 
        !           233:     return smcf;
        !           234: }
        !           235: 
        !           236: 
        !           237: static char *
        !           238: ngx_http_spdy_init_main_conf(ngx_conf_t *cf, void *conf)
        !           239: {
        !           240:     ngx_http_spdy_main_conf_t *smcf = conf;
        !           241: 
        !           242:     if (smcf->recv_buffer_size == NGX_CONF_UNSET_SIZE) {
        !           243:         smcf->recv_buffer_size = 256 * 1024;
        !           244:     }
        !           245: 
        !           246:     return NGX_CONF_OK;
        !           247: }
        !           248: 
        !           249: 
        !           250: static void *
        !           251: ngx_http_spdy_create_srv_conf(ngx_conf_t *cf)
        !           252: {
        !           253:     ngx_http_spdy_srv_conf_t  *sscf;
        !           254: 
        !           255:     sscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_spdy_srv_conf_t));
        !           256:     if (sscf == NULL) {
        !           257:         return NULL;
        !           258:     }
        !           259: 
        !           260:     sscf->pool_size = NGX_CONF_UNSET_SIZE;
        !           261: 
        !           262:     sscf->concurrent_streams = NGX_CONF_UNSET_UINT;
        !           263:     sscf->streams_index_mask = NGX_CONF_UNSET_UINT;
        !           264: 
        !           265:     sscf->recv_timeout = NGX_CONF_UNSET_MSEC;
        !           266:     sscf->keepalive_timeout = NGX_CONF_UNSET_MSEC;
        !           267: 
        !           268:     sscf->headers_comp = NGX_CONF_UNSET;
        !           269: 
        !           270:     return sscf;
        !           271: }
        !           272: 
        !           273: 
        !           274: static char *
        !           275: ngx_http_spdy_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
        !           276: {
        !           277:     ngx_http_spdy_srv_conf_t *prev = parent;
        !           278:     ngx_http_spdy_srv_conf_t *conf = child;
        !           279: 
        !           280:     ngx_conf_merge_size_value(conf->pool_size, prev->pool_size, 4096);
        !           281: 
        !           282:     ngx_conf_merge_uint_value(conf->concurrent_streams,
        !           283:                               prev->concurrent_streams, 100);
        !           284: 
        !           285:     ngx_conf_merge_uint_value(conf->streams_index_mask,
        !           286:                               prev->streams_index_mask, 32 - 1);
        !           287: 
        !           288:     ngx_conf_merge_msec_value(conf->recv_timeout,
        !           289:                               prev->recv_timeout, 30000);
        !           290:     ngx_conf_merge_msec_value(conf->keepalive_timeout,
        !           291:                               prev->keepalive_timeout, 180000);
        !           292: 
        !           293:     ngx_conf_merge_value(conf->headers_comp, prev->headers_comp, 0);
        !           294: 
        !           295:     return NGX_CONF_OK;
        !           296: }
        !           297: 
        !           298: 
        !           299: static char *
        !           300: ngx_http_spdy_recv_buffer_size(ngx_conf_t *cf, void *post, void *data)
        !           301: {
        !           302:     size_t *sp = data;
        !           303: 
        !           304:     if (*sp <= 2 * NGX_SPDY_STATE_BUFFER_SIZE) {
        !           305:         return "value is too small";
        !           306:     }
        !           307: 
        !           308:     return NGX_CONF_OK;
        !           309: }
        !           310: 
        !           311: 
        !           312: static char *
        !           313: ngx_http_spdy_pool_size(ngx_conf_t *cf, void *post, void *data)
        !           314: {
        !           315:     size_t *sp = data;
        !           316: 
        !           317:     if (*sp < NGX_MIN_POOL_SIZE) {
        !           318:         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
        !           319:                            "the pool size must be no less than %uz",
        !           320:                            NGX_MIN_POOL_SIZE);
        !           321:         return NGX_CONF_ERROR;
        !           322:     }
        !           323: 
        !           324:     if (*sp % NGX_POOL_ALIGNMENT) {
        !           325:         ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
        !           326:                            "the pool size must be a multiple of %uz",
        !           327:                            NGX_POOL_ALIGNMENT);
        !           328:         return NGX_CONF_ERROR;
        !           329:     }
        !           330: 
        !           331:     return NGX_CONF_OK;
        !           332: }
        !           333: 
        !           334: 
        !           335: static char *
        !           336: ngx_http_spdy_streams_index_mask(ngx_conf_t *cf, void *post, void *data)
        !           337: {
        !           338:     ngx_uint_t *np = data;
        !           339: 
        !           340:     ngx_uint_t  mask;
        !           341: 
        !           342:     mask = *np - 1;
        !           343: 
        !           344:     if (*np == 0 || (*np & mask)) {
        !           345:         return "must be a power of two";
        !           346:     }
        !           347: 
        !           348:     *np = mask;
        !           349: 
        !           350:     return NGX_CONF_OK;
        !           351: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>