static ngx_int_t publish_callback(ngx_int_t status, nchan_channel_t *ch, safe_request_ptr_t *pd) { nchan_request_ctx_t *ctx; static nchan_msg_id_t empty_msgid = NCHAN_ZERO_MSGID; ngx_http_request_t *r = nchan_get_safe_request_ptr(pd); if(r == NULL) { // the request has since disappered return NGX_ERROR; } ctx = ngx_http_get_module_ctx(r, ngx_nchan_module); //DBG("publish_callback %V owner %i status %i", ch_id, memstore_channel_owner(ch_id), status); switch(status) { case NCHAN_MESSAGE_QUEUED: //message was queued successfully, but there were no subscribers to receive it. ctx->prev_msg_id = ctx->msg_id; ctx->msg_id = ch != NULL ? ch->last_published_msg_id : empty_msgid; nchan_maybe_send_channel_event_message(r, CHAN_PUBLISH); ngx_http_finalize_request(r, nchan_response_channel_ptr_info(ch, r, NGX_HTTP_ACCEPTED)); return NGX_OK; case NCHAN_MESSAGE_RECEIVED: //message was queued successfully, and it was already sent to at least one subscriber ctx->prev_msg_id = ctx->msg_id; ctx->msg_id = ch != NULL ? ch->last_published_msg_id : empty_msgid; nchan_maybe_send_channel_event_message(r, CHAN_PUBLISH); ngx_http_finalize_request(r, nchan_response_channel_ptr_info(ch, r, NGX_HTTP_CREATED)); return NGX_OK; case NGX_ERROR: case NGX_HTTP_INTERNAL_SERVER_ERROR: //WTF? nchan_log_request_error(r, "error publishing message"); ctx->prev_msg_id = empty_msgid;; ctx->msg_id = empty_msgid; ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return NGX_ERROR; default: //for debugging, mostly. I don't expect this branch to behit during regular operation ctx->prev_msg_id = empty_msgid;; ctx->msg_id = empty_msgid; nchan_log_request_error(r, "TOTALLY UNEXPECTED error publishing message, status code %i", status); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return NGX_ERROR; } }
static ngx_int_t channel_info_callback(ngx_int_t status, void *rptr, void *pd) { ngx_http_request_t *r = nchan_get_safe_request_ptr(pd); if(r == NULL) { return NGX_ERROR; } ngx_http_finalize_request(r, nchan_response_channel_ptr_info( (nchan_channel_t *)rptr, r, 0)); return NGX_OK; }
static ngx_int_t publish_callback(ngx_int_t status, void *rptr, ngx_http_request_t *r) { nchan_channel_t *ch = rptr; nchan_request_ctx_t *ctx = ngx_http_get_module_ctx(r, nchan_module); static nchan_msg_id_t empty_msgid = {0}; //DBG("publish_callback %V owner %i status %i", ch_id, memstore_channel_owner(ch_id), status); switch(status) { case NCHAN_MESSAGE_QUEUED: //message was queued successfully, but there were no subscribers to receive it. ctx->prev_msg_id = ctx->msg_id; ctx->msg_id = ch != NULL ? ch->last_published_msg_id : empty_msgid; ngx_http_finalize_request(r, nchan_response_channel_ptr_info(ch, r, NGX_HTTP_ACCEPTED)); return NGX_OK; case NCHAN_MESSAGE_RECEIVED: //message was queued successfully, and it was already sent to at least one subscriber ctx->prev_msg_id = ctx->msg_id; ctx->msg_id = ch != NULL ? ch->last_published_msg_id : empty_msgid; ngx_http_finalize_request(r, nchan_response_channel_ptr_info(ch, r, NGX_HTTP_CREATED)); return NGX_OK; case NGX_ERROR: case NGX_HTTP_INTERNAL_SERVER_ERROR: //WTF? ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "nchan: error publishing message"); ctx->prev_msg_id = empty_msgid;; ctx->msg_id = empty_msgid; ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return NGX_ERROR; default: //for debugging, mostly. I don't expect this branch to behit during regular operation ctx->prev_msg_id = empty_msgid;; ctx->msg_id = empty_msgid; ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "nchan: TOTALLY UNEXPECTED error publishing message, status code %i", status); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); return NGX_ERROR; } }
static ngx_int_t channel_info_callback(ngx_int_t status, void *rptr, ngx_http_request_t *r) { ngx_http_finalize_request(r, nchan_response_channel_ptr_info( (nchan_channel_t *)rptr, r, 0)); return NGX_OK; }