hi,

lua 模块中,可以直接使用 ngx.say/ngx.print/ngx.flush 来进行
到客户端内容的输出,但跟踪代码以及实际测试时发现,

通过 ngx.say/ngx.print 发送的内容不支持 range 请求。

我想 如果自定义一个模块通过 lua 模块提供的 API 实现一个新函数,

类似这样:
ngx.allow_range(),代码实现:

static int
ngx_http_lua_allow_ranges(lua_State * L)
{
    ngx_http_request_t               *r;

    r = ngx_http_lua_get_request(L);
    if (r == NULL) {
        return luaL_error(L, "no request object found");
    }

    r->allow_ranges = 1;

    lua_pushboolean(L, 1);

    return 1;
}

lua 代码里这样实现:

ngx.allow_range()
ngx.header["content-length"] = 5    --- content-length 头部需要会设定
ngx.print("12345")

测试是ok,但不知道这样做是不是会带来其他兼容性问题?


    2016-12-01 14:35 GMT+08:00 雷勋文 <lei...@gmail.com>:
    hi,

    lua 模块中,可以直接使用 ngx.say/ngx.print/ngx.flush 来进行
    到客户端内容的输出,但跟踪代码以及实际测试时发现,

    通过 ngx.say/ngx.print 发送的内容不支持 range 请求。

    我想 如果自定义一个模块通过 lua 模块提供的 API 实现一个新函数,

    类似这样:
    ngx.allow_range(),代码实现:

    static int
    ngx_http_lua_allow_ranges(lua_State * L)
    {
        ngx_http_request_t               *r;

        r = ngx_http_lua_get_request(L);
        if (r == NULL) {
            return luaL_error(L, "no request object found");
        }

        r->allow_ranges = 1;

        lua_pushboolean(L, 1);

        return 1;
    }

    lua 代码里这样实现:

    ngx.allow_range()
    ngx.header["content-length"] = 5    --- content-length 头部需要会设定
    ngx.print("12345")

    做了简单测试,按照这种实现,ngx.allow_range、ngx.header["content-length"] 这两个函数必须要配合使用。

    既然内容处理已经交给 lua 了,那么完全可以自己处理 Range ,Lua 层面直接截取好要发送的数据这样更灵活。



    测试是ok,但不知道这样做是不是会带来其他兼容性问题?

    --



    --

    YuanSheng Wang
    ---------------------------------------
    OpenResty lover ^_^
      5 years later

      我就在content_by_lua中自己实现了解析Range参数,并且截取输出的内容。但是现在遇到一个问题,ngx.print(二进制内容)之后,ngx.exit(206) 不起作用,响应的状态码固定是200. 请问怎么办? 使用ngx.status = 206也不行__

        Write a Reply...