Skip to content
This repository was archived by the owner on Sep 22, 2022. It is now read-only.

Commit e2e0934

Browse files
committed
release 1.1.0:
- error code mapping - clean-ups
1 parent 493683c commit e2e0934

11 files changed

+244
-118
lines changed

README.md

+46-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ curl -X POST http://localhost:8888/__admin/mappings \
4040
```
4141

4242
3) Check
43-
```posh
43+
```json
4444
grpcurl -plaintext -d '{"id": 1, "currency": "EUR"}' localhost:50000 api.wallet.BalanceService/getUserBalance
4545
```
4646

@@ -65,6 +65,49 @@ Should get response:
6565

6666
Stubbing should be done via [WireMock JSON API](http://wiremock.org/docs/stubbing/)
6767

68+
### Error mapping
69+
70+
Default error (not `200 OK`) mapping is based on https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto :
71+
72+
| HTTP Status Code | GRPC Status |
73+
| ------------------------ |:-----------------:|
74+
| 400 Bad Request | INVALID_ARGUMENT |
75+
| 401 Unauthorized | UNAUTHENTICATED |
76+
| 403 Forbidden | PERMISSION_DENIED |
77+
| 404 Not Found | NOT_FOUND |
78+
| 409 Conflict | ALREADY_EXISTS |
79+
| 429 Too Many Requests | RESOURCE_EXHAUSTED|
80+
| 499 Client Closed Request| CANCELLED |
81+
| 500 Internal Server Error| INTERNAL |
82+
| 501 Not Implemented | UNIMPLEMENTED |
83+
| 503 Service Unavailable | UNAVAILABLE |
84+
| 504 Gateway Timeout | DEADLINE_EXCEEDED |
85+
86+
And could be overridden or augmented by overriding or augmenting the following properties:
87+
```yaml
88+
grpc:
89+
error-сode-by:
90+
http:
91+
status-code:
92+
400: INVALID_ARGUMENT
93+
401: UNAUTHENTICATED
94+
403: PERMISSION_DENIED
95+
404: NOT_FOUND
96+
409: ALREADY_EXISTS
97+
429: RESOURCE_EXHAUSTED
98+
499: CANCELLED
99+
500: INTERNAL
100+
501: UNIMPLEMENTED
101+
503: UNAVAILABLE
102+
504: DEADLINE_EXCEEDED
103+
```
104+
For example:
105+
```posh
106+
docker run \
107+
-e GRPC_ERROR-CODE-BY_HTTP_STATUS-CODE_400=OUT_OF_RANGE \
108+
-e GRPC_ERROR-CODE-BY_HTTP_STATUS-CODE_510=DATA_LOSS \
109+
adven27/grpc-wiremock
110+
```
68111
## How To:
69112

70113
#### 1. Change grpc server properties
@@ -94,7 +137,7 @@ See an [example](/example/Dockerfile)
94137

95138
Snappy support can be enabled using EXT_CODECS env variable as follows:
96139
```posh
97-
docker run -e EXT_CODECS=snappy adven27/grpc-wiremock
140+
docker run -e EXTERNAL_CODECS="snappy, another" adven27/grpc-wiremock
98141
```
99142
Also in docker-compose:
100143
```posh
@@ -105,7 +148,7 @@ Also in docker-compose:
105148
volumes:
106149
- ./example/proto:/proto
107150
environment:
108-
- EXT_CODECS=snappy
151+
- EXTERNAL_CODECS=snappy
109152
```
110153
<sub>*gzip compression supported by default</sub>
111154

build.gradle

+21-3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ clean {
3838
}
3939

4040
sourceSets.main.proto.srcDir '/proto'
41+
/*
42+
sourceSets {
43+
main {
44+
resources {
45+
srcDir 'example'
46+
}
47+
proto {
48+
srcDir 'example/proto'
49+
}
50+
}
51+
}
52+
*/
4153

4254
task generateJava(type: Copy) {
4355
def decorate_services = ""
@@ -77,11 +89,17 @@ task generateJava(type: Copy) {
7789
respTypes[method] = descriptor.responseType
7890
text = rest
7991
}
80-
decorate_services += callDecoratorTemplate.replace("@package@", pkg).replace("@serviceName@", serviceName)
81-
.replace("@fullServiceName@", fullServiceName).replace("@resp_types@", respTypes.collect { k, v -> "put(\"${k.toLowerCase()}\", $v);" }.join("\n"))
92+
decorate_services += callDecoratorTemplate
93+
.replace("@package@", pkg)
94+
.replace("@serviceName@", serviceName)
95+
.replace("@fullServiceName@", fullServiceName)
96+
.replace("@resp_types@", respTypes.collect { k, v -> "put(\"${k.toLowerCase()}\", $v);" }.join("\n"))
8297

8398
import_services += importServiceTemplate.replace("@package@", pkg).replace("@serviceName@", serviceName)
84-
services += serviceTemplate.replace("@package@", pkg).replace("@serviceName@", serviceName).replace("@fullServiceName@", fullServiceName)
99+
services += serviceTemplate
100+
.replace("@package@", pkg)
101+
.replace("@serviceName@", serviceName)
102+
.replace("@fullServiceName@", fullServiceName)
85103
}
86104
}
87105
from "src/template/java"

src/main/java/io/adven/grpc/wiremock/CodecRegistry.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@
44
import io.grpc.CompressorRegistry;
55
import io.grpc.DecompressorRegistry;
66
import org.springframework.beans.factory.annotation.Value;
7-
import org.springframework.context.annotation.PropertySource;
87
import org.springframework.stereotype.Component;
98

109
import java.util.List;
1110
import java.util.Map;
1211

1312
@Component
14-
@PropertySource("classpath:application.properties")
1513
public class CodecRegistry {
14+
private final List<String> externalCodecs;
15+
private final Map<String, Codec> codecs;
1616

17-
@Value("#{'${external.codecs}'.split(',')}")
18-
private List<String> externalCodecs;
19-
private Map<String, Codec> codecs;
20-
21-
public CodecRegistry(Map<String, Codec> codecs) {
17+
public CodecRegistry(
18+
@Value("${external.codecs:}") List<String> externalCodecs,
19+
Map<String, Codec> codecs
20+
) {
2221
this.codecs = codecs;
22+
this.externalCodecs = externalCodecs;
2323
}
2424

2525
public CompressorRegistry compressorRegistry() {

src/main/java/io/adven/grpc/wiremock/ExceptionHandler.java

+12-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.adven.grpc.wiremock;
22

3+
import io.adven.grpc.wiremock.properties.GrpcProperties;
34
import io.grpc.ForwardingServerCallListener;
45
import io.grpc.Metadata;
56
import io.grpc.ServerCall;
@@ -8,6 +9,11 @@
89
import io.grpc.Status;
910

1011
public class ExceptionHandler implements ServerInterceptor {
12+
private final GrpcProperties.ErrorCodeMapping errorCodeMapping;
13+
14+
public ExceptionHandler(GrpcProperties.ErrorCodeMapping errorCodeMapping) {
15+
this.errorCodeMapping = errorCodeMapping;
16+
}
1117

1218
@Override
1319
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
@@ -60,26 +66,12 @@ private void handleException(RuntimeException ex, ServerCall<ReqT, RespT> server
6066
serverCall.close(status, metadata);
6167
}
6268

63-
// Source: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
64-
private Status mapStatusCode(int statusCode)
65-
{
66-
switch(statusCode) {
67-
case 400: // Bad Request
68-
return Status.INVALID_ARGUMENT;
69-
case 401: // Unauthorized
70-
return Status.UNAUTHENTICATED;
71-
case 403: // Forbidden
72-
return Status.PERMISSION_DENIED;
73-
case 404: // Not Found
74-
return Status.NOT_FOUND;
75-
case 409: // Conflict
76-
return Status.ALREADY_EXISTS;
77-
case 429: // Too Many Requests
78-
return Status.RESOURCE_EXHAUSTED;
79-
case 500: // Internal Server Error
80-
default:
81-
return Status.INTERNAL;
82-
}
69+
private Status mapStatusCode(int statusCode) {
70+
return Status.fromCode(
71+
Status.Code.valueOf(
72+
errorCodeMapping.getHttp().getStatusCode().getOrDefault(statusCode, "INTERNAL").toUpperCase()
73+
)
74+
);
8375
}
8476
}
8577
}

src/main/java/io/adven/grpc/wiremock/GrpcWiremock.java

+31-26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.adven.grpc.wiremock;
22

3+
import io.adven.grpc.wiremock.properties.GrpcProperties;
4+
import io.adven.grpc.wiremock.properties.WiremockProperties;
35
import io.grpc.BindableService;
46
import io.grpc.Server;
57
import io.grpc.netty.NettyServerBuilder;
@@ -21,7 +23,7 @@
2123
import static java.util.stream.Collectors.joining;
2224

2325
@SpringBootApplication
24-
@EnableConfigurationProperties({ServerProperties.class, WiremockProperties.class})
26+
@EnableConfigurationProperties({GrpcProperties.class, WiremockProperties.class})
2527
public class GrpcWiremock implements CommandLineRunner {
2628
private static final Logger LOG = LoggerFactory.getLogger(GrpcWiremock.class);
2729
private final GrpcServer server;
@@ -37,22 +39,22 @@ public void run(String... args) throws Exception {
3739

3840
@Service
3941
public static class GrpcServer {
40-
private final ServerProperties serverProperties;
42+
private final GrpcProperties grpcProperties;
4143
private final List<BindableService> services;
4244
private Server server;
43-
private CodecRegistry codecRegistry;
45+
private final CodecRegistry codecRegistry;
4446
private final CountDownLatch latch;
4547

46-
public GrpcServer(ServerProperties serverProperties, CodecRegistry codecRegistry, List<BindableService> services) {
47-
this.serverProperties = serverProperties;
48+
public GrpcServer(GrpcProperties grpcProperties, CodecRegistry codecRegistry, List<BindableService> services) {
49+
this.grpcProperties = grpcProperties;
4850
this.codecRegistry = codecRegistry;
4951
this.services = services;
5052
this.latch = new CountDownLatch(1);
5153
}
5254

5355
public void start(int port) throws IOException {
5456
NettyServerBuilder builder = NettyServerBuilder.forPort(port)
55-
.intercept(new ExceptionHandler())
57+
.intercept(new ExceptionHandler(grpcProperties.getErrorCodeBy()))
5658
.compressorRegistry(codecRegistry.compressorRegistry())
5759
.decompressorRegistry(codecRegistry.decompressorRegistry())
5860
.addService(ProtoReflectionService.newInstance());
@@ -65,31 +67,34 @@ public void start(int port) throws IOException {
6567
}
6668

6769
private void setProperties(NettyServerBuilder builder) {
68-
if (serverProperties.getMaxHeaderListSize() != null) {
69-
int val = Math.toIntExact(serverProperties.getMaxHeaderListSize().toBytes());
70-
LOG.info("Set maxHeaderListSize = {}", val);
71-
builder.maxHeaderListSize(val);
72-
}
73-
if (serverProperties.getMaxMessageSize() != null) {
74-
int val = Math.toIntExact(serverProperties.getMaxMessageSize().toBytes());
75-
LOG.info("Set maxMessageSize = {}", val);
76-
builder.maxMessageSize(val);
77-
}
78-
if (serverProperties.getMaxInboundMetadataSize() != null) {
79-
int val = Math.toIntExact(serverProperties.getMaxInboundMetadataSize().toBytes());
80-
LOG.info("Set maxInboundMetadataSize = {}", val);
81-
builder.maxInboundMetadataSize(val);
82-
}
83-
if (serverProperties.getMaxInboundMessageSize() != null) {
84-
int val = Math.toIntExact(serverProperties.getMaxInboundMessageSize().toBytes());
85-
LOG.info("Set maxInboundMessageSize = {}", val);
86-
builder.maxInboundMessageSize(val);
70+
GrpcProperties.ServerProperties server = grpcProperties.getServer();
71+
if (server != null) {
72+
if (server.getMaxHeaderListSize() != null) {
73+
int val = Math.toIntExact(server.getMaxHeaderListSize().toBytes());
74+
LOG.info("Set maxHeaderListSize = {}", val);
75+
builder.maxHeaderListSize(val);
76+
}
77+
if (server.getMaxMessageSize() != null) {
78+
int val = Math.toIntExact(server.getMaxMessageSize().toBytes());
79+
LOG.info("Set maxMessageSize = {}", val);
80+
builder.maxMessageSize(val);
81+
}
82+
if (server.getMaxInboundMetadataSize() != null) {
83+
int val = Math.toIntExact(server.getMaxInboundMetadataSize().toBytes());
84+
LOG.info("Set maxInboundMetadataSize = {}", val);
85+
builder.maxInboundMetadataSize(val);
86+
}
87+
if (server.getMaxInboundMessageSize() != null) {
88+
int val = Math.toIntExact(server.getMaxInboundMessageSize().toBytes());
89+
LOG.info("Set maxInboundMessageSize = {}", val);
90+
builder.maxInboundMessageSize(val);
91+
}
8792
}
8893
}
8994

9095
private String summary(Server server) {
9196
return "Started " + server + "\nRegistered services:\n" +
92-
server.getServices().stream().map(s -> " * " + s.getServiceDescriptor().getName()).collect(joining("\n"));
97+
server.getServices().stream().map(s -> " * " + s.getServiceDescriptor().getName()).collect(joining("\n"));
9398
}
9499

95100
private void startDaemonAwaitThread() {

src/main/java/io/adven/grpc/wiremock/HttpMock.java

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.google.protobuf.Message;
1010
import com.google.protobuf.MessageOrBuilder;
1111
import com.google.protobuf.util.JsonFormat;
12+
import io.adven.grpc.wiremock.properties.WiremockProperties;
1213
import org.slf4j.Logger;
1314
import org.slf4j.LoggerFactory;
1415
import org.springframework.stereotype.Component;

src/main/java/io/adven/grpc/wiremock/ServerProperties.java

-37
This file was deleted.

0 commit comments

Comments
 (0)