Skip to content

Commit e72e82c

Browse files
authored
Update how a request handler method is identified (#1058)
- Stop relying on handler method name - Leverage placedOnRequestHandler and placedOnStreamHandler instead
1 parent 596cdac commit e72e82c

File tree

6 files changed

+46
-41
lines changed

6 files changed

+46
-41
lines changed

powertools-core/src/main/java/software/amazon/lambda/powertools/core/internal/LambdaHandlerProcessor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ private LambdaHandlerProcessor() {
3737
}
3838

3939
public static boolean isHandlerMethod(final ProceedingJoinPoint pjp) {
40-
return "handleRequest".equals(pjp.getSignature().getName()) ||
41-
// https://docs.aws.amazon.com/codeguru/latest/profiler-ug/lambda-custom.html
42-
"requestHandler".equals(pjp.getSignature().getName());
40+
return placedOnRequestHandler(pjp) || placedOnStreamHandler(pjp);
4341
}
4442

4543
public static boolean placedOnRequestHandler(final ProceedingJoinPoint pjp) {
Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,66 @@
11
package software.amazon.lambda.powertools.core.internal;
22

3+
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
36
import org.aspectj.lang.ProceedingJoinPoint;
47
import org.aspectj.lang.Signature;
58
import org.junit.jupiter.api.Test;
69

10+
import java.io.InputStream;
11+
import java.io.OutputStream;
12+
713
import static org.assertj.core.api.Assertions.assertThat;
814
import static org.mockito.Mockito.mock;
915
import static org.mockito.Mockito.when;
1016

1117
class LambdaHandlerProcessorTest {
1218

1319
@Test
14-
void shouldTreatProfilerHandlerMethodAsValid() {
15-
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
16-
Signature signature = mock(Signature.class);
17-
when(signature.getName()).thenReturn("requestHandler");
18-
when(pjpMock.getSignature()).thenReturn(signature);
20+
void isHandlerMethod_shouldRecognizeRequestHandler() {
21+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp();
1922

20-
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock))
21-
.isTrue();
23+
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock)).isTrue();
2224
}
2325

2426
@Test
25-
void shouldTreatDefaultHandlerMethodAsValid() {
26-
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
27-
Signature signature = mock(Signature.class);
28-
when(signature.getName()).thenReturn("handleRequest");
29-
when(pjpMock.getSignature()).thenReturn(signature);
27+
void isHandlerMethod_shouldRecognizeRequestStreamHandler() {
28+
ProceedingJoinPoint pjpMock = mockRequestStreamHandlerPjp();
3029

31-
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock))
32-
.isTrue();
30+
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock)).isTrue();
3331
}
3432

3533
@Test
36-
void shouldNotTreatOtherMethodNamesAsValidHandlerMethod() {
37-
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
34+
void placedOnRequestHandler_shouldRecognizeRequestHandler() {
35+
ProceedingJoinPoint pjpMock = mockRequestHandlerPjp();
36+
37+
assertThat(LambdaHandlerProcessor.placedOnRequestHandler(pjpMock)).isTrue();
38+
}
39+
40+
@Test
41+
void placedOnStreamHandler_shouldRecognizeRequestStreamHandler() {
42+
ProceedingJoinPoint pjpMock = mockRequestStreamHandlerPjp();
43+
44+
assertThat(LambdaHandlerProcessor.placedOnStreamHandler(pjpMock)).isTrue();
45+
}
46+
47+
private static ProceedingJoinPoint mockRequestHandlerPjp() {
3848
Signature signature = mock(Signature.class);
39-
when(signature.getName()).thenReturn("handleRequestInvalid");
49+
when(signature.getDeclaringType()).thenReturn(RequestHandler.class);
50+
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
51+
Object[] args = {new Object(), mock(Context.class)};
52+
when(pjpMock.getArgs()).thenReturn(args);
4053
when(pjpMock.getSignature()).thenReturn(signature);
54+
return pjpMock;
55+
}
4156

42-
assertThat(LambdaHandlerProcessor.isHandlerMethod(pjpMock))
43-
.isFalse();
57+
private static ProceedingJoinPoint mockRequestStreamHandlerPjp() {
58+
Signature signature = mock(Signature.class);
59+
when(signature.getDeclaringType()).thenReturn(RequestStreamHandler.class);
60+
ProceedingJoinPoint pjpMock = mock(ProceedingJoinPoint.class);
61+
Object[] args = {mock(InputStream.class), mock(OutputStream.class), mock(Context.class)};
62+
when(pjpMock.getArgs()).thenReturn(args);
63+
when(pjpMock.getSignature()).thenReturn(signature);
64+
return pjpMock;
4465
}
4566
}

powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/internal/IdempotentAspect.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import java.lang.annotation.Annotation;
3131
import java.lang.reflect.Method;
3232

33-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
3433
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler;
3534

3635
/**
@@ -58,7 +57,7 @@ public Object around(ProceedingJoinPoint pjp,
5857
throw new IdempotencyConfigurationException("The annotated method doesn't return anything. Unable to perform idempotency on void return type");
5958
}
6059

61-
boolean isHandler = (isHandlerMethod(pjp) && placedOnRequestHandler(pjp));
60+
boolean isHandler = placedOnRequestHandler(pjp);
6261
JsonNode payload = getPayload(pjp, method, isHandler);
6362
if (payload == null) {
6463
throw new IdempotencyConfigurationException("Unable to get payload from the method. Ensure there is at least one parameter or that you use @IdempotencyKey");

powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspect.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.extractContext;
2323
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isColdStart;
2424
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
25-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler;
26-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnStreamHandler;
2725
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.serviceName;
2826
import static software.amazon.lambda.powertools.metrics.MetricsUtils.hasDefaultDimension;
2927
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
@@ -44,9 +42,7 @@ public Object around(ProceedingJoinPoint pjp,
4442
Metrics metrics) throws Throwable {
4543
Object[] proceedArgs = pjp.getArgs();
4644

47-
if (isHandlerMethod(pjp)
48-
&& (placedOnRequestHandler(pjp)
49-
|| placedOnStreamHandler(pjp))) {
45+
if (isHandlerMethod(pjp)) {
5046

5147
MetricsLogger logger = metricsLogger();
5248

powertools-tracing/src/main/java/software/amazon/lambda/powertools/tracing/internal/LambdaTracingAspect.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isColdStart;
2727
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
2828
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isSamLocal;
29-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler;
30-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnStreamHandler;
3129
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.serviceName;
3230
import static software.amazon.lambda.powertools.tracing.TracingUtils.objectMapper;
3331

@@ -48,7 +46,7 @@ public Object around(ProceedingJoinPoint pjp,
4846
() -> "## " + pjp.getSignature().getName()));
4947
segment.setNamespace(namespace(tracing));
5048

51-
if (placedOnHandlerMethod(pjp)) {
49+
if (isHandlerMethod(pjp)) {
5250
segment.putAnnotation("ColdStart", isColdStart());
5351
segment.putAnnotation("Service", namespace(tracing));
5452
}
@@ -62,7 +60,7 @@ public Object around(ProceedingJoinPoint pjp,
6260
segment.putMetadata(namespace(tracing), pjp.getSignature().getName() + " response", null != objectMapper() ? objectMapper().writeValueAsString(methodReturn): methodReturn);
6361
}
6462

65-
if (placedOnHandlerMethod(pjp)) {
63+
if (isHandlerMethod(pjp)) {
6664
coldStartDone();
6765
}
6866

@@ -116,11 +114,6 @@ private String namespace(Tracing powerToolsTracing) {
116114
return powerToolsTracing.namespace().isEmpty() ? serviceName() : powerToolsTracing.namespace();
117115
}
118116

119-
private boolean placedOnHandlerMethod(ProceedingJoinPoint pjp) {
120-
return isHandlerMethod(pjp)
121-
&& (placedOnRequestHandler(pjp) || placedOnStreamHandler(pjp));
122-
}
123-
124117
private boolean environmentVariable(String key) {
125118
return Boolean.parseBoolean(SystemWrapper.getenv(key));
126119
}

powertools-validation/src/main/java/software/amazon/lambda/powertools/validation/internal/ValidationAspect.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
import static com.networknt.schema.SpecVersion.VersionFlag.V201909;
2828
import static java.nio.charset.StandardCharsets.UTF_8;
29-
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
3029
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler;
3130
import static software.amazon.lambda.powertools.utilities.jmespath.Base64Function.decode;
3231
import static software.amazon.lambda.powertools.utilities.jmespath.Base64GZipFunction.decompress;
@@ -55,8 +54,7 @@ public Object around(ProceedingJoinPoint pjp,
5554
ValidationConfig.get().setSchemaVersion(validation.schemaVersion());
5655
}
5756

58-
if (isHandlerMethod(pjp)
59-
&& placedOnRequestHandler(pjp)) {
57+
if (placedOnRequestHandler(pjp)) {
6058
validationNeeded = true;
6159

6260
if (!validation.inboundSchema().isEmpty()) {

0 commit comments

Comments
 (0)