【问题标题】:Netty - access content of chunked HTTP request (LittleProxy)Netty - 访问分块 HTTP 请求的内容 (LittleProxy)
【发布时间】:2013-03-14 16:50:04
【问题描述】:

我正在拦截使用 Netty 的 LittleProxy 的 HTTP 请求。 但是,现在我想拦截一个显然使用分块传输编码的 Web 服务请求。

HTTP 标头如下所示

Content-Type -> text/xml; charset=UTF-8
Host -> 192.168.56.1:7897
SOAPAction -> "getSymbols"
Transfer-Encoding -> chunked
User-Agent -> Axis2
Via -> 1.1.tvmbp

如何访问内容?我尝试将 httpChunkAggregator 添加到 littleproxy 代码中的某个管道,但没有用。

【问题讨论】:

  • 我想这与 littleproxy 相关,而不是 netty。用“littleproxy”标记你的问题并召唤 Adam Fisk 怎么样?

标签: http netty chunked-encoding transfer-encoding http-chunked


【解决方案1】:

您需要在 HttpFiltersSourceAdapter 中覆盖这两个方法。返回非零缓冲区大小。 LittleProxy 会自动聚合 httpRequest 和 httpContent 并包装成一个 AggregatedFullHttpRequest,它允许转换为 httpContent。

@Override
public int getMaximumRequestBufferSizeInBytes() {
    return 1024 * 1024;
}

@Override
public int getMaximumResponseBufferSizeInBytes() {
    return 1024 * 1024 * 2;
}

然后就可以克隆和读取HTTP包中的内容了:

String cloneAndExtractContent(HttpObject httpObject, Charset charset){
    List<Byte> bytes = new ArrayList<Byte>();
    HttpContent httpContent = (HttpContent) httpObject;
    ByteBuf buf = httpContent.content();
    byte[] buffer = new byte[buf.readableBytes()];
    if(buf.readableBytes() > 0) {
        int readerIndex = buf.readerIndex();
        buf.getBytes(readerIndex, buffer);
    }
    for(byte b : buffer){
        bytes.add(b);
    }
    return new String(Bytes.toArray(bytes), charset);
}


@Override
public HttpResponse clientToProxyRequest(HttpObject httpObject) {
     System.out.println("clientToProxyRequest - to -> "+getRequestUrl());
     System.out.println(cloneAndExtractContent(httpObject, StandardCharsets.UTF_8));

     return null;
}


@Override
public HttpObject serverToProxyResponse(HttpObject httpObject)
{
      System.out.println("serverToProxyResponse <- from - "+getRequestUrl());
      System.out.println(cloneAndExtractContent(httpObject, StandardCharsets.UTF_8));

      return httpObject;
}

【讨论】:

    【解决方案2】:

    你可以使用一个HttpRequestFilter,如下:

        final HttpProxyServer plain = 
            new DefaultHttpProxyServer(8888, new HttpRequestFilter() {
                @Override
                public void filter(HttpRequest httpRequest) {
                    System.out.println("Request went through proxy: "+httpRequest);
                }
            },
            new HttpResponseFilters() {
                public HttpFilter getFilter(String hostAndPort) {
                    return null;
                }
            });
    

    LittleProxy 0.5.3 就是这样。 GitHub master 更新为使用 Netty 4,语义会有点不同。

    【讨论】:

    • 我今天正在尝试这样做,并且请求在分块时显示为 DefaultHttpContent 和 DefaultLastHttpContent 对象。这些似乎具有与常规 HttpRequest 对象完全不同的 API,我不确定如何修改它们(即:更改 URI 以重定向流量)。有什么指点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2020-07-02
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多