use of io.aklivity.zilla.runtime.binding.http.internal.types.String16FW in project zilla by aklivity.
the class HttpServerFactory method decodeStartLine.
private DirectBuffer decodeStartLine(DirectBuffer buffer, int offset, int limit, HttpBeginExFW.Builder httpBeginEx, MutableBoolean hasAuthority, String16FW scheme) {
DirectBuffer error = null;
final CharSequence startLine = new AsciiSequenceView(buffer, offset, limit - offset);
if (startLine.length() >= maximumHeadersSize) {
error = ERROR_414_REQUEST_URI_TOO_LONG;
} else if (requestLine.reset(startLine).matches()) {
final String method = requestLine.group("method");
final String target = requestLine.group("target");
final String version = requestLine.group("version");
final URI targetURI = createTargetURI(target);
if (targetURI == null) {
error = ERROR_400_BAD_REQUEST;
} else if (!versionPart.reset(version).matches()) {
error = ERROR_505_VERSION_NOT_SUPPORTED;
} else if (targetURI.getUserInfo() != null) {
error = ERROR_400_BAD_REQUEST;
} else if (!SUPPORTED_METHODS.contains(method)) {
error = ERROR_501_METHOD_NOT_IMPLEMENTED;
} else {
final String path = targetURI.getRawPath();
final String authority = targetURI.getAuthority();
httpBeginEx.headersItem(h -> h.name(HEADER_SCHEME).value(scheme)).headersItem(h -> h.name(HEADER_METHOD).value(method)).headersItem(h -> h.name(HEADER_PATH).value(path));
if (authority != null) {
httpBeginEx.headersItem(h -> h.name(HEADER_AUTHORITY).value(authority));
hasAuthority.value = true;
}
}
} else {
error = ERROR_400_BAD_REQUEST;
}
return error;
}
use of io.aklivity.zilla.runtime.binding.http.internal.types.String16FW in project zilla by aklivity.
the class HttpClientFactory method newStream.
@Override
public MessageConsumer newStream(int msgTypeId, DirectBuffer buffer, int index, int length, MessageConsumer application) {
final BeginFW begin = beginRO.wrap(buffer, index, index + length);
final long routeId = begin.routeId();
final long authorization = begin.authorization();
final HttpBeginExFW beginEx = begin.extension().get(beginExRO::tryWrap);
final HttpBindingConfig binding = bindings.get(routeId);
HttpRouteConfig route = null;
if (binding != null) {
// TODO: avoid object creation
final Map<String, String> headers = beginEx != null ? asHeadersMap(beginEx.headers()) : EMPTY_HEADERS;
route = binding.resolve(authorization, headers::get);
}
MessageConsumer newStream = null;
if (route != null) {
final long resolvedId = route.id;
final Map<String8FW, String16FW> overrides = binding.options != null && binding.options.overrides != null ? binding.options.overrides : EMPTY_OVERRIDES;
final HttpClientPool clientPool = clientPools.computeIfAbsent(resolvedId, HttpClientPool::new);
newStream = clientPool.newStream(application, begin, overrides);
}
return newStream;
}
use of io.aklivity.zilla.runtime.binding.http.internal.types.String16FW in project zilla by aklivity.
the class HttpServerFactory method initHeaders.
private static Array32FW<HttpHeaderFW> initHeaders(HttpConfiguration config, String16FW status) {
final Array32FW.Builder<HttpHeaderFW.Builder, HttpHeaderFW> builder = new Array32FW.Builder<>(new HttpHeaderFW.Builder(), new HttpHeaderFW()).wrap(new UnsafeBuffer(new byte[64]), 0, 64).item(h -> h.name(HEADER_STATUS).value(status));
final String16FW server = config.serverHeader();
if (server != null) {
builder.item(h -> h.name(HEADER_SERVER).value(server));
}
return builder.build();
}
use of io.aklivity.zilla.runtime.binding.http.internal.types.String16FW in project zilla by aklivity.
the class HttpOptionsConfigAdapterTest method shouldReadOptions.
@Test
public void shouldReadOptions() {
String text = "{" + "\"versions\":" + "[" + "\"http/1.1\"," + "\"h2\"" + "]," + "\"access-control\":" + "{" + "\"policy\": \"cross-origin\"," + "\"allow\":" + "{" + "\"origins\": [ \"https://example.com:9090\" ]," + "\"methods\": [ \"DELETE\" ]," + "\"headers\": [ \"x-api-key\" ]," + "\"credentials\": true" + "}," + "\"max-age\": 10," + "\"expose\":" + "{" + "\"headers\": [ \"x-custom-header\" ]" + "}" + "}," + "\"overrides\":" + "{" + "\":authority\": \"example.com:443\"" + "}" + "}";
HttpOptionsConfig options = jsonb.fromJson(text, HttpOptionsConfig.class);
assertThat(options, not(nullValue()));
assertThat(options.versions, equalTo(EnumSet.allOf(HttpVersion.class)));
assertThat(options.access, not(nullValue()));
assertThat(options.access.allow, not(nullValue()));
assertThat(options.access.allow.origins, equalTo(singleton("https://example.com:9090")));
assertThat(options.access.allow.methods, equalTo(singleton("DELETE")));
assertThat(options.access.allow.headers, equalTo(singleton("x-api-key")));
assertTrue(options.access.allow.credentials);
assertThat(options.access.maxAge, equalTo(Duration.ofSeconds(10)));
assertThat(options.access.expose, not(nullValue()));
assertThat(options.access.expose.headers, equalTo(singleton("x-custom-header")));
assertThat(options.overrides, equalTo(singletonMap(new String8FW(":authority"), new String16FW("example.com:443"))));
}
use of io.aklivity.zilla.runtime.binding.http.internal.types.String16FW in project zilla by aklivity.
the class HttpOptionsConfigAdapter method adaptFromJson.
@Override
public OptionsConfig adaptFromJson(JsonObject object) {
JsonArray versions = object.containsKey(VERSIONS_NAME) ? object.getJsonArray(VERSIONS_NAME) : null;
SortedSet<HttpVersion> newVersions = null;
if (versions != null) {
SortedSet<HttpVersion> newVersions0 = new TreeSet<HttpVersion>();
versions.forEach(v -> newVersions0.add(HttpVersion.of(JsonString.class.cast(v).getString())));
newVersions = newVersions0;
}
HttpAccessControlConfig newAccess = null;
JsonObject access = object.containsKey(ACCESS_CONTROL_NAME) ? object.getJsonObject(ACCESS_CONTROL_NAME) : null;
if (access != null) {
String policy = access.containsKey(POLICY_NAME) ? access.getString(POLICY_NAME) : null;
switch(policy) {
case POLICY_VALUE_SAME_ORIGIN:
newAccess = new HttpAccessControlConfig(SAME_ORIGIN);
break;
case POLICY_VALUE_CROSS_ORIGIN:
JsonObject allow = access.containsKey(ALLOW_NAME) ? access.getJsonObject(ALLOW_NAME) : null;
HttpAllowConfig newAllow = null;
if (allow != null) {
JsonArray origins = allow.containsKey(ALLOW_ORIGINS_NAME) ? allow.getJsonArray(ALLOW_ORIGINS_NAME) : null;
Set<String> newOrigins = null;
if (origins != null) {
Set<String> newOrigins0 = new LinkedHashSet<>();
origins.forEach(v -> newOrigins0.add(JsonString.class.cast(v).getString()));
newOrigins = newOrigins0;
}
JsonArray methods = allow.containsKey(ALLOW_METHODS_NAME) ? allow.getJsonArray(ALLOW_METHODS_NAME) : null;
Set<String> newMethods = null;
if (methods != null) {
Set<String> newMethods0 = new LinkedHashSet<>();
methods.forEach(v -> newMethods0.add(JsonString.class.cast(v).getString()));
newMethods = newMethods0;
}
JsonArray headers = allow.containsKey(ALLOW_HEADERS_NAME) ? allow.getJsonArray(ALLOW_HEADERS_NAME) : null;
Set<String> newHeaders = null;
if (headers != null) {
Set<String> newHeaders0 = new LinkedHashSet<>();
headers.forEach(v -> newHeaders0.add(JsonString.class.cast(v).getString()));
newHeaders = newHeaders0;
}
boolean newCredentials = false;
if (allow.containsKey(ALLOW_CREDENTIALS_NAME)) {
newCredentials = allow.getBoolean(ALLOW_CREDENTIALS_NAME);
}
newAllow = new HttpAllowConfig(newOrigins, newMethods, newHeaders, newCredentials);
}
Duration newMaxAge = null;
JsonNumber maxAge = access.containsKey(MAX_AGE_NAME) ? access.getJsonNumber(MAX_AGE_NAME) : null;
if (maxAge != null) {
newMaxAge = Duration.ofSeconds(maxAge.longValue());
}
HttpExposeConfig newExpose = null;
JsonObject expose = access.containsKey(EXPOSE_NAME) ? access.getJsonObject(EXPOSE_NAME) : null;
if (expose != null) {
JsonArray headers = expose.containsKey(ALLOW_HEADERS_NAME) ? expose.getJsonArray(ALLOW_HEADERS_NAME) : null;
Set<String> newHeaders = null;
if (headers != null) {
Set<String> newHeaders0 = new LinkedHashSet<>();
headers.forEach(v -> newHeaders0.add(JsonString.class.cast(v).getString()));
newHeaders = newHeaders0;
}
newExpose = new HttpExposeConfig(newHeaders);
}
newAccess = new HttpAccessControlConfig(CROSS_ORIGIN, newAllow, newMaxAge, newExpose);
break;
}
}
JsonObject overrides = object.containsKey(OVERRIDES_NAME) ? object.getJsonObject(OVERRIDES_NAME) : null;
Map<String8FW, String16FW> newOverrides = null;
if (overrides != null) {
Map<String8FW, String16FW> newOverrides0 = new LinkedHashMap<>();
overrides.forEach((k, v) -> newOverrides0.put(new String8FW(k), new String16FW(JsonString.class.cast(v).getString())));
newOverrides = newOverrides0;
}
return new HttpOptionsConfig(newVersions, newOverrides, newAccess);
}
Aggregations