Closed tachang closed 7 years ago
Also a tcpdump shows that retrofit is sending the FIN+ACK. Not the server.
Tracked it to some kind of issue with the HttpLoggingInterceptor:
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
client = new OkHttpClient.Builder()
.addInterceptor(new AddHeadersInterceptor(context))
.addInterceptor(interceptor)
.build();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
Basic and headers seem to work. BODY does not.
Can you provide an executable test case?
I managed to create an example android project and django server. Is there a specific executable test case you mean or is that it?
I'm not sure how to make executable test cases inside OkHttp. But for now I just uploaded my test code here: https://github.com/tachang/TestGzipRetrofit
Could you provide an sample django URL?
Inside https://github.com/tachang/TestGzipRetrofit/tree/master/gziptest you can run
pip install -r requirements.txt
python manage.py runserver
And point the server. I can probably put one up for now if you want if you ping me directly.
Here you go:
http://riven.zspin.com:5000/withgzip
http://riven.zspin.com:5000/withoutgzip
I didn’t have any problems. https://gist.github.com/swankjesse/e3bc9c2eb89785e448e80bcce3866bc0
Did you try without gzip?
You can also download the example app and press the buttons. Make sure you configure the URL though.
Seems like it just works.
11/07 12:47:56: Launching MainActivity
Cold swapped changes.
$ adb shell am start -n "com.example.testgzipretrofit/com.example.testgzipretrofit.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Waiting for process to come online
Waiting for process to come online
Connected to process 2994 on device Nexus_5X_API_24 [emulator-5554]
I/System.out: Testing withGzip
D/OkHttp: --> GET http://riven.zspin.com:5000/withgzip http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 OK http://riven.zspin.com:5000/withgzip (209ms)
D/OkHttp: Date: Mon, 07 Nov 2016 17:48:20 GMT
D/OkHttp: Server: WSGIServer/0.1 Python/2.7.6
D/OkHttp: Vary: Accept-Encoding
D/OkHttp: X-Frame-Options: SAMEORIGIN
D/OkHttp: Content-Type: application/json
D/OkHttp: <-- END HTTP
I/System.out: Response: com.example.testgzipretrofit.MainActivity$Fruit@b8fe8ee
I/System.out: Testing withoutGzip
D/OkHttp: --> GET http://riven.zspin.com:5000/withoutgzip http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 OK http://riven.zspin.com:5000/withoutgzip (184ms)
D/OkHttp: Date: Mon, 07 Nov 2016 17:48:24 GMT
D/OkHttp: Server: WSGIServer/0.1 Python/2.7.6
D/OkHttp: X-Frame-Options: SAMEORIGIN
D/OkHttp: Content-Type: application/json
D/OkHttp: <-- END HTTP
I/System.out: Response: com.example.testgzipretrofit.MainActivity$Fruit@e0827c6
Set the LoggingInterceptor to BODY.
Sorry pushed up a working version.
Also updated the repo test case.
Were you able to reproduce?
It works for me every time. Is something broken in your environment?
Did you git pull and rebuild? I changed the Log Handler to BODY.
I/OpenGLRenderer: Initialized EGL, version 1.4
W/EGL_emulation: eglSurfaceAttrib not implemented
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xe0d91d80, error=EGL_SUCCESS
I/System.out: Testing withGzip
D/OkHttp: --> GET http://riven.zspin.com:5000/withgzip http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 OK http://riven.zspin.com:5000/withgzip (221ms)
D/OkHttp: Date: Mon, 07 Nov 2016 21:13:51 GMT
D/OkHttp: Server: WSGIServer/0.1 Python/2.7.6
D/OkHttp: Vary: Accept-Encoding
D/OkHttp: X-Frame-Options: SAMEORIGIN
D/OkHttp: Content-Type: application/json
D/OkHttp: {"a": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820
D/OkHttp: , 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999]}
D/OkHttp: <-- END HTTP (4897-byte body)
I/System.out: Response: com.example.testgzipretrofit.MainActivity$Fruit@c546c82
I/System.out: Testing withoutGzip
D/OkHttp: --> GET http://riven.zspin.com:5000/withoutgzip http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 OK http://riven.zspin.com:5000/withoutgzip (90ms)
D/OkHttp: Date: Mon, 07 Nov 2016 21:13:53 GMT
D/OkHttp: Server: WSGIServer/0.1 Python/2.7.6
D/OkHttp: X-Frame-Options: SAMEORIGIN
D/OkHttp: Content-Type: application/json
W/System.err: java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)
W/System.err: at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:588)
W/System.err: at libcore.io.IoBridge.recvfrom(IoBridge.java:552)
W/System.err: at java.net.PlainSocketImpl.read(PlainSocketImpl.java:481)
W/System.err: at java.net.PlainSocketImpl.-wrap0(PlainSocketImpl.java)
W/System.err: at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
W/System.err: at okio.Okio$2.read(Okio.java:138)
W/System.err: at okio.AsyncTimeout$2.read(AsyncTimeout.java:238)
W/System.err: at okio.RealBufferedSource.read(RealBufferedSource.java:45)
W/System.err: at okhttp3.internal.http.Http1xStream$UnknownLengthSource.read(Http1xStream.java:472)
W/System.err: at okio.RealBufferedSource.request(RealBufferedSource.java:66)
W/System.err: at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:238)
W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170)
W/System.err: at okhttp3.RealCall.execute(RealCall.java:60)
W/System.err: at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
W/System.err: at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89)
W/System.err: at com.example.testgzipretrofit.MainActivity$2.onClick(MainActivity.java:108)
W/System.err: at android.view.View.performClick(View.java:5198)
W/System.err: at android.view.View$PerformClick.run(View.java:21147)
W/System.err: at android.os.Handler.handleCallback(Handler.java:739)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
W/System.err: Caused by: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
W/System.err: at libcore.io.Posix.recvfromBytes(Native Method)
W/System.err: at libcore.io.Posix.recvfrom(Posix.java:189)
W/System.err: at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250)
W/System.err: at libcore.io.IoBridge.recvfrom(IoBridge.java:549)
W/System.err: ... 25 more
Just want to confirm that you did set BODY and not HEADERS for logging.
I cannot reproduce the problem. Please create a test case to reproduce this.
Even setting the logging to BODY?
When you say test case can you point me to an example?
There's an example in the ‘new issue’ form: https://gist.github.com/swankjesse/981fcae102f513eb13ed
I am suspecting this has something to do with Genymotion.
Yup, that’s possible. I’m closing this.
I have the same problem, did you find a workaround @tachang ?
I actually think it was due to Genymotion. Try using the normal android simulator.
ok thanks I will try this
Not sure if anyone is running into this but I have a call to a Django server. The response is simple json but does not get gzip'ed. It results in ECONNRESET. However if I change the call so it returns more data so that it triggers the gzip middleware in django I don't see the ECONNRESET.
W/System.err: java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) W/System.err: at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:588) W/System.err: at libcore.io.IoBridge.recvfrom(IoBridge.java:552) W/System.err: at java.net.PlainSocketImpl.read(PlainSocketImpl.java:481) W/System.err: at java.net.PlainSocketImpl.-wrap0(PlainSocketImpl.java) W/System.err: at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237) W/System.err: at okio.Okio$2.read(Okio.java:138) W/System.err: at okio.AsyncTimeout$2.read(AsyncTimeout.java:238) W/System.err: at okio.RealBufferedSource.read(RealBufferedSource.java:45) W/System.err: at okhttp3.internal.http.Http1xStream$UnknownLengthSource.read(Http1xStream.java:472) W/System.err: at okio.RealBufferedSource.request(RealBufferedSource.java:66) W/System.err: at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:238) W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) W/System.err: at com.literatorapp.utils.AddHeadersInterceptor.intercept(ApiService.java:55) W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) W/System.err: at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) W/System.err: at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170) W/System.err: at okhttp3.RealCall.execute(RealCall.java:60) W/System.err: at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) W/System.err: at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89) W/System.err: at com.literatorapp.tasks.LoadClassroom.doInBackground(LoadClassroom.java:71) W/System.err: at com.literatorapp.tasks.LoadClassroom.doInBackground(LoadClassroom.java:32) W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295) W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 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) W/System.err: Caused by: android.system.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer) W/System.err: at libcore.io.Posix.recvfromBytes(Native Method) W/System.err: at libcore.io.Posix.recvfrom(Posix.java:189) W/System.err: at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250) W/System.err: at libcore.io.IoBridge.recvfrom(IoBridge.java:549)