2016-04-05 16 views
0

HttpClient'ten, aynı makinede barındırılan Jetty katıştırılmış kullanan bir sunucuya veri göndermeye çalışıyorum.HttpClient'ten Jetty katıştırılmış veriye veri gönderirken istisnai

java.util.zip.ZipException: Not in GZIP format 
    at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:165) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:79) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91) 
    at wserver.UploadHandler.handle(UploadHandler.java:44) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1162) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1096) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134) 
    at org.eclipse.jetty.server.Server.handle(Server.java:518) 
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308) 
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244) 
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273) 
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95) 
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246) 
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 
    at java.lang.Thread.run(Thread.java:745) 
2016-04-05 16:17:47.540:WARN:oejh.HttpParser:qtp1452126962-16: parse exception: java.lang.IllegalStateException: too much data seeking EOF in CLOSE for [email protected]{r=1,c=false,a=IDLE,uri=null} 

hata GZIPInputStream nesnenin örneğini satırda, burada ortaya çıkar:

ServletInputStream bodyInputStream = request.getInputStream(); 
GZIPInputStream gis = new GZIPInputStream(bodyInputStream); 

request olan HttpServletRequest Aşağıdaki I hata ile elde tam bir yığın izidir.

Bu benim gzip benim dize sıkıştırmak nasıl:

public static byte[] gzip(String content) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    try (GZIPOutputStream gzos = new GZIPOutputStream(baos)) { 
     gzos.write(content.getBytes(StandardCharsets.UTF_8)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return baos.toByteArray(); 
} 

Ve bu göndermek nasıl kullanarak HttpClient:

byte[] result = Utils.gzip(pagesJson); 

HttpClient client = HttpClients.createDefault(); 
HttpPost httpPost = new HttpPost("http://" + serverHost + "/upload"); 

MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
builder.addBinaryBody("pages", result, ContentType.DEFAULT_BINARY, "pages.bin"); 
HttpEntity multipart = builder.build(); 
httpPost.addHeader(HTTP.CONTENT_ENCODING, "gzip"); 
httpPost.setEntity(multipart); 

HttpResponse response = client.execute(httpPost); 

Ben bir şey berbat ediyorum eminim ama Tam olarak nerede olduğundan emin değilim. Yardımınız için teşekkürler.

cevap

0

Sadece bir gzip dosyası göndermek istiyorsanız, başlığı ayarlamak zorunda değilsiniz. Ayrıca bunun için, çok parçalı isteklerini dikkat çekmek gerekir Sunucu tarafında

httpPost.addHeader(HTTP.CONTENT_ENCODING, "gzip"); 

kullanabileceğiniz Commons FileUpload