Skip to content

Commit 8a4defe

Browse files
committed
add return value for handled responses
1 parent 7f9f665 commit 8a4defe

File tree

3 files changed

+98
-30
lines changed

3 files changed

+98
-30
lines changed

core/src/main/java/com/amplitude/core/utilities/FileResponseHandler.kt

+19-13
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class FileResponseHandler(
3131
successResponse: SuccessResponse,
3232
events: Any,
3333
eventsString: String,
34-
) {
34+
): Boolean {
3535
val eventFilePath = events as String
3636
logger?.debug("Handle response, status: ${successResponse.status}")
3737
val eventsList: List<BaseEvent>
@@ -46,13 +46,14 @@ class FileResponseHandler(
4646
scope.launch(dispatcher) {
4747
storage.removeFile(eventFilePath)
4848
}
49+
return true
4950
}
5051

5152
override fun handleBadRequestResponse(
5253
badRequestResponse: BadRequestResponse,
5354
events: Any,
54-
eventsString: String,
55-
) {
55+
eventsString: String
56+
): Boolean {
5657
logger?.debug(
5758
"Handle response, status: ${badRequestResponse.status}, error: ${badRequestResponse.error}"
5859
)
@@ -68,7 +69,7 @@ class FileResponseHandler(
6869
if (eventsList.size == 1 || badRequestResponse.isInvalidApiKeyResponse()) {
6970
triggerEventsCallback(eventsList, HttpStatus.BAD_REQUEST.code, badRequestResponse.error)
7071
storage.removeFile(eventFilePath)
71-
return
72+
return true
7273
}
7374
val droppedIndices = badRequestResponse.getEventIndicesToDrop()
7475
val eventsToDrop = mutableListOf<BaseEvent>()
@@ -87,13 +88,14 @@ class FileResponseHandler(
8788
scope.launch(dispatcher) {
8889
storage.removeFile(eventFilePath)
8990
}
91+
return true
9092
}
9193

9294
override fun handlePayloadTooLargeResponse(
9395
payloadTooLargeResponse: PayloadTooLargeResponse,
9496
events: Any,
95-
eventsString: String,
96-
) {
97+
eventsString: String
98+
): Boolean {
9799
logger?.debug(
98100
"Handle response, status: ${payloadTooLargeResponse.status}, error: ${payloadTooLargeResponse.error}"
99101
)
@@ -114,47 +116,51 @@ class FileResponseHandler(
114116
scope.launch(dispatcher) {
115117
storage.removeFile(eventFilePath)
116118
}
117-
return
119+
return true
118120
}
119121
// split file into two
120122
scope.launch(dispatcher) {
121123
storage.splitEventFile(eventFilePath, rawEvents)
122124
}
125+
return true
123126
}
124127

125128
override fun handleTooManyRequestsResponse(
126129
tooManyRequestsResponse: TooManyRequestsResponse,
127130
events: Any,
128-
eventsString: String,
129-
) {
131+
eventsString: String
132+
): Boolean {
130133
logger?.debug(
131134
"Handle response, status: ${tooManyRequestsResponse.status}, error: ${tooManyRequestsResponse.error}"
132135
)
133136
// trigger exponential backoff
134137
storage.releaseFile(events as String)
138+
return false
135139
}
136140

137141
override fun handleTimeoutResponse(
138142
timeoutResponse: TimeoutResponse,
139143
events: Any,
140-
eventsString: String,
141-
) {
144+
eventsString: String
145+
): Boolean {
142146
logger?.debug("Handle response, status: ${timeoutResponse.status}")
143147
// trigger exponential backoff
144148
storage.releaseFile(events as String)
149+
return false
145150
}
146151

147152
override fun handleFailedResponse(
148153
failedResponse: FailedResponse,
149154
events: Any,
150-
eventsString: String,
151-
) {
155+
eventsString: String
156+
): Boolean {
152157
logger?.debug(
153158
"Handle response, status: ${failedResponse.status}, error: ${failedResponse.error}"
154159
)
155160
// wait for next time to try again
156161
// trigger exponential backoff
157162
storage.releaseFile(events as String)
163+
return false
158164
}
159165

160166
private fun triggerEventsCallback(

core/src/main/java/com/amplitude/core/utilities/InMemoryResponseHandler.kt

+44-9
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,29 @@ internal class InMemoryResponseHandler(
2727
const val BACK_OFF: Long = 30000
2828
}
2929

30-
override fun handleSuccessResponse(successResponse: SuccessResponse, events: Any, eventsString: String) {
31-
triggerEventsCallback(events as List<BaseEvent>, HttpStatus.SUCCESS.code, "Event sent success.")
30+
override fun handleSuccessResponse(
31+
successResponse: SuccessResponse,
32+
events: Any,
33+
eventsString: String
34+
): Boolean {
35+
triggerEventsCallback(
36+
events as List<BaseEvent>,
37+
HttpStatus.SUCCESS.code,
38+
"Event sent success."
39+
)
40+
41+
return true
3242
}
3343

34-
override fun handleBadRequestResponse(badRequestResponse: BadRequestResponse, events: Any, eventsString: String) {
44+
override fun handleBadRequestResponse(
45+
badRequestResponse: BadRequestResponse,
46+
events: Any,
47+
eventsString: String
48+
): Boolean {
3549
val eventsList = events as List<BaseEvent>
3650
if (eventsList.size == 1 || badRequestResponse.isInvalidApiKeyResponse()) {
3751
triggerEventsCallback(eventsList, HttpStatus.BAD_REQUEST.code, badRequestResponse.error)
38-
return
52+
return true
3953
}
4054
val droppedIndices = badRequestResponse.getEventIndicesToDrop()
4155
val eventsToDrop = mutableListOf<BaseEvent>()
@@ -51,21 +65,31 @@ internal class InMemoryResponseHandler(
5165
eventsToRetry.forEach {
5266
eventPipeline.put(it)
5367
}
68+
return true
5469
}
5570

56-
override fun handlePayloadTooLargeResponse(payloadTooLargeResponse: PayloadTooLargeResponse, events: Any, eventsString: String) {
71+
override fun handlePayloadTooLargeResponse(
72+
payloadTooLargeResponse: PayloadTooLargeResponse,
73+
events: Any,
74+
eventsString: String
75+
): Boolean {
5776
val eventsList = events as List<BaseEvent>
5877
if (eventsList.size == 1) {
5978
triggerEventsCallback(eventsList, HttpStatus.PAYLOAD_TOO_LARGE.code, payloadTooLargeResponse.error)
60-
return
79+
return true
6180
}
6281
eventPipeline.flushSizeDivider.incrementAndGet()
6382
eventsList.forEach {
6483
eventPipeline.put(it)
6584
}
85+
return true
6686
}
6787

68-
override fun handleTooManyRequestsResponse(tooManyRequestsResponse: TooManyRequestsResponse, events: Any, eventsString: String) {
88+
override fun handleTooManyRequestsResponse(
89+
tooManyRequestsResponse: TooManyRequestsResponse,
90+
events: Any,
91+
eventsString: String
92+
): Boolean {
6993
val eventsList = events as List<BaseEvent>
7094
val eventsToDrop = mutableListOf<BaseEvent>()
7195
val eventsToRetryNow = mutableListOf<BaseEvent>()
@@ -89,19 +113,29 @@ internal class InMemoryResponseHandler(
89113
eventPipeline.put(it)
90114
}
91115
}
116+
return false
92117
}
93118

94-
override fun handleTimeoutResponse(timeoutResponse: TimeoutResponse, events: Any, eventsString: String) {
119+
override fun handleTimeoutResponse(
120+
timeoutResponse: TimeoutResponse,
121+
events: Any,
122+
eventsString: String
123+
): Boolean {
95124
val eventsList = events as List<BaseEvent>
96125
scope.launch(dispatcher) {
97126
delay(BACK_OFF)
98127
eventsList.forEach {
99128
eventPipeline.put(it)
100129
}
101130
}
131+
return false
102132
}
103133

104-
override fun handleFailedResponse(failedResponse: FailedResponse, events: Any, eventsString: String) {
134+
override fun handleFailedResponse(
135+
failedResponse: FailedResponse,
136+
events: Any,
137+
eventsString: String
138+
): Boolean {
105139
val eventsList = events as List<BaseEvent>
106140
val eventsToDrop = mutableListOf<BaseEvent>()
107141
val eventsToRetry = mutableListOf<BaseEvent>()
@@ -116,6 +150,7 @@ internal class InMemoryResponseHandler(
116150
eventsToRetry.forEach {
117151
eventPipeline.put(it)
118152
}
153+
return false
119154
}
120155

121156
private fun triggerEventsCallback(events: List<BaseEvent>, status: Int, message: String) {

core/src/main/java/com/amplitude/core/utilities/http/AnalyticsResponse.kt

+35-8
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,18 @@ class FailedResponse(response: JSONObject) : AnalyticsResponse {
149149
val error: String = response.getStringWithDefault("error", "")
150150
}
151151

152+
/**
153+
* Handle different types of responses from the server after an upload.
154+
*
155+
* The response is considered handled if:
156+
* - we have finished the handling of the response
157+
* - we have successfully recovered from the response (e.g. removed the offending bad event file, split the event file that is too large)
158+
*
159+
* @return true if response was handled or we have successfully recovered, false otherwise
160+
*/
152161
interface ResponseHandler {
153-
fun handle(response: AnalyticsResponse, events: Any, eventsString: String) {
154-
when (response) {
162+
fun handle(response: AnalyticsResponse, events: Any, eventsString: String): Boolean {
163+
return when (response) {
155164
is SuccessResponse ->
156165
handleSuccessResponse(response, events, eventsString)
157166

@@ -172,39 +181,57 @@ interface ResponseHandler {
172181
}
173182
}
174183

184+
/**
185+
* Handle a [HttpStatus.SUCCESS] response.
186+
*/
175187
fun handleSuccessResponse(
176188
successResponse: SuccessResponse,
177189
events: Any,
178190
eventsString: String
179-
)
191+
) : Boolean
180192

193+
/**
194+
* Handle a [HttpStatus.BAD_REQUEST] response.
195+
*/
181196
fun handleBadRequestResponse(
182197
badRequestResponse: BadRequestResponse,
183198
events: Any,
184199
eventsString: String
185-
)
200+
) : Boolean
186201

202+
/**
203+
* Handle a [HttpStatus.PAYLOAD_TOO_LARGE] response.
204+
*/
187205
fun handlePayloadTooLargeResponse(
188206
payloadTooLargeResponse: PayloadTooLargeResponse,
189207
events: Any,
190208
eventsString: String
191-
)
209+
) : Boolean
192210

211+
/**
212+
* Handle a [HttpStatus.TOO_MANY_REQUESTS] response.
213+
*/
193214
fun handleTooManyRequestsResponse(
194215
tooManyRequestsResponse: TooManyRequestsResponse,
195216
events: Any,
196217
eventsString: String
197-
)
218+
) : Boolean
198219

220+
/**
221+
* Handle a [HttpStatus.TIMEOUT] response.
222+
*/
199223
fun handleTimeoutResponse(
200224
timeoutResponse: TimeoutResponse,
201225
events: Any,
202226
eventsString: String
203-
)
227+
) : Boolean
204228

229+
/**
230+
* Handle a [HttpStatus.FAILED] response.
231+
*/
205232
fun handleFailedResponse(
206233
failedResponse: FailedResponse,
207234
events: Any,
208235
eventsString: String
209-
)
236+
) : Boolean
210237
}

0 commit comments

Comments
 (0)