Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 1838855e authored by Ricki Hirner's avatar Ricki Hirner
Browse files

DAV exception: don't log too large request bodies

parent fe62f709
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import org.xmlpull.v1.XmlPullParserException
import java.io.ByteArrayOutputStream
import java.io.IOException
import java.io.Serializable
import java.lang.Long.min
import java.util.logging.Level

/**
@@ -79,13 +80,15 @@ open class DavException @JvmOverloads constructor(
                request = httpResponse.request.toString()

                httpResponse.request.body?.let { body ->
                    body.contentType()?.let {
                        if (isPlainText(it)) {
                    body.contentType()?.let { type ->
                        if (isPlainText(type)) {
                            val buffer = Buffer()
                            body.writeTo(buffer)

                            val baos = ByteArrayOutputStream()
                            buffer.writeTo(baos)
                            requestBody = baos.toString(it.charset(Charsets.UTF_8)!!.name())
                            buffer.writeTo(baos, min(buffer.size, MAX_EXCERPT_SIZE.toLong()))

                            requestBody = baos.toString(type.charset(Charsets.UTF_8)!!.name())
                        }
                    }
                }
+38 −4
Original line number Diff line number Diff line
@@ -10,7 +10,12 @@ import at.bitfire.dav4jvm.DavResource
import at.bitfire.dav4jvm.Property
import at.bitfire.dav4jvm.XmlUtils
import at.bitfire.dav4jvm.property.ResourceType
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Protocol
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
@@ -37,12 +42,41 @@ class DavExceptionTest {
    fun stopServer() = mockServer.shutdown()


    /**
     * Test truncation of a too large plain text request in [DavException].
     */
    @Test
    fun testRequestLargeTextError() {
        val url = sampleUrl()
        val dav = DavResource(httpClient, url)

        val builder = StringBuilder()
        builder.append(CharArray(DavException.MAX_EXCERPT_SIZE+100) { '*' })
        val body = builder.toString()

        val e = DavException("Error with large request body", null, Response.Builder()
            .request(Request.Builder()
                .url("http://example.com")
                .post(body.toRequestBody("text/plain".toMediaType()))
                .build())
            .protocol(Protocol.HTTP_1_1)
            .code(204)
            .message("No Content")
            .build())

        assertTrue(e.errors.isEmpty())
        assertEquals(
            body.substring(0, DavException.MAX_EXCERPT_SIZE),
            e.requestBody
        )
    }

    /**
     * Test a large HTML response which has a multi-octet UTF-8 character
     * exactly at the cut-off position.
     */
    @Test
    fun testLargeTextError() {
    fun testResponseLargeTextError() {
        val url = sampleUrl()
        val dav = DavResource(httpClient, url)

@@ -69,7 +103,7 @@ class DavExceptionTest {
    }

    @Test
    fun testNonTextError() {
    fun testResponseNonTextError() {
        val url = sampleUrl()
        val dav = DavResource(httpClient, url)