/** * Sets the keep alive header as per: * - https://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Connection */ private void addKeepAliveHeaders(HttpRequest req, HttpHeaders headers) { if (protocol == H1 || protocol == H1C) { headers.set(HttpHeaderNames.CONNECTION, "keep-alive"); } else { // Do not add the 'connection' header for HTTP/2 responses. // See https://tools.ietf.org/html/rfc7540#section-8.1.2.2 } }
private void fail(int id, HttpResponseStatus status) { discarding = true; req = null; final HttpData data = HttpData.ofUtf8(status.toString()); final com.linecorp.armeria.common.HttpHeaders headers = com.linecorp.armeria.common.HttpHeaders.of(status.code()); headers.set(HttpHeaderNames.CONNECTION, "close"); headers.setObject(HttpHeaderNames.CONTENT_TYPE, MediaType.PLAIN_TEXT_UTF_8); headers.setInt(HttpHeaderNames.CONTENT_LENGTH, data.length()); writer.writeHeaders(id, 1, headers, false); writer.writeData(id, 1, data, true).addListener(ChannelFutureListener.CLOSE); }
private static HttpHeaders fillAdditionalHeaders(HttpHeaders headers, HttpHeaders additionalHeaders) { if (!additionalHeaders.isEmpty()) { if (headers.isImmutable()) { // All headers are already validated. final HttpHeaders temp = headers; headers = new DefaultHttpHeaders(false, temp.size() + additionalHeaders.size()); headers.set(temp); } headers.setAllIfAbsent(additionalHeaders); } return headers; }
void setCorsAllowHeaders(HttpHeaders headers) { if (allowedRequestHeaders.isEmpty()) { return; } headers.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_HEADERS, joinedAllowedRequestHeaders); }
void setCorsExposeHeaders(HttpHeaders headers) { if (exposedHeaders.isEmpty()) { return; } headers.set(HttpHeaderNames.ACCESS_CONTROL_EXPOSE_HEADERS, joinedExposedHeaders); }
@Override public void setAdditionalRequestHeader(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalHeadersIfAbsent().set(name, value); }
@Override public void setAdditionalResponseHeaders(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalHeadersIfAbsent().set(headers); }
@Override public void setAdditionalResponseTrailer(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalTrailersIfAbsent().set(name, value); }
@Override public void setAdditionalResponseTrailers(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalTrailersIfAbsent().set(headers); }
@Override public void setAdditionalRequestHeaders(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalHeadersIfAbsent().set(headers); }
void setCorsAllowCredentials(HttpHeaders headers) { // The string "*" cannot be used for a resource that supports credentials. // https://www.w3.org/TR/cors/#resource-requests if (credentialsAllowed && !ANY_ORIGIN.equals(headers.get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN))) { headers.set(HttpHeaderNames.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); } }
@Override public void setAdditionalResponseHeader(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalHeadersIfAbsent().set(name, value); }
/** * NB: For now we redirect all methods. */ @Override public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { return HttpResponse.of(HttpHeaders.of(httpStatus) .set(HttpHeaderNames.LOCATION, locationFunction.apply(ctx))); }
@Nullable private HttpHeaders readHeaders(@Nullable HttpFileAttributes attrs) throws IOException { if (attrs == null) { return null; } // TODO(trustin): Cache the headers (sans the 'date' header') if attrs did not change. final String etag = generateEntityTag(attrs); final HttpHeaders headers = HttpHeaders.of(HttpStatus.OK); headers.set(HttpHeaderNames.CONTENT_LENGTH, Long.toString(attrs.length())); return addCommonHeaders(headers, attrs, etag); }
private void prepareHeaders(HttpHeaders headers, Compressor compressor) { if (compressor != Identity.NONE) { headers.set(GrpcHeaderNames.GRPC_ENCODING, compressor.getMessageEncoding()); } if (!advertisedEncodingsHeader.isEmpty()) { headers.add(GrpcHeaderNames.GRPC_ACCEPT_ENCODING, advertisedEncodingsHeader); } headers.add(GrpcHeaderNames.GRPC_TIMEOUT, TimeoutHeaderUtil.toHeaderValue( TimeUnit.MILLISECONDS.toNanos(ctx.responseTimeoutMillis()))); }
@Override protected void applyHeaders() { // Copy the HTTP headers which were specified by a user to the Armeria request. getHeaders().forEach((name, values) -> headers.set(HttpHeaderNames.of(name), values)); setDefaultRequestHeaders(headers); }
private void handleOptions(ChannelHandlerContext ctx, DecodedHttpRequest req) { respond(ctx, req, AggregatedHttpMessage.of( HttpHeaders.of(HttpStatus.OK) .set(HttpHeaderNames.ALLOW, ALLOWED_METHODS_STRING)), newEarlyRespondingRequestContext(ctx, req, req.path(), null), null); }
private void redirect(ChannelHandlerContext ctx, DecodedHttpRequest req, PathAndQuery pathAndQuery, String location) { respond(ctx, req, AggregatedHttpMessage.of( HttpHeaders.of(HttpStatus.TEMPORARY_REDIRECT) .set(HttpHeaderNames.LOCATION, location)), newEarlyRespondingRequestContext(ctx, req, pathAndQuery.path(), pathAndQuery.query()), null); }
@Test public void unframed_grpcEncoding() throws Exception { final HttpClient client = HttpClient.of(server.httpUri("/")); final AggregatedHttpMessage response = client.execute( HttpHeaders.of(HttpMethod.POST, UnitTestServiceGrpc.getStaticUnaryCallMethod().getFullMethodName()) .set(HttpHeaderNames.CONTENT_TYPE, "application/protobuf") .set(GrpcHeaderNames.GRPC_ENCODING, "gzip"), REQUEST_MESSAGE.toByteArray()).aggregate().get(); assertThat(response.status()).isEqualTo(HttpStatus.UNSUPPORTED_MEDIA_TYPE); assertNoRpcContent(); }
@Test public void unframed_streamingApi() throws Exception { final HttpClient client = HttpClient.of(server.httpUri("/")); final AggregatedHttpMessage response = client.execute( HttpHeaders.of(HttpMethod.POST, UnitTestServiceGrpc.getStaticStreamedOutputCallMethod().getFullMethodName()) .set(HttpHeaderNames.CONTENT_TYPE, "application/protobuf"), StreamingOutputCallRequest.getDefaultInstance().toByteArray()).aggregate().get(); assertThat(response.status()).isEqualTo(HttpStatus.BAD_REQUEST); assertNoRpcContent(); }