Skip to content

Commit 6960cbf

Browse files
committed
refactor code and fix body payloads not being sent
1 parent f18a446 commit 6960cbf

File tree

8 files changed

+22
-70
lines changed

8 files changed

+22
-70
lines changed

examples/src/main/java/com/example/demo/DemoApplication.java

-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.springframework.boot.SpringApplication;
55
import org.springframework.boot.autoconfigure.SpringBootApplication;
66
import org.springframework.web.bind.annotation.GetMapping;
7-
import org.springframework.web.bind.annotation.PostMapping;
87
import org.springframework.web.bind.annotation.RestController;
98

109
import java.time.Clock;
@@ -24,9 +23,4 @@ public static void main(String[] args) {
2423
public String hello() {
2524
return String.format("Hello %s, utc: %s!", LocalDateTime.now(), ZonedDateTime.now(Clock.systemUTC()));
2625
}
27-
28-
@PostMapping("/hello")
29-
public String helloPOST() {
30-
return String.format("Zaihan Hello %s, utc: %s!", LocalDateTime.now(), ZonedDateTime.now(Clock.systemUTC()));
31-
}
3226
}

src/main/kotlin/io/firetail/logging/core/FiretailLogger.kt

+1-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import io.firetail.logging.spring.FiretailConfig
44
import io.firetail.logging.servlet.SpringRequestWrapper
55
import io.firetail.logging.servlet.SpringResponseWrapper
66
import org.slf4j.LoggerFactory
7-
import java.nio.charset.Charset
87

98
class FiretailLogger (val firetailConfig: FiretailConfig) {
109
fun logRequest(wrappedRequest: SpringRequestWrapper) =
@@ -34,10 +33,8 @@ class FiretailLogger (val firetailConfig: FiretailConfig) {
3433
status: Int = wrappedResponse.status,
3534
duration: Long,
3635
) {
37-
val charset: Charset = Charsets.UTF_8
38-
3936
LOGGER.info(
40-
"${FiretailTemplate.logResponsePrefix} ms: $duration, status: $status, headers: ${wrappedResponse.allHeaders}, body: ${String(wrappedResponse.contentAsByteArray, charset)}",
37+
"${FiretailTemplate.logResponsePrefix} ms: $duration, status: $status, headers: ${wrappedResponse.allHeaders}",
4138
)
4239
}
4340
companion object {

src/main/kotlin/io/firetail/logging/core/FiretailTemplate.kt

-2
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ class FiretailTemplate(private val firetailConfig: FiretailConfig, private val f
2929
setRequestProperty("CONTENT-TYPE", "application/nd-json")
3030
}
3131

32-
LOGGER.info("Payload: ${jsonBody}")
33-
3432
// Write the JSON body to the request
3533
val outputStream: OutputStream = connection.outputStream
3634
with(outputStream) {

src/main/kotlin/io/firetail/logging/servlet/FiretailFilter.kt

+11-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import org.springframework.web.method.HandlerMethod
2222
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
2323
import java.util.*
2424
import java.util.concurrent.CompletableFuture
25+
import java.nio.charset.Charset
2526

2627
@Service
2728
@ConditionalOnClass(FiretailConfig::class)
@@ -31,6 +32,7 @@ class FiretailFilter(
3132
private val firetailConfig: FiretailConfig,
3233
private val firetailMapper: FiretailMapper,
3334
) {
35+
3436
@Autowired
3537
private lateinit var firetailBuffer: FiretailBuffer
3638

@@ -58,19 +60,27 @@ class FiretailFilter(
5860
val startTime = System.currentTimeMillis()
5961
val wrappedRequest = SpringRequestWrapper(request)
6062
firetailLogger.logRequest(wrappedRequest)
61-
val wrappedResponse = SpringResponseWrapper(response)
63+
val wrappedResponse = SpringResponseWrapper(response)
6264
try {
6365
with(wrappedResponse) {
6466
setHeader(REQUEST_ID, firetailLogContext.get(REQUEST_ID))
6567
setHeader(CORRELATION_ID, firetailLogContext.get(CORRELATION_ID))
6668
}
69+
6770
chain.doFilter(wrappedRequest, wrappedResponse)
71+
72+
val charset: Charset = Charsets.UTF_8
73+
val responseArray: ByteArray = wrappedResponse.contentAsByteArray
74+
val responseBody: String = responseArray.toString(charset)
75+
wrappedResponse.copyBodyToResponse()
76+
6877
val duration = System.currentTimeMillis() - startTime
6978
firetailLogger.logResponse(wrappedResponse, duration = duration)
7079
val firetailLog =
7180
firetailMapper.from(
7281
wrappedRequest,
7382
wrappedResponse,
83+
responseBody,
7484
duration,
7585
)
7686
CompletableFuture.runAsync {

src/main/kotlin/io/firetail/logging/servlet/FiretailMapper.kt

+4-15
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,16 @@ import com.fasterxml.jackson.databind.ObjectMapper
44
import io.firetail.logging.core.FiretailData
55
import io.firetail.logging.core.FtRequest
66
import io.firetail.logging.core.FtResponse
7-
import io.firetail.logging.core.FiretailTemplate
87
import jakarta.servlet.http.HttpServletRequest
98
import jakarta.servlet.http.HttpServletResponse
10-
import io.firetail.logging.servlet.SpringResponseWrapper
119
import java.util.HashMap
1210
import java.io.StringWriter
1311
import java.io.InputStreamReader
14-
import org.slf4j.LoggerFactory
15-
import java.nio.charset.Charset
1612

1713
class FiretailMapper {
1814
private val objectMapper = ObjectMapper()
19-
fun from(request: HttpServletRequest, response: HttpServletResponse, executionTime: Long): FiretailData {
20-
return FiretailData(request = from(request), response = from(response), executionTime = executionTime.toInt())
15+
fun from(request: HttpServletRequest, response: HttpServletResponse, responseBody: String, executionTime: Long): FiretailData {
16+
return FiretailData(request = from(request), response = from(response, responseBody), executionTime = executionTime.toInt())
2117
}
2218

2319
fun from(request: HttpServletRequest): FtRequest {
@@ -40,17 +36,14 @@ class FiretailMapper {
4036
)
4137
}
4238

43-
fun from(response: HttpServletResponse): FtResponse {
39+
fun from(response: HttpServletResponse, body: String): FtResponse {
4440
val headers = response.headerNames
4541
.mapIndexed { _, value -> value to listOf(response.getHeader(value)) }
4642
.toMap()
47-
48-
val wrappedResponse = SpringResponseWrapper(response)
49-
val charset: Charset = Charsets.UTF_8
5043

5144
return FtResponse(
5245
statusCode = response.status,
53-
body = String(wrappedResponse.contentAsByteArray, charset),
46+
body = body,
5447
headers = headers,
5548
)
5649
}
@@ -63,8 +56,4 @@ class FiretailMapper {
6356
fun from(fireTailData: List<FiretailData>): String {
6457
return fireTailData.joinToString("\n") { objectMapper.writeValueAsString(it) }
6558
}
66-
67-
companion object {
68-
private val LOGGER = LoggerFactory.getLogger(FiretailTemplate::class.java)
69-
}
7059
}

src/main/kotlin/io/firetail/logging/servlet/SpringResponseWrapper.kt

+2-36
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,16 @@
11
package io.firetail.logging.servlet
22

33
import io.firetail.logging.core.Constants.Companion.empty
4-
import io.firetail.logging.core.FiretailTemplate
54
import jakarta.servlet.ServletOutputStream
65
import jakarta.servlet.http.HttpServletResponse
76
import jakarta.servlet.http.HttpServletResponseWrapper
87
import java.io.OutputStreamWriter
98
import java.io.PrintWriter
109
import java.util.function.Consumer
11-
import java.io.ByteArrayOutputStream
12-
import java.io.IOException
10+
import org.springframework.web.util.ContentCachingResponseWrapper
1311

14-
class SpringResponseWrapper(response: HttpServletResponse?) : HttpServletResponseWrapper(response) {
15-
private var outputStream: ServletOutputStream? = null
16-
private var writer: PrintWriter? = null
17-
private var copier: ServletOutputStreamWrapper? = null
12+
class SpringResponseWrapper(response: HttpServletResponse?) : ContentCachingResponseWrapper(response) {
1813

19-
override fun getOutputStream(): ServletOutputStream {
20-
check(writer == null) { "getWriter() has already been called on this response." }
21-
copier = ServletOutputStreamWrapper(response.outputStream)
22-
return copier!!
23-
}
24-
25-
override fun getWriter(): PrintWriter {
26-
check(outputStream == null) { "getOutputStream() has already been called on this response." }
27-
if (writer == null) {
28-
copier = ServletOutputStreamWrapper(response.outputStream)
29-
writer = PrintWriter(OutputStreamWriter(copier!!, response.characterEncoding), true)
30-
}
31-
return writer!!
32-
}
33-
34-
override fun flushBuffer() {
35-
if (writer != null) {
36-
writer!!.flush()
37-
} else if (outputStream != null) {
38-
copier!!.flush()
39-
}
40-
}
41-
42-
val contentAsByteArray: ByteArray
43-
get() = if (copier != null) {
44-
copier!!.getCopy()
45-
} else {
46-
empty
47-
}
4814
val allHeaders: Map<String, String>
4915
get() {
5016
val headers: MutableMap<String, String> = HashMap()

src/test/kotlin/io/firetail/logging/FiretailMapperTest.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ class FiretailMapperTest {
1616

1717
private val firetailMapper = FiretailMapper()
1818

19-
/*
2019
@Test
2120
fun fromResponse() {
2221
val mockResponse: HttpServletResponse = Mockito.mock(HttpServletResponse::class.java)
@@ -26,9 +25,9 @@ class FiretailMapperTest {
2625
Assertions.assertThat(result.headers)
2726
.isNotNull
2827
.hasFieldOrPropertyWithValue(TEST, listOf(TEST_RESULTS))
29-
}*/
28+
}
3029

31-
/*@Test
30+
@Test
3231
fun fromRequest() {
3332
val mockRequest: HttpServletRequest = Mockito.mock(HttpServletRequest::class.java)
3433

@@ -47,7 +46,7 @@ class FiretailMapperTest {
4746
Assertions.assertThat(result.headers)
4847
.isNotNull
4948
.hasFieldOrPropertyWithValue(TEST, listOf(TEST_RESULTS))
50-
}*/
49+
}
5150

5251
@Test
5352
fun jsonNd() {

src/test/kotlin/io/firetail/logging/RequestInterceptorTests.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class RequestInterceptorTests {
8585
assertThat(restTemplate.interceptors).isNotEmpty.contains(firetailHeaderInterceptor)
8686
}
8787

88-
/*
8988
@Test
9089
fun fireTailRequestLoggingAndResponse() {
9190
firetailMDC.clear()
@@ -112,7 +111,7 @@ class RequestInterceptorTests {
112111

113112
assertThat(firetailBuffer.size() == 1)
114113
assertThat(firetailBuffer.flush()).isEqualTo("success")
115-
} */
114+
}
116115

117116
// Emulates a general MVC controller for which we want to
118117
// assert Firetail calls have been made.

0 commit comments

Comments
 (0)