子请求未发送或请求挂起

Subrequests are not sent or the request hangs

我正在尝试用 C(必须是 C)为 Nginx 1.7.12 编写自己的模块。 它的目的是在代理请求到达 Nginx 时向另一台服务器发送额外的请求。

为此,我在配置中创建了两个位置:

        location = / {
                 proxy_pass                 $backend_url;
        }
        location /internal_url {
                 proxy_pass                 $log_server_url;
                 internal;
        }

我使用了 here 中的示例来创建如下所示的过滤器:

static ngx_int_t my_http_body_filter(ngx_http_request_t* r,    
                                     ngx_chain_t* in)
{
  int                 rc;
  ngx_str_t           uri = SOME_INTERNAL_URI;
  ngx_http_request_t *sr;

  rc = ngx_http_next_body_filter(r, in);

  if (rc == NGX_ERROR)
    return rc;

  return ngx_http_subrequest(r, &uri, NULL /* args */, &sr,
                           NULL /* callback */, 0 /* flags */);
}

起初,似乎从未发送过子请求。我已经尝试过 NGX_AGAINsubrequest->done,但我只能让请求挂起。

然后,事实证明,当我在 ngx_http_subrequest 调用之后添加 return NGX_AGAIN; 时,子请求实际上已发送(因此配置正常)。

不幸的是,原始请求永远不会完成。

应该怎么做?

这可能有用吗?

static ngx_int_t my_http_body_filter(ngx_http_request_t* r,
                                     ngx_chain_t* in)
{
  int                 rc;
  ngx_str_t           uri = SOME_INTERNAL_URI;
  ngx_http_request_t *sr;

  if (r != r->main) { /* subrequest */
    return ngx_http_next_body_filter(r, in);
  }

  return ngx_http_subrequest(r, &uri, NULL /* args */, &sr,
                           NULL /* callback */, 0 /* flags */);
}

更新:

经过一番调查,这是一个新版本: gist

很遗憾,我目前没有机会测试我的代码。

更新

上面的代码在收到完整的正文后发送子请求。 另一种可能的方法是在第一个块上发送它并在上下文中存储标志。