コード例 #1
0
ファイル: nchan_output.c プロジェクト: DavidPesta/nchan
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);
}
コード例 #2
0
ファイル: nchan_module.c プロジェクト: alexlis/nchan
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;
}
コード例 #3
0
ファイル: nchan_output.c プロジェクト: DavidPesta/nchan
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);
}
コード例 #4
0
ファイル: nchan_output.c プロジェクト: DavidPesta/nchan
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);
}