ngx_int_t nchan_respond_sprintf(ngx_http_request_t *r, ngx_int_t status_code, const ngx_str_t *content_type, const ngx_int_t finalize, char *fmt, ...) { u_char *p; ngx_str_t str; va_list args; str.len = 1024; str.data = ngx_palloc(r->pool, 1024); if(str.data == NULL) { return nchan_respond_status(r, status_code, NULL, NULL, finalize); return NGX_ERROR; } va_start(args, fmt); p = ngx_vslprintf(str.data, str.data + str.len, fmt, args); va_end(args); str.len = p - str.data; return nchan_respond_string(r, status_code, content_type, &str, finalize); }
ngx_str_t *nchan_get_channel_id(ngx_http_request_t *r, pub_or_sub_t what, ngx_int_t fail_hard) { static const ngx_str_t NO_CHANNEL_ID_MESSAGE = ngx_string("No channel id provided."); nchan_loc_conf_t *cf = ngx_http_get_module_loc_conf(r, nchan_module); ngx_int_t rc; ngx_str_t *id; nchan_chid_loc_conf_t *chid_conf; chid_conf = what == PUB ? &cf->pub_chid : &cf->sub_chid; if(chid_conf->n == 0) { chid_conf = &cf->pubsub_chid; } if(chid_conf->n > 0) { rc = nchan_process_multi_channel_id(r, chid_conf, cf, &id); } else { //fallback to legacy $push_channel_id rc = nchan_process_legacy_channel_id(r, cf, &id); } if(id == NULL && fail_hard) { assert(rc != NGX_OK); switch(rc) { case NGX_ERROR: nchan_respond_status(r, NGX_HTTP_INTERNAL_SERVER_ERROR, NULL, 0); break; case NGX_DECLINED: nchan_respond_status(r, NGX_HTTP_FORBIDDEN, NULL, 0); break; case NGX_ABORT: nchan_respond_string(r, NGX_HTTP_NOT_FOUND, &TEXT_PLAIN, &NO_CHANNEL_ID_MESSAGE, 0); break; } DBG("%s channel id NULL", what == PUB ? "pub" : "sub"); } else { DBG("%s channel id %V", what == PUB ? "pub" : "sub", id); } return id; }
ngx_int_t nchan_respond_membuf(ngx_http_request_t *r, ngx_int_t status_code, const ngx_str_t *content_type, ngx_buf_t *body, ngx_int_t finalize) { ngx_str_t str; str.len = ngx_buf_size(body); str.data = body->start; return nchan_respond_string(r, status_code, content_type, &str, finalize); }
ngx_int_t nchan_respond_cstring(ngx_http_request_t *r, ngx_int_t status_code, const ngx_str_t *content_type, char *body, ngx_int_t finalize) { ngx_str_t str; str.data = (u_char *)body; str.len=strlen(body); return nchan_respond_string(r, status_code, content_type, &str, finalize); }