Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,42 @@

package com.linecorp.armeria.server.grpc;

import java.util.List;
import java.util.Objects;
import java.util.Set;

import com.google.api.HttpRule;
import com.google.common.base.MoreObjects;

final class DefaultHttpJsonTranscodingOptions implements HttpJsonTranscodingOptions {

static final HttpJsonTranscodingOptions DEFAULT = HttpJsonTranscodingOptions.builder().build();

private final boolean useHttpAnnotations;
private final List<HttpRule> additionalHttpRules;
private final Set<HttpJsonTranscodingQueryParamMatchRule> queryParamMatchRules;
private final UnframedGrpcErrorHandler errorHandler;

DefaultHttpJsonTranscodingOptions(Set<HttpJsonTranscodingQueryParamMatchRule> queryParamMatchRules,
DefaultHttpJsonTranscodingOptions(boolean useHttpAnnotations,
List<HttpRule> additionalHttpRules,
Set<HttpJsonTranscodingQueryParamMatchRule> queryParamMatchRules,
UnframedGrpcErrorHandler errorHandler) {
this.useHttpAnnotations = useHttpAnnotations;
this.additionalHttpRules = additionalHttpRules;
this.queryParamMatchRules = queryParamMatchRules;
this.errorHandler = errorHandler;
}

@Override
public boolean useHttpAnnotations() {
return useHttpAnnotations;
}

@Override
public List<HttpRule> additionalHttpRules() {
return additionalHttpRules;
}

@Override
public Set<HttpJsonTranscodingQueryParamMatchRule> queryParamMatchRules() {
return queryParamMatchRules;
Expand All @@ -53,18 +71,22 @@ public boolean equals(Object o) {
return false;
}
final HttpJsonTranscodingOptions that = (HttpJsonTranscodingOptions) o;
return queryParamMatchRules.equals(that.queryParamMatchRules()) &&
return useHttpAnnotations == that.useHttpAnnotations() &&
additionalHttpRules.equals(that.additionalHttpRules()) &&
queryParamMatchRules.equals(that.queryParamMatchRules()) &&
errorHandler.equals(that.errorHandler());
}

@Override
public int hashCode() {
return Objects.hash(queryParamMatchRules, errorHandler);
return Objects.hash(useHttpAnnotations, additionalHttpRules, queryParamMatchRules, errorHandler);
}

@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("useHttpAnnotations", useHttpAnnotations)
.add("additionalHttpRules", additionalHttpRules)
.add("queryParamMatchRules", queryParamMatchRules)
.add("errorHandler", errorHandler)
.toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1070,16 +1070,14 @@ public GrpcService build() {
final HttpJsonTranscodingOptions httpJsonTranscodingOptions;
if (httpJsonTranscodingErrorHandler != null) {
httpJsonTranscodingOptions =
HttpJsonTranscodingOptions
.builder()
.queryParamMatchRules(
this.httpJsonTranscodingOptions.queryParamMatchRules())
new HttpJsonTranscodingOptionsBuilder(this.httpJsonTranscodingOptions)
.errorHandler(httpJsonTranscodingErrorHandler)
.build();
} else {
httpJsonTranscodingOptions = this.httpJsonTranscodingOptions;
}
grpcService = HttpJsonTranscodingService.of(grpcService, httpJsonTranscodingOptions);
grpcService = HttpJsonTranscodingServiceBuilder.of(grpcService, httpJsonTranscodingOptions)
.build();
}
if (handlerRegistry.containsDecorators()) {
grpcService = new GrpcDecoratingService(grpcService, handlerRegistry);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@

package com.linecorp.armeria.server.grpc;

import java.util.List;
import java.util.Set;

import com.google.api.HttpRule;
import com.google.protobuf.Message;

import com.linecorp.armeria.common.annotation.UnstableApi;
Expand All @@ -42,6 +44,21 @@ static HttpJsonTranscodingOptions of() {
return DefaultHttpJsonTranscodingOptions.DEFAULT;
}

/**
* Returns whether to extract and register HTTP/JSON transcoding rules from {@code google.api.http}
* annotations in proto descriptors. When {@code true}, methods with {@code google.api.http} options
* are automatically registered as HTTP/JSON endpoints according to their annotation specifications.
* This option is enabled by default.
*/
boolean useHttpAnnotations();

/**
* Returns additional HTTP/JSON transcoding rules that supplement annotation-based rules. These rules
* allow programmatic configuration of HTTP/JSON transcoding without modifying proto files. The rules are
* processed regardless of the {@link #useHttpAnnotations()} setting. Returns an empty list by default.
*/
List<HttpRule> additionalHttpRules();

/**
* Returns the {@link HttpJsonTranscodingQueryParamMatchRule}s which is used to match fields in a
* {@link Message} with query parameters.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@
import static java.util.Objects.requireNonNull;

import java.util.EnumSet;
import java.util.List;
import java.util.Set;

import com.google.api.HttpRule;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
Expand All @@ -46,13 +48,27 @@ public final class HttpJsonTranscodingOptionsBuilder {
private static final EnumSet<HttpJsonTranscodingQueryParamMatchRule> DEFAULT_QUERY_PARAM_MATCH_RULES =
EnumSet.of(JSON_NAME, ORIGINAL_FIELD);

private final ImmutableList.Builder<HttpRule> additionalHttpRules = ImmutableList.builder();

private boolean useHttpAnnotations = true;

private UnframedGrpcErrorHandler errorHandler = UnframedGrpcErrorHandler.ofJson();

@Nullable
private Set<HttpJsonTranscodingQueryParamMatchRule> queryParamMatchRules;

HttpJsonTranscodingOptionsBuilder() {}

/**
* A copy constructor.
*/
HttpJsonTranscodingOptionsBuilder(HttpJsonTranscodingOptions options) {
useHttpAnnotations(options.useHttpAnnotations());
additionalHttpRules(options.additionalHttpRules());
queryParamMatchRules(options.queryParamMatchRules());
errorHandler(options.errorHandler());
}

/**
* Adds the specified {@link HttpJsonTranscodingQueryParamMatchRule} which is used
* to match {@link QueryParams} of an {@link HttpRequest} with fields in a {@link Message}.
Expand Down Expand Up @@ -81,6 +97,38 @@ public HttpJsonTranscodingOptionsBuilder queryParamMatchRules(
return this;
}

/**
* Sets whether to extract and register HTTP/JSON transcoding rules from {@code google.api.http}
* annotations in proto descriptors. When {@code true}, methods with {@code google.api.http} options
* are automatically registered as HTTP/JSON endpoints according to their annotation specifications.
* This option is enabled by default.
*/
public HttpJsonTranscodingOptionsBuilder useHttpAnnotations(boolean useHttpAnnotations) {
this.useHttpAnnotations = useHttpAnnotations;
return this;
}

/**
* Adds additional HTTP/JSON transcoding rules that supplement annotation-based rules. These rules
* allow programmatic configuration of HTTP/JSON transcoding without modifying proto files. The rules are
* processed regardless of the {@link #useHttpAnnotations(boolean)} setting.
*/
public HttpJsonTranscodingOptionsBuilder additionalHttpRules(HttpRule... rules) {
requireNonNull(rules, "rules");
return additionalHttpRules(ImmutableList.copyOf(rules));
}

/**
* Adds additional HTTP/JSON transcoding rules that supplement annotation-based rules. These rules
* allow programmatic configuration of HTTP/JSON transcoding without modifying proto files. The rules are
* processed regardless of the {@link #useHttpAnnotations(boolean)} setting.
*/
public HttpJsonTranscodingOptionsBuilder additionalHttpRules(Iterable<HttpRule> rules) {
requireNonNull(rules, "rules");
additionalHttpRules.addAll(rules);
return this;
}

/**
* Sets an error handler which handles an exception raised while serving a gRPC request transcoded from
* an HTTP/JSON request. By default, {@link UnframedGrpcErrorHandler#ofJson()} would be set.
Expand All @@ -96,6 +144,7 @@ public HttpJsonTranscodingOptionsBuilder errorHandler(UnframedGrpcErrorHandler e
* Returns a newly created {@link HttpJsonTranscodingOptions}.
*/
public HttpJsonTranscodingOptions build() {
final List<HttpRule> rules = additionalHttpRules.build();
final Set<HttpJsonTranscodingQueryParamMatchRule> matchRules;
if (queryParamMatchRules == null) {
matchRules = DEFAULT_QUERY_PARAM_MATCH_RULES;
Expand All @@ -112,6 +161,6 @@ public HttpJsonTranscodingOptions build() {
matchRules = ImmutableSet.copyOf(queryParamMatchRules);
}
}
return new DefaultHttpJsonTranscodingOptions(matchRules, errorHandler);
return new DefaultHttpJsonTranscodingOptions(useHttpAnnotations, rules, matchRules, errorHandler);
}
}
Loading
Loading