2016-06-30 120 views
1

我遵循了GitHub:LittleProxy所示的簡單示例,並在clientToProxyRequest(HttpObject httpObject)方法中添加了以下內容。Java LittleProxy(在Netty之上):如何訪問POST Body數據?

public HttpResponse clientToProxyRequest(HttpObject httpObject) 
{ 
    if(httpObject instanceof DefaultHttpRequest) 
    { 
    DefaultHttpRequest httpRequest = (DefaultHttpRequest)httpObject; 
    logger.info(httpRequest.getUri());   
    logger.info(httpRequest.toString()); 

    // How to access the POST Body data?    
    HttpPostRequestDecoder d = new HttpPostRequestDecoder(httpRequest); 
    d.getBodyHttpDatas(); //NotEnoughDataDecoderException 
    } 
    return null; 
} 

記錄儀報告這個,IMO只有這兩個標頭在這裏有關。這是一個POST請求並沒有內容...

POST http://www.... HTTP/1.1 
Content-Length: 522 

展望Netty的API文檔HttpPostRequestDecoder似乎是有前途的,但我得到一個NotEnoughDataDecoderException。在Netty JavaDoc這是寫的,但我不知道如何提供數據?

這個getMethod返回一個來自正文的所有HttpDatas的列表。 如果分塊,所有塊必須使用offer()getMethod提供。如果不是,則會引發NotEnoughDataDecoderException。

事實上,我也不確定這是否是在代理中獲取POST數據的正確方法。

回答

0

嘗試在你的HttpFiltersSourceAdapter內容添加到aviod NotEnoughDataDecoderException

@Override 
public int getMaximumRequestBufferSizeInBytes() { 
    return 1048576; 
} 

1048576這裏是聚合內容的最大長度。見POSTing data to netty with Apache HttpClient

這將使得能夠減壓的內容聚合,參見org.littleshoot.proxy.impl.ClientToProxyConnection的源代碼:

// Enable aggregation for filtering if necessary 
int numberOfBytesToBuffer = proxyServer.getFiltersSource() 
      .getMaximumRequestBufferSizeInBytes(); 
if (numberOfBytesToBuffer > 0) { 
    aggregateContentForFiltering(pipeline, numberOfBytesToBuffer); 
}