From b016096161e1d340eee7f4d46e0048c2c05fc083 Mon Sep 17 00:00:00 2001 From: aNNiMON Date: Sun, 10 Dec 2023 18:01:37 +0200 Subject: [PATCH] [server] Add Header constants --- docs/src/modules/server.yml | 28 +++++++++++++++++++ .../ownlang/modules/server/server.java | 3 +- .../com/annimon/ownlang/lib/ValueUtils.java | 16 +++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/docs/src/modules/server.yml b/docs/src/modules/server.yml index 4765253..d8f4a38 100644 --- a/docs/src/modules/server.yml +++ b/docs/src/modules/server.yml @@ -1,6 +1,34 @@ name: server since: 2.0.0 scope: desktop +constants: + - name: Header + type: 4 + typeName: map + value: '{ACCEPT=Accept, ACCEPT_CHARSET=Accept-Charset, ACCEPT_ENCODING=Accept-Encoding, + ACCEPT_LANGUAGE=Accept-Language, ACCEPT_RANGES=Accept-Ranges, ACCESS_CONTROL_ALLOW_CREDENTIALS=Access-Control-Allow-Credentials, + ACCESS_CONTROL_ALLOW_HEADERS=Access-Control-Allow-Headers, ACCESS_CONTROL_ALLOW_METHODS=Access-Control-Allow-Methods, + ACCESS_CONTROL_ALLOW_ORIGIN=Access-Control-Allow-Origin, ACCESS_CONTROL_EXPOSE_HEADERS=Access-Control-Expose-Headers, + ACCESS_CONTROL_MAX_AGE=Access-Control-Max-Age, ACCESS_CONTROL_REQUEST_HEADERS=Access-Control-Request-Headers, + ACCESS_CONTROL_REQUEST_METHOD=Access-Control-Request-Method, AGE=Age, ALLOW=Allow, + AUTHORIZATION=Authorization, CACHE_CONTROL=Cache-Control, CLEAR_SITE_DATA=Clear-Site-Data, + CONNECTION=Connection, CONTENT_DISPOSITION=Content-Disposition, CONTENT_ENCODING=Content-Encoding, + CONTENT_LANGUAGE=Content-Language, CONTENT_LENGTH=Content-Length, CONTENT_LOCATION=Content-Location, + CONTENT_RANGE=Content-Range, CONTENT_SECURITY_POLICY=Content-Security-Policy, + CONTENT_TYPE=Content-Type, COOKIE=Cookie, CROSS_ORIGIN_EMBEDDER_POLICY=Cross-Origin-Embedder-Policy, + CROSS_ORIGIN_OPENER_POLICY=Cross-Origin-Opener-Policy, CROSS_ORIGIN_RESOURCE_POLICY=Cross-Origin-Resource-Policy, + DATE=Date, ETAG=ETag, EXPECT=Expect, EXPIRES=Expires, FROM=From, HOST=Host, + IF_MATCH=If-Match, IF_MODIFIED_SINCE=If-Modified-Since, IF_NONE_MATCH=If-None-Match, + IF_RANGE=If-Range, IF_UNMODIFIED_SINCE=If-Unmodified-Since, LAST_MODIFIED=Last-Modified, + LINK=Link, LOCATION=Location, MAX_FORWARDS=Max-Forwards, ORIGIN=Origin, PRAGMA=Pragma, + PROXY_AUTHENTICATE=Proxy-Authenticate, PROXY_AUTHORIZATION=Proxy-Authorization, + RANGE=Range, REFERER=Referer, REFERRER_POLICY=Referrer-Policy, RETRY_AFTER=Retry-After, + SEC_WEBSOCKET_KEY=Sec-WebSocket-Key, SERVER=Server, SET_COOKIE=Set-Cookie, STRICT_TRANSPORT_SECURITY=Strict-Transport-Security, + TE=TE, TRAILER=Trailer, TRANSFER_ENCODING=Transfer-Encoding, UPGRADE=Upgrade, + USER_AGENT=User-Agent, VARY=Vary, VIA=Via, WARNING=Warning, WWW_AUTHENTICATE=WWW-Authenticate, + X_ACCEL_BUFFERING=X-Accel-Buffering, X_CONTENT_TYPE_OPTIONS=X-Content-Type-Options, + X_FORWARDED_FOR=X-Forwarded-For, X_FORWARDED_PROTO=X-Forwarded-Proto, X_FRAME_OPTIONS=X-Frame-Options, + X_HTTP_METHOD_OVERRIDE=X-HTTP-Method-Override, X_PERMITTED_CROSS_DOMAIN_POLICIES=X-Permitted-Cross-Domain-Policies}' functions: - name: newServer args: 'config = {}' diff --git a/modules/server/src/main/java/com/annimon/ownlang/modules/server/server.java b/modules/server/src/main/java/com/annimon/ownlang/modules/server/server.java index 514369b..e412a85 100644 --- a/modules/server/src/main/java/com/annimon/ownlang/modules/server/server.java +++ b/modules/server/src/main/java/com/annimon/ownlang/modules/server/server.java @@ -3,6 +3,7 @@ package com.annimon.ownlang.modules.server; import com.annimon.ownlang.lib.*; import com.annimon.ownlang.modules.Module; import io.javalin.Javalin; +import io.javalin.http.Header; import io.javalin.http.staticfiles.Location; import java.util.Map; import static java.util.Map.entry; @@ -11,7 +12,7 @@ public final class server implements Module { @Override public Map constants() { - return Map.of(); + return Map.of("Header", ValueUtils.collectStringConstants(Header.class)); } @Override diff --git a/ownlang-core/src/main/java/com/annimon/ownlang/lib/ValueUtils.java b/ownlang-core/src/main/java/com/annimon/ownlang/lib/ValueUtils.java index 3b74a10..e9764ea 100644 --- a/ownlang-core/src/main/java/com/annimon/ownlang/lib/ValueUtils.java +++ b/ownlang-core/src/main/java/com/annimon/ownlang/lib/ValueUtils.java @@ -123,17 +123,29 @@ public final class ValueUtils { return ((FunctionValue) value).getValue(); } - @SuppressWarnings("unchecked") public static MapValue collectNumberConstants(Class clazz, Class type) { + return collectConstants(clazz, type, NumberValue::of); + } + + public static MapValue collectStringConstants(Class clazz) { + return collectConstants(clazz, String.class, StringValue::new); + } + + @SuppressWarnings("unchecked") + private static MapValue collectConstants(Class clazz, Class type, FieldConverter converter) { MapValue result = new MapValue(20); for (Field field : clazz.getDeclaredFields()) { if (!Modifier.isStatic(field.getModifiers())) continue; if (!field.getType().equals(type)) continue; try { - result.set(field.getName(), NumberValue.of((T) field.get(type))); + result.set(field.getName(), converter.convert((T) field.get(type))); } catch (IllegalAccessException ignore) { } } return result; } + + private interface FieldConverter { + V convert(T input) throws IllegalAccessException; + } }