Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash Parsing 304's from GitHub API #871

Closed
naturalwarren opened this issue May 29, 2015 · 1 comment
Closed

Crash Parsing 304's from GitHub API #871

naturalwarren opened this issue May 29, 2015 · 1 comment

Comments

@naturalwarren
Copy link
Contributor

Hi there,

I'm consuming the GitHub API and Retrofit blows up when parsing the headers of responses when a 304 Status is returned. Any call that produces a 304 Status dies in a similar fashion. I'm unsure of whether this is a problem with how Retrofit/OkHttp parse response headers or something I'm doing wrong.

Please advise.

HTTP Header Received:

05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ <--- HTTP 200 https://api.github.com/users/JakeWharton (134ms)
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ : HTTP/1.1 200 OK
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Access-Control-Allow-Credentials: true
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Access-Control-Allow-Origin: *
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Access-Control-Expose-Headers: ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Cache-Control: private, max-age=60, s-maxage=60
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Content-Security-Policy: default-src 'none'
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Content-Type: application/json; charset=utf-8
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Date: Fri, 29 May 2015 12:36:43 GMT
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ ETag: "582cd44919ec51e50cf314279c6e2bcd"
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Last-Modified: Mon, 25 May 2015 14:01:56 GMT
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Server: GitHub.com
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Status: 304 Not Modified
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Transfer-Encoding: chunked
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ Vary: Accept-Encoding
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Android-Received-Millis: 1432903004041
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Android-Response-Source: CONDITIONAL_CACHE 304
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Android-Selected-Transport: http/1.1
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Android-Sent-Millis: 1432903003915
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Content-Type-Options: nosniff
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Frame-Options: deny
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-GitHub-Media-Type: github.v3; format=json
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-GitHub-Request-Id: 490F62D1:7B00:33BAF1:55685D5B
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-RateLimit-Limit: 5000
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-RateLimit-Remaining: 4994
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-RateLimit-Reset: 1432906350
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-Served-By: 07ff1c8a09e44b62e277fae50a1b1dc4
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ X-XSS-Protection: 1; mode=block
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ �����������������O��0�ſJ�3�!    lc�j{lO+u�J{���´Ʀ�C�������&�T������1���25h����S~o��F��@EXQ��� �=����U��x�9F�Tt��|����F{��F���:����;Ԫ�,�E   �n�:�e&����v��V���.�������9�ƭ��\C�@t8�����Ap��7�dž�������/�4B���#TQ�ᯰ�Zjk���I���ZٙQ/�NX�<������b��\�o~����5���FF�a���.�'j�����s���BB�s�O��GA��$.�7܆8u��ȫ6��+'��y���.����׻���_��ne�����J���GL���NSvc"�\�1���y��]�l�$��OqJ-�����c�k3ۀ��Thg��V�!L���҅R�8N�g���2�*a�w�à $,˶��"NX�%D����r�.�izX���v���,=�|�&CW]�d�:����)۳4cy�L^���NNBe������
05-29 08:36:44.041  14593-14713/com.naturalwarren.githubsocial D/Retrofit﹕ <--- END HTTP (472-byte body)

Immediately following this header I get the following crash.

Crash Stack Trace:

05-29 08:36:44.045  14593-14713/com.naturalwarren.githubsocial W/dalvikvm﹕ threadid=14: thread exiting with uncaught exception (group=0xa4cc1b20)
05-29 08:36:44.045  14593-14713/com.naturalwarren.githubsocial E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.naturalwarren.githubsocial, PID: 14593
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:377)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
            at $Proxy0.getUserById(Native Method)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:106)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:85)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
            at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:67)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:362)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
            at $Proxy0.getUserById(Native Method)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:106)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:85)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
            at com.google.gson.Gson.fromJson(Gson.java:803)
            at com.google.gson.Gson.fromJson(Gson.java:768)
            at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:362)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
            at $Proxy0.getUserById(Native Method)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:106)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:85)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1
            at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
            at com.google.gson.Gson.fromJson(Gson.java:803)
            at com.google.gson.Gson.fromJson(Gson.java:768)
            at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:362)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
            at $Proxy0.getUserById(Native Method)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:106)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.doInBackground(UsersActivity.java:85)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
05-29 08:36:44.717  14593-14593/com.naturalwarren.githubsocial E/WindowManager﹕ android.view.WindowLeaked: Activity com.naturalwarren.githubsocial.activities.UsersActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{52d0a950 V.E..... R......D 0,0-1026,486} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:346)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:286)
            at com.naturalwarren.githubsocial.activities.UsersActivity$FetchUserDataRunner.onPreExecute(UsersActivity.java:95)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
            at android.os.AsyncTask.execute(AsyncTask.java:535)
            at com.naturalwarren.githubsocial.activities.UsersActivity$1.onFollowersFetched(UsersActivity.java:69)
            at com.naturalwarren.githubsocial.ui.GalleryAdapter$1.success(GalleryAdapter.java:102)
            at com.naturalwarren.githubsocial.ui.GalleryAdapter$1.success(GalleryAdapter.java:97)
            at retrofit.CallbackRunnable$1.run(CallbackRunnable.java:45)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
@naturalwarren
Copy link
Contributor Author

User error. I should be handling 304's as follows or by wiring up OkHttp with its built-in response cache.

try {
    response = service.fetch("\"vENxxg\"");
} catch (RetrofitError e) {
    if (e.getResponse().getStatus() == HttpURLConnection.HTTP_NOT_MODIFIED) {
        //Nothing to update
        response = e.getResponse();
    } else {
        Log.e("Retrofit", e.getMessage(), e);
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant