nchan_msg_id_t *nchan_subscriber_get_msg_id(ngx_http_request_t *r) { static nchan_msg_id_t id = NCHAN_ZERO_MSGID; ngx_str_t *if_none_match; nchan_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, nchan_module); int i; if(!cf->msg_in_etag_only && r->headers_in.if_modified_since != NULL) { id.time=ngx_http_parse_time(r->headers_in.if_modified_since->value.data, r->headers_in.if_modified_since->value.len); if_none_match = nchan_subscriber_get_etag(r); if(if_none_match==NULL) { id.tagcount=1; id.tagactive=0; } else { nchan_parse_msg_tag(if_none_match->data, if_none_match->data + if_none_match->len, &id); } return &id; } else if(cf->msg_in_etag_only && (if_none_match = nchan_subscriber_get_etag(r)) != NULL) { if(nchan_parse_compound_msgid(&id, if_none_match) == NGX_OK) { return &id; } } else { nchan_complex_value_arr_t *alt_msgid_cv_arr = &cf->last_message_id; u_char buf[128]; ngx_str_t str; ngx_int_t rc; int n = alt_msgid_cv_arr->n; str.len = 0; str.data = buf; for(i=0; i < n; i++) { rc = ngx_http_complex_value_noalloc(r, alt_msgid_cv_arr->cv[i], &str, 128); if(str.len > 0 && rc == NGX_OK) { if(nchan_parse_compound_msgid(&id, &str) == NGX_OK) { return &id; } } } } //eh, we didn't find a valid alt_msgid value from variables. use the defaults id.time = cf->subscriber_start_at_oldest_message ? 0 : -1; id.tagcount=1; id.tagactive=0; id.tag.fixed[0] = 0; return &id; }
nchan_msg_id_t *nchan_subscriber_get_msg_id(ngx_http_request_t *r) { static nchan_msg_id_t id = NCHAN_ZERO_MSGID; ngx_str_t *if_none_match; nchan_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, ngx_nchan_module); nchan_request_ctx_t *ctx = ngx_http_get_module_ctx(r, ngx_nchan_module); int i; ngx_int_t rc; if_none_match = nchan_subscriber_get_etag(r); if(!cf->msg_in_etag_only && r->headers_in.if_modified_since != NULL) { id.time=ngx_http_parse_time(r->headers_in.if_modified_since->value.data, r->headers_in.if_modified_since->value.len); if(id.time <= 0) { //anything before 1-1-1970 is reserved and treated as no msgid provided set_default_id(cf, &id); return &id; } u_char *first = NULL, *last = NULL; if(if_none_match != NULL) { first = if_none_match->data; last = if_none_match->data + if_none_match->len; } if(nchan_parse_msg_tag(first, last, &id, ctx->channel_id_count) == NGX_ERROR) { return NULL; } return &id; } else if((cf->msg_in_etag_only || r->headers_in.if_modified_since == NULL) && if_none_match) { rc = nchan_parse_compound_msgid(&id, if_none_match, ctx->channel_id_count); if(rc == NGX_OK) { return &id; } else if(rc == NGX_ERROR) { return NULL; } } else { nchan_complex_value_arr_t *alt_msgid_cv_arr = &cf->last_message_id; u_char buf[128]; ngx_str_t str; int n = alt_msgid_cv_arr->n; ngx_int_t rc2; str.len = 0; str.data = buf; for(i=0; i < n; i++) { rc = ngx_http_complex_value_noalloc(r, alt_msgid_cv_arr->cv[i], &str, 128); if(str.len > 0 && rc == NGX_OK) { rc2 = nchan_parse_compound_msgid(&id, nchan_urldecode_str(r, &str), ctx->channel_id_count); if(rc2 == NGX_OK) { return &id; } else if(rc2 == NGX_ERROR) { return NULL; } } } } set_default_id(cf, &id); return &id; }