/** * Returns new empty HTTP headers. */ static HttpHeaders of() { return new DefaultHttpHeaders(); }
/** * Returns new HTTP response headers. */ static HttpHeaders of(HttpStatus status) { return new DefaultHttpHeaders().status(status); }
/** * Returns new HTTP headers with a single entry. */ static HttpHeaders of(AsciiString name, String value) { return new DefaultHttpHeaders().add(name, value); }
/** * Returns new HTTP request headers. */ static HttpHeaders of(HttpMethod method, String path) { return new DefaultHttpHeaders().method(method).path(path); }
@Override protected void configure(ServerBuilder sb) { sb.service("/trailers", ((ctx, req) -> { HttpResponseWriter writer = HttpResponse.streaming(); HttpHeaders headers = HttpHeaders.of(HttpStatus.OK); assertThat(headers.isEndOfStream()).isFalse(); HttpHeaders trailers = new DefaultHttpHeaders(true, 1, true) .set(HttpHeaderNames.of("armeria-message"), "error"); assertThat(trailers.isEndOfStream()).isTrue(); writer.write(headers); writer.write(trailers); writer.close(); return writer; })); sb.service("/trailers-only", ((ctx, req) -> { HttpResponseWriter writer = HttpResponse.streaming(); HttpHeaders trailers = new DefaultHttpHeaders(true, 1, true) .status(HttpStatus.OK) .set(HttpHeaderNames.of("armeria-message"), "error"); assertThat(trailers.isEndOfStream()).isTrue(); writer.write(trailers); writer.close(); return writer; })); sb.decorator(LoggingService.newDecorator()); } };
return withContextCustomizer(ctx -> { final HttpHeaders additionalHeaders = ctx.additionalRequestHeaders(); final DefaultHttpHeaders headers = new DefaultHttpHeaders(); if (!additionalHeaders.isEmpty()) { headers.set(additionalHeaders);
@Override public HttpHeaders authority(String authority) { requireNonNull(authority, "authority"); set(HttpHeaderNames.AUTHORITY, authority); return this; }
@Override public String toString() { final int size = size(); if (size == 0) { return "[]"; } final StringBuilder buf = new StringBuilder(size() * 16).append('['); String separator = ""; for (AsciiString name : names()) { final List<String> values = getAll(name); for (int i = 0; i < values.size(); ++i) { buf.append(separator); buf.append(name).append('=').append(values.get(i)); } separator = ", "; } return buf.append(']').toString(); }
@Override public String scheme() { return get(HttpHeaderNames.SCHEME); }
@Override public HttpHeaders scheme(String scheme) { requireNonNull(scheme, "scheme"); set(HttpHeaderNames.SCHEME, scheme); return this; }
@Override public String authority() { return get(HttpHeaderNames.AUTHORITY); }
private HttpHeaders createAdditionalHeadersIfAbsent() { final HttpHeaders additionalRequestHeaders = this.additionalRequestHeaders; if (additionalRequestHeaders == null) { return this.additionalRequestHeaders = new DefaultHttpHeaders(); } else { return additionalRequestHeaders; } }
/** * Returns new HTTP headers with two entries. */ static HttpHeaders of(AsciiString name1, String value1, AsciiString name2, String value2) { return new DefaultHttpHeaders().add(name1, value1).add(name2, value2); }
static HttpHeaders statusToTrailers(ServiceRequestContext ctx, Status status, boolean headersSent) { final HttpHeaders trailers; if (headersSent) { // Normal trailers. trailers = new DefaultHttpHeaders(); } else { // Trailers only response trailers = new DefaultHttpHeaders(true, 3, true) .status(HttpStatus.OK) .set(HttpHeaderNames.CONTENT_TYPE, "application/grpc+proto"); } trailers.add(GrpcHeaderNames.GRPC_STATUS, Integer.toString(status.getCode().value())); if (status.getDescription() != null) { trailers.add(GrpcHeaderNames.GRPC_MESSAGE, StatusMessageEscaper.escape(status.getDescription())); } if (ctx.server().config().verboseResponses() && status.getCause() != null) { final ThrowableProto proto = GrpcStatus.serializeThrowable(status.getCause()); trailers.add(GrpcHeaderNames.ARMERIA_GRPC_THROWABLEPROTO_BIN, Base64.getEncoder().encodeToString(proto.toByteArray())); } return trailers; }
@Override public HttpHeaders path(String path) { requireNonNull(path, "path"); set(HttpHeaderNames.PATH, path); return this; }
@Override public String path() { return get(HttpHeaderNames.PATH); }
private HttpHeaders createAdditionalTrailersIfAbsent() { final HttpHeaders additionalResponseTrailers = this.additionalResponseTrailers; if (additionalResponseTrailers == null) { final HttpHeaders newTrailers = new DefaultHttpHeaders(); if (additionalResponseTrailersUpdater.compareAndSet(this, null, newTrailers)) { return newTrailers; } else { final HttpHeaders additionalResponseTrailersSetByOtherThread = this.additionalResponseTrailers; assert additionalResponseTrailersSetByOtherThread != null; return additionalResponseTrailersSetByOtherThread; } } else { return additionalResponseTrailers; } }
private static HttpHeaders filterHttpHeaders(HttpHeaders headers) { requireNonNull(headers, "headers"); for (AsciiString name : BLACKLISTED_HEADER_NAMES) { if (headers.contains(name)) { throw new IllegalArgumentException("unallowed header name: " + name); } } return new DefaultHttpHeaders().add(headers).asImmutable(); }
static HttpHeaders statusToTrailers(ServiceRequestContext ctx, Status status, boolean headersSent) { final HttpHeaders trailers; if (headersSent) { // Normal trailers. trailers = new DefaultHttpHeaders(); } else { // Trailers only response trailers = new DefaultHttpHeaders(true, 3, true) .status(HttpStatus.OK) .set(HttpHeaderNames.CONTENT_TYPE, "application/grpc+proto"); } trailers.add(GrpcHeaderNames.GRPC_STATUS, Integer.toString(status.getCode().value())); if (status.getDescription() != null) { trailers.add(GrpcHeaderNames.GRPC_MESSAGE, StatusMessageEscaper.escape(status.getDescription())); } if (ctx.server().config().verboseResponses() && status.getCause() != null) { final ThrowableProto proto = GrpcStatus.serializeThrowable(status.getCause()); trailers.add(GrpcHeaderNames.ARMERIA_GRPC_THROWABLEPROTO_BIN, Base64.getEncoder().encodeToString(proto.toByteArray())); } return trailers; }
@Override public HttpHeaders method(HttpMethod method) { requireNonNull(method, "method"); this.method = method; set(HttpHeaderNames.METHOD, method.name()); return this; }