2017-06-10 4 views
0

J'utilise HttpsURLConnection qui utilise okhttp, et chaque fois que j'utilise PUT et envoie une charge utile d'environ 5 Ko, il l'envoie sans erreur; cependant, quand j'envoie les charges utiles de plus 10KB, je recevrais l'erreur suivante:Fin inattendue du flux sur une charge utile importante OkHTTP

W/System.err: java.net.ProtocolException: unexpected end of stream
W/System.err: at com.android.okhttp.internal.http.HttpConnection$FixedLengthSink.close(HttpConnection.java:314) W/System.err: at com.android.okhttp.okio.RealBufferedSink.close(RealBufferedSink.java:241) W/System.err: at com.android.okhttp.okio.RealBufferedSink$1.close(RealBufferedSink.java:209) W/System.err: at java.io.FilterOutputStream.close(FilterOutputStream.java:67)
W/System.err: at com.mercadolibre.android.sdk.internal.HttpPut.performOperationBeforeConnect(HttpPut.java:52) W/System.err: at com.mercadolibre.android.sdk.internal.HttpOperation.execute(HttpOperation.java:100) W/System.err: at com.mercadolibre.android.sdk.internal.HttpOperation.execute(HttpOperation.java:74) W/System.err: at com.mercadolibre.android.sdk.Meli.put(Meli.java:534)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) W/System.err: at java.lang.Thread.run(Thread.java:818)

Sur une nouvelle tentative d'envoyer, il finirait par travailler, somestimes prendre jusqu'à 5 réessaie qui suggèrent que la charge utile est pas corrompu ni rien mais une erreur sur la connexion.

Une idée sur ce qui pourrait être la cause? J'ai examiné la bibliothèque et j'appelle flush() et close() après l'écriture afin que le Sink ne devrait pas avoir d'erreurs de taille. En outre, j'ai essayé de configurer un fixedsize pour la connexion pour utiliser la longueur de ma charge utile, mais rien travailler.

Merci d'avance.

Répondre

1

Cette erreur se produit lorsque la longueur du contenu est altérée par la longueur des données que vous écrivez réellement. Comment calculez-vous la longueur du contenu?

+0

Merci pour la réponse. J'utilise payload.getBytes(). Length. Et ma connexion a cet ensemble comme longueur fixe. J'ai également essayé de ne pas définir de longueur et d'écrire ma charge directement dans DataOutputWriter, mais la même chose se produit. –

+1

Essayez d'enregistrer une référence au 'byte []' renvoyé par 'payload.getBytes()' et utilisez ce 'byte []' lorsque vous l'écrivez dans le flux. Je suppose que le jeu de caractères utilisé par 'payload.getBytes()' n'est pas le même que le jeu de caractères que vous utilisez pour écrire le corps. Lorsque ces deux points sont en désaccord, vous obtenez des longueurs différentes lorsque la chaîne a des caractères non-ASCII. –

+0

Grande observation et je vais essayer, mais ne serait pas juste échouer à chaque fois que le contenu de la charge ne change pas, mais cela fonctionne après plusieurs tentatives? Merci. –