2016-04-05 4 views
0

Ich versuche, Daten von HttpClient an einen Server zu senden, der Jetty Embedded verwendet, gehostet auf dem gleichen Computer. Hier finden Sie die komplette Stack-Trace, die ich mit der Fehlermeldung erhalten:"Nicht im GZIP-Format" Ausnahme beim Senden von Daten von HttpClient an Jetty eingebettet

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} 

Der Fehler tritt hier auf der Linie Instanziieren des GZIPInputStream Objekt:

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

wo request ist die HttpServletRequest. Diese

ist, wie ich meine String komprimieren gzip:

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(); 
} 

Und das ist, wie ich die Verwendung von Httpclient senden:

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); 

Ich bin mir ziemlich sicher, ich bin durcheinander etwas, aber Ich bin mir nicht sicher wo genau. Danke für deine Hilfe.

Antwort

0

Wenn Sie nur eine gzip'd-Datei senden möchten, müssen Sie die Kopfzeile nicht festlegen.

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

Auf der Serverseite auch Pflege mehrt Anfragen nehmen müssen, denn dies können Sie mit Commons FileUpload

Verwandte Themen