static ngx_int_t ngx_http_iconv_filter_convert(ngx_http_iconv_ctx_t *ctx, ngx_chain_t *in, ngx_chain_t **out) { ngx_http_iconv_loc_conf_t *ilcf; size_t rest; ngx_chain_t *cl; ngx_int_t rc; rest = 0; ilcf = ngx_http_get_module_loc_conf(ctx->r, ngx_http_iconv_module); dd("XXX in->buf: %.*s", (int) (in->buf->last - in->buf->pos), in->buf->pos); dd("XXX last buf: %d", (int) in->buf->last_buf); if (in->buf->last - in->buf->pos) { rc = ngx_http_do_iconv(ctx->r, out, in->buf->pos, in->buf->last - in->buf->pos, ilcf->from, ilcf->to, NULL, &rest); if (rc != NGX_OK) { ngx_log_error(NGX_LOG_ERR, ctx->r->connection->log, 0, "convert error from ngx_http_do_iconv"); return rc; } if (in->buf->last_buf) { for (cl = *out; cl->next; cl = cl->next); cl->buf->last_buf = 1; } } else { *out = in; } dd("ilcf->to:%s", ilcf->to); if (rest) { ctx->uc.data = ngx_palloc(ctx->r->pool, rest); if (ctx->uc.data == NULL) { return NGX_ERROR; } dd("%p, %p, %zu", ctx->uc.data, in->buf->last, rest); ngx_memcpy(ctx->uc.data, in->buf->last - rest, rest); ctx->uc.len = rest; } else { ctx->uc.data = NULL; ctx->uc.len = 0; } return NGX_OK; }
static ngx_int_t ngx_http_set_iconv_handler(ngx_http_request_t *r, ngx_str_t *res, ngx_http_variable_value_t *v) { ngx_chain_t *cl, *chain; ngx_buf_t *buf; u_char *src, *dst, *p; size_t converted; u_char * end; ngx_http_iconv_loc_conf_t *ilcf; ngx_int_t rc; if (v->len == 0) { res->data = NULL; res->len = 0; return NGX_OK; } ilcf = ngx_http_get_module_loc_conf(r, ngx_http_iconv_module); iconv_buf_size = ilcf->buf_size; dd("iconv_buf_size=%d", (int) iconv_buf_size); src = ngx_palloc(r->pool, v[1].len + 1); if (src == NULL) { return NGX_ERROR; } dst = ngx_palloc(r->pool, v[2].len + 1); if (dst == NULL) { return NGX_ERROR; } end = ngx_copy(src, v[1].data, v[1].len); *end = '\0'; end = ngx_copy(dst, v[2].data, v[2].len); *end = '\0'; dd("dst:%s\n, src:%s\n", dst, src); rc = ngx_http_do_iconv(r, &chain, v[0].data, v[0].len, src, dst, &converted, NULL); if (rc == NGX_ERROR) { dd("convert error"); return NGX_ERROR; } res->data = ngx_palloc(r->pool, converted); if (res->data == NULL) { return NGX_ERROR; } p = res->data; res->len = converted; for (cl = chain; cl; cl = cl->next) { buf = cl->buf; dd("after convert, buf:%.*s", (int) (buf->last - buf->pos), buf->pos); p = ngx_copy(p, buf->pos, buf->last - buf->pos); } dd("%.*s\n%.*s\n%.*s\n",v[0].len, v[0].data,v[1].len, v[1].data, v[2].len, v[2].data); return NGX_OK; }