예제 #1
0
파일: websocket.c 프로젝트: rusirenye/nchan
static ngx_int_t websocket_dequeue(subscriber_t *self) {
  full_subscriber_t  *fsub = (full_subscriber_t  *)self;
  DBG("%p dequeue", self);
  fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data);
  self->enqueued = 0;
  
  if(fsub->connected) {
    ngx_str_t          close_msg = ngx_string("410 Gone");
    websocket_send_close_frame(fsub, CLOSE_NORMAL, &close_msg);
  }
  
  if(fsub->ping_ev.timer_set) {
    ngx_del_timer(&fsub->ping_ev);
  }
  
  if(fsub->closing_ev.timer_set) {
    ngx_del_timer(&fsub->closing_ev);
  }
  
  if(fsub->timeout_ev.timer_set) {
    ngx_del_timer(&fsub->timeout_ev);
  }
  
  if(self->destroy_after_dequeue) {
    websocket_subscriber_destroy(self);
  }
  return NGX_OK;
}
예제 #2
0
static ngx_int_t websocket_dequeue(subscriber_t *self) {
  full_subscriber_t  *fsub = (full_subscriber_t  *)self;
  DBG("%p dequeue", self);
  fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data);
  if(self->destroy_after_dequeue) {
    websocket_subscriber_destroy(self);
  }
  return NGX_OK;
}
예제 #3
0
파일: websocket.c 프로젝트: rusirenye/nchan
static ngx_int_t websocket_release(subscriber_t *self, uint8_t nodestroy) {
  full_subscriber_t  *fsub = (full_subscriber_t  *)self;
  assert(self->reserved > 0);
  self->reserved--;
  DBG("%p release for req %p, reservations: %i", self, fsub->sub.request, self->reserved);
  if(nodestroy == 0 && fsub->awaiting_destruction == 1 && self->reserved == 0) {
    websocket_subscriber_destroy(self);
    return NGX_ABORT;
  }
  else {
    return NGX_OK;
  }
}
예제 #4
0
파일: websocket.c 프로젝트: t-web/nchan
static ngx_int_t websocket_dequeue(subscriber_t *self) {
  full_subscriber_t  *fsub = (full_subscriber_t  *)self;
  DBG("%p dequeue", self);
  fsub->dequeue_handler(&fsub->sub, fsub->dequeue_handler_data);
  self->enqueued = 0;
  
  if(fsub->ping_ev.timer_set) {
    ngx_del_timer(&fsub->ping_ev);
  }
  
  if(self->destroy_after_dequeue) {
    websocket_subscriber_destroy(self);
  }
  return NGX_OK;
}
ngx_int_t nchan_create_websocket_publisher(ngx_http_request_t  *r) {
  subscriber_t         *sub;
  nchan_llist_timed_t  *sub_link;
  nchan_request_ctx_t  *ctx = ngx_http_get_module_ctx(r, nchan_module);
  if(ctx) {
    ctx->publisher_type = &pub_name;
  }
  
  if((sub = websocket_subscriber_create(r, NULL)) == NULL) {
    ERR("couldn't create websocket publisher.");
    return NGX_ERROR;
  }
  
  if((sub_link = nchan_ws_llist_enqueue(sub)) == NULL) {
    websocket_subscriber_destroy(sub);
    ERR("couldn't create websocket publisher llink");
    return NGX_ERROR;
  }
  
  sub->fn->set_dequeue_callback(sub, ws_publisher_dequeue_callback, sub_link);
  sub->fn->enqueue(sub);
  return NGX_OK;
}