Example #1
0
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;
}