Skip to content

Commit 5fef92f

Browse files
authored
Merge pull request #486 from kazuki-ma/kazuki-ma/cleanServlet
NON-ISSUE Move LineSignatureValidator and delete line-bot-servlet dependency.
2 parents 4f390d0 + f1a7975 commit 5fef92f

File tree

11 files changed

+58
-36
lines changed

11 files changed

+58
-36
lines changed

line-bot-api-client/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ check.dependsOn integrationTest
4242

4343
dependencies {
4444
api project(':line-bot-model')
45-
implementation project(':line-bot-parser') // TODO: Can we remove it? (By moving LineSignatureValidator)
4645
implementation 'org.slf4j:slf4j-api'
47-
4846
implementation 'com.squareup.okhttp3:logging-interceptor'
4947
implementation 'com.squareup.retrofit2:converter-jackson'
5048
implementation 'com.squareup.retrofit2:retrofit'
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* under the License.
1515
*/
1616

17-
package com.linecorp.bot.client;
17+
package com.linecorp.bot.parser;
1818

1919
import java.security.InvalidKeyException;
2020
import java.security.MessageDigest;
@@ -24,8 +24,6 @@
2424
import javax.crypto.Mac;
2525
import javax.crypto.spec.SecretKeySpec;
2626

27-
import com.linecorp.bot.parser.SignatureValidator;
28-
2927
import lombok.NonNull;
3028

3129
/**
@@ -47,7 +45,6 @@ public LineSignatureValidator(byte[] channelSecret) {
4745
*
4846
* @param content Body of the http request in byte array.
4947
* @param headerSignature Signature value from `X-LINE-Signature` HTTP header
50-
*
5148
* @return True if headerSignature matches signature of the content. False otherwise.
5249
*/
5350
@Override
@@ -61,7 +58,6 @@ public boolean validateSignature(@NonNull byte[] content, @NonNull String header
6158
* Generate signature value.
6259
*
6360
* @param content Body of the http request.
64-
*
6561
* @return generated signature value.
6662
*/
6763
public byte[] generateSignature(@NonNull byte[] content) {

line-bot-parser/src/main/java/com/linecorp/bot/parser/WebhookParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
@Slf4j
3131
public class WebhookParser {
32+
public static final String SIGNATURE_HEADER_NAME = "X-Line-Signature";
33+
3234
private final ObjectMapper objectMapper = ModelObjectMapper.createNewObjectMapper();
3335
private final SignatureValidator signatureValidator;
3436

@@ -46,9 +48,7 @@ public WebhookParser(@NonNull SignatureValidator signatureValidator) {
4648
*
4749
* @param signature X-Line-Signature header.
4850
* @param payload Request body.
49-
*
5051
* @return Parsed result. If there's an error, this method sends response.
51-
*
5252
* @throws WebhookParseException There's an error around signature.
5353
*/
5454
public CallbackRequest handle(String signature, byte[] payload) throws IOException, WebhookParseException {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* under the License.
1515
*/
1616

17-
package com.linecorp.bot.client;
17+
package com.linecorp.bot.parser;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020

line-bot-servlet/src/main/java/com/linecorp/bot/servlet/LineBotCallbackException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
public class LineBotCallbackException extends Exception {
2020
private static final long serialVersionUID = -950894346433317253L;
2121

22-
public LineBotCallbackException(String message) {
23-
super(message);
22+
public LineBotCallbackException(String message, Exception e) {
23+
super(message, e);
2424
}
2525
}

line-bot-servlet/src/main/java/com/linecorp/bot/servlet/LineBotCallbackRequestParser.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,21 @@
2323

2424
import com.google.common.io.ByteStreams;
2525

26-
import com.linecorp.bot.client.LineSignatureValidator;
2726
import com.linecorp.bot.model.event.CallbackRequest;
27+
import com.linecorp.bot.parser.LineSignatureValidator;
2828
import com.linecorp.bot.parser.WebhookParseException;
2929
import com.linecorp.bot.parser.WebhookParser;
3030

3131
import lombok.NonNull;
3232
import lombok.extern.slf4j.Slf4j;
3333

34+
/**
35+
* Parser of webhook from LINE's messaging server.
36+
*
37+
* <p>This is a thin wrapper of {@link WebhookParser}.
38+
*
39+
* @see WebhookParser
40+
*/
3441
@Slf4j
3542
public class LineBotCallbackRequestParser {
3643
private final WebhookParser parser;
@@ -48,19 +55,17 @@ public LineBotCallbackRequestParser(@NonNull LineSignatureValidator lineSignatur
4855
* Parses a request.
4956
*
5057
* @param req HTTP servlet request.
51-
*
5258
* @return Parsed result. If there's an error, this method sends response.
53-
*
5459
* @throws LineBotCallbackException There's an error around signature.
5560
*/
5661
public CallbackRequest handle(HttpServletRequest req) throws LineBotCallbackException, IOException {
5762
// validate signature
58-
final String signature = req.getHeader("X-Line-Signature");
63+
final String signature = req.getHeader(WebhookParser.SIGNATURE_HEADER_NAME);
5964
final byte[] json = ByteStreams.toByteArray(req.getInputStream());
6065
try {
6166
return parser.handle(signature, json);
6267
} catch (WebhookParseException e) {
63-
throw new LineBotCallbackException(e.getMessage());
68+
throw new LineBotCallbackException(e.getMessage(), e);
6469
}
6570
}
6671

@@ -69,9 +74,7 @@ public CallbackRequest handle(HttpServletRequest req) throws LineBotCallbackExce
6974
*
7075
* @param signature X-Line-Signature header.
7176
* @param payload Request body.
72-
*
7377
* @return Parsed result. If there's an error, this method sends response.
74-
*
7578
* @throws LineBotCallbackException There's an error around signature.
7679
* @deprecated Use {@link WebhookParser#handle(String, byte[])} instead.
7780
*/
@@ -81,7 +84,7 @@ public CallbackRequest handle(String signature, String payload)
8184
try {
8285
return parser.handle(signature, payload.getBytes(StandardCharsets.UTF_8));
8386
} catch (WebhookParseException e) {
84-
throw new LineBotCallbackException(e.getMessage());
87+
throw new LineBotCallbackException(e.getMessage(), e);
8588
}
8689
}
8790

line-bot-servlet/src/test/java/com/linecorp/bot/servlet/LineBotCallbackRequestParserTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@
3535

3636
import com.google.common.io.ByteStreams;
3737

38-
import com.linecorp.bot.client.LineSignatureValidator;
3938
import com.linecorp.bot.model.event.CallbackRequest;
4039
import com.linecorp.bot.model.event.Event;
4140
import com.linecorp.bot.model.event.MessageEvent;
4241
import com.linecorp.bot.model.event.message.TextMessageContent;
42+
import com.linecorp.bot.parser.LineSignatureValidator;
4343

4444
public class LineBotCallbackRequestParserTest {
4545
@Rule

line-bot-spring-boot/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
dependencies {
1818
api project(':line-bot-api-client')
1919
api project(':line-bot-model')
20-
implementation project(':line-bot-servlet')
20+
implementation project(':line-bot-parser')
2121
implementation 'org.springframework.boot:spring-boot-autoconfigure'
2222
implementation 'org.springframework.boot:spring-boot-starter-web'
2323
implementation 'com.google.guava:guava'

line-bot-spring-boot/src/main/java/com/linecorp/bot/spring/boot/LineBotWebMvcBeans.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
import org.springframework.context.annotation.Import;
2525
import org.springframework.stereotype.Component;
2626

27-
import com.linecorp.bot.client.LineSignatureValidator;
28-
import com.linecorp.bot.servlet.LineBotCallbackRequestParser;
27+
import com.linecorp.bot.parser.LineSignatureValidator;
28+
import com.linecorp.bot.parser.WebhookParser;
2929
import com.linecorp.bot.spring.boot.interceptor.LineBotServerInterceptor;
3030
import com.linecorp.bot.spring.boot.support.LineBotServerArgumentProcessor;
3131

@@ -46,11 +46,11 @@ public LineSignatureValidator lineSignatureValidator() {
4646
}
4747

4848
/**
49-
* Expose {@link LineBotCallbackRequestParser} as {@link Bean}.
49+
* Expose {@link WebhookParser} as {@link Bean}.
5050
*/
5151
@Bean
52-
public LineBotCallbackRequestParser lineBotCallbackRequestParser(
52+
public WebhookParser lineBotCallbackRequestParser(
5353
LineSignatureValidator lineSignatureValidator) {
54-
return new LineBotCallbackRequestParser(lineSignatureValidator);
54+
return new WebhookParser(lineSignatureValidator);
5555
}
5656
}

line-bot-spring-boot/src/main/java/com/linecorp/bot/spring/boot/interceptor/LineBotServerInterceptor.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,25 @@
2525
import org.springframework.core.MethodParameter;
2626
import org.springframework.http.HttpStatus;
2727
import org.springframework.stereotype.Component;
28+
import org.springframework.util.StreamUtils;
2829
import org.springframework.web.method.HandlerMethod;
2930
import org.springframework.web.servlet.HandlerInterceptor;
3031
import org.springframework.web.servlet.ModelAndView;
3132

3233
import com.linecorp.bot.model.event.CallbackRequest;
33-
import com.linecorp.bot.servlet.LineBotCallbackException;
34-
import com.linecorp.bot.servlet.LineBotCallbackRequestParser;
34+
import com.linecorp.bot.parser.WebhookParseException;
35+
import com.linecorp.bot.parser.WebhookParser;
3536
import com.linecorp.bot.spring.boot.annotation.LineBotMessages;
3637
import com.linecorp.bot.spring.boot.support.LineBotServerArgumentProcessor;
3738

39+
import lombok.AllArgsConstructor;
3840
import lombok.extern.slf4j.Slf4j;
3941

4042
@Component
4143
@Slf4j
44+
@AllArgsConstructor(onConstructor = @__(@Autowired))
4245
public class LineBotServerInterceptor implements HandlerInterceptor {
43-
@Autowired
44-
private LineBotCallbackRequestParser lineBotCallbackRequestParser;
46+
private final WebhookParser webhookParser;
4547

4648
@Override
4749
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
@@ -58,10 +60,12 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
5860
continue;
5961
}
6062
try {
61-
final CallbackRequest callbackRequest = lineBotCallbackRequestParser.handle(request);
63+
final String signatureHeader = request.getHeader(WebhookParser.SIGNATURE_HEADER_NAME);
64+
final byte[] payload = StreamUtils.copyToByteArray(request.getInputStream());
65+
final CallbackRequest callbackRequest = webhookParser.handle(signatureHeader, payload);
6266
LineBotServerArgumentProcessor.setValue(request, callbackRequest);
6367
return true;
64-
} catch (LineBotCallbackException e) {
68+
} catch (WebhookParseException e) {
6569
log.info("LINE Bot callback exception: {}", e.getMessage());
6670
response.sendError(HttpStatus.BAD_REQUEST.value());
6771
try (PrintWriter writer = response.getWriter()) {

0 commit comments

Comments
 (0)