Loading src/main/kotlin/at/bitfire/dav4jvm/exception/DavException.kt +7 −4 Original line number Diff line number Diff line Loading @@ -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 /** Loading Loading @@ -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()) } } } Loading src/test/kotlin/at/bitfire/dav4jvm/exception/DavExceptionTest.kt +38 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading @@ -69,7 +103,7 @@ class DavExceptionTest { } @Test fun testNonTextError() { fun testResponseNonTextError() { val url = sampleUrl() val dav = DavResource(httpClient, url) Loading Loading
src/main/kotlin/at/bitfire/dav4jvm/exception/DavException.kt +7 −4 Original line number Diff line number Diff line Loading @@ -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 /** Loading Loading @@ -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()) } } } Loading
src/test/kotlin/at/bitfire/dav4jvm/exception/DavExceptionTest.kt +38 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) Loading @@ -69,7 +103,7 @@ class DavExceptionTest { } @Test fun testNonTextError() { fun testResponseNonTextError() { val url = sampleUrl() val dav = DavResource(httpClient, url) Loading