1414
1515package com .google .firebase .appdistribution ;
1616
17+ import static com .google .firebase .appdistribution .FirebaseAppDistributionException .Status .AUTHENTICATION_FAILURE ;
18+ import static com .google .firebase .appdistribution .FirebaseAppDistributionException .Status .NETWORK_FAILURE ;
19+
1720import androidx .annotation .NonNull ;
1821import com .google .firebase .appdistribution .internal .AppDistributionReleaseInternal ;
1922import java .io .BufferedInputStream ;
2023import java .io .ByteArrayOutputStream ;
2124import java .io .IOException ;
2225import java .io .InputStream ;
2326import java .net .MalformedURLException ;
24- import java .net .ProtocolException ;
2527import java .net .URL ;
2628import javax .net .ssl .HttpsURLConnection ;
2729import org .json .JSONException ;
2830import org .json .JSONObject ;
2931
30- public class FirebaseAppDistributionTesterApiClient {
32+ class FirebaseAppDistributionTesterApiClient {
3133
3234 private static final String RELEASE_ENDPOINT_URL_FORMAT =
3335 "https://firebaseapptesters.googleapis.com/v1alpha/devices/-/testerApps/%s/installations/%s/releases" ;
@@ -45,16 +47,16 @@ public class FirebaseAppDistributionTesterApiClient {
4547
4648 public @ NonNull AppDistributionReleaseInternal fetchLatestRelease (
4749 @ NonNull String fid , @ NonNull String appId , @ NonNull String apiKey , @ NonNull String authToken )
48- throws FirebaseAppDistributionException , ProtocolException {
50+ throws FirebaseAppDistributionException {
4951
5052 AppDistributionReleaseInternal latestRelease ;
51- HttpsURLConnection conn = openHttpsUrlConnection (appId , fid );
52- conn .setRequestMethod (REQUEST_METHOD );
53- conn .setRequestProperty (API_KEY_HEADER , apiKey );
54- conn .setRequestProperty (INSTALLATION_AUTH_HEADER , authToken );
55-
53+ HttpsURLConnection connection = openHttpsUrlConnection (appId , fid );
5654 try {
57- JSONObject latestReleaseJson = readFetchReleaseInputStream (conn .getInputStream ());
55+ connection .setRequestMethod (REQUEST_METHOD );
56+ connection .setRequestProperty (API_KEY_HEADER , apiKey );
57+ connection .setRequestProperty (INSTALLATION_AUTH_HEADER , authToken );
58+
59+ JSONObject latestReleaseJson = readFetchReleaseInputStream (connection .getInputStream ());
5860 final String displayVersion = latestReleaseJson .getString (DISPLAY_VERSION_JSON_KEY );
5961 final String buildVersion = latestReleaseJson .getString (BUILD_VERSION_JSON_KEY );
6062 String releaseNotes = tryGetValue (latestReleaseJson , RELEASE_NOTES_JSON_KEY );
@@ -79,16 +81,47 @@ public class FirebaseAppDistributionTesterApiClient {
7981 .build ();
8082
8183 } catch (IOException | JSONException e ) {
82- // todo: change error status based on response code
83- throw new FirebaseAppDistributionException (
84- FirebaseAppDistributionException .Status .NETWORK_FAILURE );
84+ if (e instanceof JSONException ) {
85+ throw new FirebaseAppDistributionException (
86+ Constants .ErrorMessages .JSON_PARSING_ERROR , NETWORK_FAILURE , e );
87+ }
88+
89+ throw getExceptionForHttpResponse (connection );
8590 } finally {
86- conn .disconnect ();
91+ connection .disconnect ();
8792 }
8893
8994 return latestRelease ;
9095 }
9196
97+ private FirebaseAppDistributionException getExceptionForHttpResponse (
98+ HttpsURLConnection connection ) {
99+ try {
100+ switch (connection .getResponseCode ()) {
101+ case 401 :
102+ return new FirebaseAppDistributionException (
103+ Constants .ErrorMessages .AUTHENTICATION_ERROR , AUTHENTICATION_FAILURE );
104+ case 403 :
105+ case 400 :
106+ return new FirebaseAppDistributionException (
107+ Constants .ErrorMessages .AUTHORIZATION_ERROR , AUTHENTICATION_FAILURE );
108+ case 404 :
109+ return new FirebaseAppDistributionException (
110+ Constants .ErrorMessages .NOT_FOUND_ERROR , AUTHENTICATION_FAILURE );
111+ case 408 :
112+ case 504 :
113+ return new FirebaseAppDistributionException (
114+ Constants .ErrorMessages .TIMEOUT_ERROR , NETWORK_FAILURE );
115+ default :
116+ return new FirebaseAppDistributionException (
117+ Constants .ErrorMessages .NETWORK_ERROR , NETWORK_FAILURE );
118+ }
119+ } catch (IOException ex ) {
120+ return new FirebaseAppDistributionException (
121+ Constants .ErrorMessages .NETWORK_ERROR , NETWORK_FAILURE , ex );
122+ }
123+ }
124+
92125 private String tryGetValue (JSONObject jsonObject , String key ) {
93126 try {
94127 return jsonObject .getString (key );
@@ -107,7 +140,9 @@ private JSONObject readFetchReleaseInputStream(InputStream in)
107140 latestRelease = json .getJSONArray ("releases" ).getJSONObject (0 );
108141 } catch (JSONException e ) {
109142 throw new FirebaseAppDistributionException (
110- e .getMessage (), FirebaseAppDistributionException .Status .UNKNOWN );
143+ Constants .ErrorMessages .JSON_PARSING_ERROR ,
144+ FirebaseAppDistributionException .Status .UNKNOWN ,
145+ e );
111146 }
112147 return latestRelease ;
113148 }
@@ -120,7 +155,7 @@ HttpsURLConnection openHttpsUrlConnection(String appId, String fid)
120155 httpsURLConnection = (HttpsURLConnection ) url .openConnection ();
121156 } catch (IOException e ) {
122157 throw new FirebaseAppDistributionException (
123- e . getMessage (), FirebaseAppDistributionException . Status . NETWORK_FAILURE );
158+ Constants . ErrorMessages . NETWORK_ERROR , NETWORK_FAILURE , e );
124159 }
125160 return httpsURLConnection ;
126161 }
@@ -131,7 +166,9 @@ private URL getReleasesEndpointUrl(String appId, String fid)
131166 return new URL (String .format (RELEASE_ENDPOINT_URL_FORMAT , appId , fid ));
132167 } catch (MalformedURLException e ) {
133168 throw new FirebaseAppDistributionException (
134- e .getMessage (), FirebaseAppDistributionException .Status .UNKNOWN );
169+ Constants .ErrorMessages .UNKNOWN_ERROR ,
170+ FirebaseAppDistributionException .Status .UNKNOWN ,
171+ e );
135172 }
136173 }
137174
0 commit comments