我正在尝试创建像这样的回复
------------- -----------请求 HEAD /external/images/media/21.jpg HTTP / 1.0
getcontentFeatures.dlna.org:1
主持人:192.168.1.130:57645
-----------我想要的答案------------------ HTTP / 1.1 200确定
日期:2012年8月21日星期二,格林威治标准时间10:24:59
缓存控制:无缓存
transferMode.dlna.org:Streaming
contentFeatures.dlna.org:DLNA.ORG_PN = JPEG_LRG; DLNA.ORG_OP = 01; DLNA.ORG_CI = 0
内容类型:image / jpeg
Last-Modified:星期六,2012年2月25日15:11:58 GMT
内容长度:60909
但我有一个问题,当我尝试把“Content-Length:60909”这个异常抛出“Content-Length头已经存在”,如果我不把Header Content-Length总是0,那么不是什么我想要。
public void handle(HttpRequest request,
HttpResponse response,
HttpContext context) throws HttpException, IOException {
String method = request.getRequestLine().getMethod().toUpperCase(Locale.ENGLISH);
if(method.equals("HEAD"))
{
String objectId = getUrlBuilder().getObjectId(request.getRequestLine().getUri());
DIDLObject obj = findObjectWithId(objectId);
if (obj == null) {
response.setStatusCode(HttpStatus.SC_NOT_FOUND);
return;
}
MimeType mimeType = getMimeType(obj);
long sizeInBytes = getSizeInBytes(obj);
response.setHeader("Cache-control", "no-cache");
response.setHeader("transferMode.dlna.org", "Streaming");
String aMimeType = mimeType.toString();
String dlnaspec="";
if (aMimeType.equals("image/jpeg"))
dlnaspec = "DLNA.ORG_PN=JPEG_LRG";
else if (aMimeType.equals("audio/mpeg"))
dlnaspec = "DLNA.ORG_PN=MP3";
else if (aMimeType.equals("audio/L16") || aMimeType.equals("audio/wav"))
dlnaspec = "DLNA.ORG_PN=LPCM";
response.setHeader("contentFeatures.dlna.org", dlnaspec+";DLNA.ORG_OP=01;DLNA.ORG_CI=0");
response.setHeader("Content-Type", mimeType.toString());
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Length", String.valueOf(sizeInBytes));
response.setStatusCode(HttpStatus.SC_OK);
}
}
任何想法? 我也试图以这种方式放置实体
ByteArrayInputStream stream=new ByteArrayInputStream(new byte[(int) sizeInBytes]);
InputStreamEntity entity = new InputStreamEntity(stream, sizeInBytes);
response.setEntity(entity);
但问题是HEAD方法没有正文,所以这种方法无效
答案 0 :(得分:0)
我找到了一个解决方案,实现了我自己的ResponseContent并支持Users Content-Length 这就是代码
public class MyCustomResponseContent implements HttpResponseInterceptor
{
private final boolean overwrite;
/**
* Default constructor. The <code>Content-Length</code> or <code>Transfer- Encoding</code>
* will cause the interceptor to throw {@link ProtocolException} if already present in the
* response message.
*/
public MyCustomResponseContent()
{
this(false);
}
/**
* Constructor that can be used to fine-tune behavior of this interceptor.
*
* @param overwrite If set to <code>true</code> the <code>Content-Length</code> and
* <code>Transfer-Encoding</code> headers will be created or updated if already present.
* If set to <code>false</code> the <code>Content-Length</code> and
* <code>Transfer-Encoding</code> headers will cause the interceptor to throw
* {@link ProtocolException} if already present in the response message.
*
* @since 4.2
*/
public MyCustomResponseContent(boolean overwrite)
{
super();
this.overwrite = overwrite;
}
/**
* Processes the response (possibly updating or inserting) Content-Length and Transfer-Encoding headers.
* @param response The HttpResponse to modify.
* @param context Unused.
* @throws ProtocolException If either the Content-Length or Transfer-Encoding headers are found.
* @throws IllegalArgumentException If the response is null.
*/
public void process(final HttpResponse response, final HttpContext context) throws HttpException, IOException
{
if (response == null)
{
throw new IllegalArgumentException("HTTP response may not be null");
}
if (this.overwrite)
{
response.removeHeaders(HTTP.TRANSFER_ENCODING);
response.removeHeaders(HTTP.CONTENT_LEN);
}
else
{
if (response.containsHeader(HTTP.TRANSFER_ENCODING))
{
throw new ProtocolException("Transfer-encoding header already present");
}
/*
if (response.containsHeader(HTTP.CONTENT_LEN))
{
throw new ProtocolException("Content-Length header already present");
}
*/
}
ProtocolVersion ver = response.getStatusLine().getProtocolVersion();
HttpEntity entity = response.getEntity();
if (entity != null)
{
long len = entity.getContentLength();
if (entity.isChunked() && !ver.lessEquals(HttpVersion.HTTP_1_0))
{
response.addHeader(HTTP.TRANSFER_ENCODING, HTTP.CHUNK_CODING);
}
else if (len >= 0)
{
response.addHeader(HTTP.CONTENT_LEN, Long.toString(entity.getContentLength()));
}
// Specify a content type if known
if (entity.getContentType() != null && !response.containsHeader(HTTP.CONTENT_TYPE ))
{
response.addHeader(entity.getContentType());
}
// Specify a content encoding if known
if (entity.getContentEncoding() != null && !response.containsHeader(HTTP.CONTENT_ENCODING))
{
response.addHeader(entity.getContentEncoding());
}
}
else if (!response.containsHeader(HTTP.CONTENT_LEN))
{
int status = response.getStatusLine().getStatusCode();
if (status != HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_NOT_MODIFIED && status != HttpStatus.SC_RESET_CONTENT)
{
response.addHeader(HTTP.CONTENT_LEN, "0");
}
}
}
}