[ST06.2] Read http body for PUT or POST http request
Currently, the test http server will respond whenever
http request is read, no matter how much data was declared
in the Content-Length header. For tests that uses POST
request to test uplink traffic this is not good enough.
Invoke parseBody to read data from input stream to make
sure the http body is read.
Test: atest android.net.NetworkStatsIntegrationTest \
--rerun-until-failure 100
Bug: 139774492
Change-Id: I1b71f3e55747d104e4a8796611517d93f178321f
diff --git a/staticlibs/testutils/devicetests/com/android/testutils/TestHttpServer.kt b/staticlibs/testutils/devicetests/com/android/testutils/TestHttpServer.kt
index 39ce487..740bf63 100644
--- a/staticlibs/testutils/devicetests/com/android/testutils/TestHttpServer.kt
+++ b/staticlibs/testutils/devicetests/com/android/testutils/TestHttpServer.kt
@@ -19,6 +19,7 @@
import android.net.Uri
import com.android.net.module.util.ArrayTrackRecord
import fi.iki.elonen.NanoHTTPD
+import java.io.IOException
/**
* A minimal HTTP server running on a random available port.
@@ -82,7 +83,23 @@
val request = Request(session.uri
?: "", session.method, session.queryParameterString ?: "")
requestsRecord.add(request)
+
+ // For PUT and POST, call parseBody to read InputStream before responding.
+ if (Method.PUT == session.method || Method.POST == session.method) {
+ try {
+ session.parseBody(HashMap())
+ } catch (e: Exception) {
+ when (e) {
+ is IOException, is ResponseException -> e.toResponse()
+ else -> throw e
+ }
+ }
+ }
+
// Default response is a 404
return responses[request] ?: super.serve(session)
}
-}
\ No newline at end of file
+
+ fun Exception.toResponse() =
+ newFixedLengthResponse(Response.Status.INTERNAL_ERROR, "text/plain", this.toString())
+}