Annotation of embedaddon/nginx/src/http/ngx_http_spdy_module.c, revision 1.1.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>