00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "ngx_http_xxslt_udata.h"
00023 #include "ngx_http_xxslt_selector.h"
00024
00031 ngx_http_xxslt_unknown_data_t *
00032 ngx_http_xxslt_unknown_create_new(ngx_http_request_t *r)
00033 {
00034 ngx_http_xxslt_unknown_data_t *data;
00035 data = ngx_pcalloc(r->pool, sizeof(ngx_http_xxslt_unknown_data_t));
00036 if( data == NULL ) {
00037 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
00038 "[unknown_create_new] alloc fail.");
00039 return NULL;
00040 }
00041
00042 data->r = r;
00043
00044 return data;
00045 }
00046
00054 ngx_int_t
00055 ngx_http_xxslt_unknown_add_data_chunk(ngx_http_xxslt_unknown_data_t *data, ngx_chain_t *in)
00056 {
00057 ngx_http_request_t *r;
00058 ngx_chain_t *cl;
00059 ngx_chain_t *cl_end;
00060
00061 r = data->r;
00062
00063
00064 if( in == NULL ) {
00065 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
00066 "[unknown_add_data_chunk] alloc fail");
00067 return ngx_http_xxslt_finalize_with_error(r,
00068 NGX_HTTP_INTERNAL_SERVER_ERROR, NULL);
00069 }
00070
00071 cl = in;
00072 while( cl ) {
00073 cl_end = cl;
00074
00075 data->res_len += cl->buf->last - cl->buf->pos;
00076
00077 if( cl->buf->last - cl->buf->pos == 0 ) {
00078 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
00079 "[unknown_add_data_chunk] empty buffer.");
00080 return ngx_http_xxslt_finalize_with_error(r,
00081 NGX_HTTP_INTERNAL_SERVER_ERROR, NULL);
00082 }
00083 cl = cl->next;
00084 }
00085
00086 if( data->buffer_chain == NULL ) {
00087 data->buffer_chain = in;
00088 }
00089 else {
00090 data->buffer_chain_tail->next = in;
00091 }
00092
00093 data->buffer_chain_tail = cl_end;
00094
00095 if( cl_end->buf->last_in_chain ) {
00096 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
00097 "[unknown_add_data_chunk] finalizing. %d", (ngx_int_t) data);
00098
00099 data->done = 1;
00100 ngx_http_xxslt_process_data(r);
00101 }
00102 return NGX_OK;
00103 }