
001/* 002 * #%L 003 * HAPI FHIR - Core Library 004 * %% 005 * Copyright (C) 2014 - 2025 Smile CDR, Inc. 006 * %% 007 * Licensed under the Apache License, Version 2.0 (the "License"); 008 * you may not use this file except in compliance with the License. 009 * You may obtain a copy of the License at 010 * 011 * http://www.apache.org/licenses/LICENSE-2.0 012 * 013 * Unless required by applicable law or agreed to in writing, software 014 * distributed under the License is distributed on an "AS IS" BASIS, 015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 016 * See the License for the specific language governing permissions and 017 * limitations under the License. 018 * #L% 019 */ 020package ca.uhn.fhir.rest.api; 021 022import java.nio.charset.Charset; 023import java.nio.charset.StandardCharsets; 024import java.util.Arrays; 025import java.util.Collections; 026import java.util.HashMap; 027import java.util.HashSet; 028import java.util.List; 029import java.util.Map; 030import java.util.Set; 031 032import static org.apache.commons.lang3.StringUtils.defaultIfBlank; 033 034public class Constants { 035 036 // ============================================================== 037 // Standard HTTP headers 038 // ============================================================== 039 040 public static final String HEADER_ACCEPT = "Accept"; 041 public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding"; 042 public static final String HEADER_ALLOW = "Allow"; 043 public static final String HEADER_AUTHORIZATION = "Authorization"; 044 public static final String HEADER_CACHE_CONTROL = "Cache-Control"; 045 public static final String HEADER_CONTENT_ENCODING = "Content-Encoding"; 046 public static final String HEADER_CONTENT_LOCATION = "Content-Location"; 047 public static final String HEADER_CONTENT_LOCATION_LC = HEADER_CONTENT_LOCATION.toLowerCase(); 048 public static final String HEADER_CONTENT_TYPE = "Content-Type"; 049 public static final String HEADER_CONTENT_TYPE_LC = HEADER_CONTENT_TYPE.toLowerCase(); 050 public static final String HEADER_ETAG = "ETag"; 051 public static final String HEADER_ETAG_LC = HEADER_ETAG.toLowerCase(); 052 public static final String HEADER_IF_MATCH = "If-Match"; 053 public static final String HEADER_IF_MATCH_LC = HEADER_IF_MATCH.toLowerCase(); 054 public static final String HEADER_IF_MODIFIED_SINCE = "If-Modified-Since"; 055 public static final String HEADER_IF_MODIFIED_SINCE_LC = HEADER_IF_MODIFIED_SINCE.toLowerCase(); 056 public static final String HEADER_IF_NONE_MATCH = "If-None-Match"; 057 public static final String HEADER_IF_NONE_MATCH_LC = HEADER_IF_NONE_MATCH.toLowerCase(); 058 public static final String HEADER_LAST_MODIFIED = "Last-Modified"; 059 public static final String HEADER_LAST_MODIFIED_LOWERCASE = HEADER_LAST_MODIFIED.toLowerCase(); 060 public static final String HEADER_LOCATION = "Location"; 061 public static final String HEADER_LOCATION_LC = HEADER_LOCATION.toLowerCase(); 062 public static final String HEADER_RETRY_AFTER = "Retry-After"; 063 public static final String HEADER_DATE = "Date"; 064 065 // ============================================================== 066 // Standard FHIR headers 067 // ============================================================== 068 069 public static final String HEADER_IF_NONE_EXIST = "If-None-Exist"; 070 071 // ============================================================== 072 // Standard CORS headers 073 // ============================================================== 074 075 public static final String HEADER_CORS_ORIGIN = "Origin"; 076 public static final String HEADER_CORS_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials"; 077 public static final String HEADER_CORS_ALLOW_HEADERS = "Access-Control-Allow-Headers"; 078 public static final String HEADER_CORS_ALLOW_METHODS = "Access-Control-Allow-Methods"; 079 public static final String HEADER_CORS_ALLOW_ORIGIN = "Access-Control-Allow-Origin"; 080 public static final String HEADER_CORS_EXPOSE_HEADERS = "Access-Control-Expose-Headers"; 081 public static final String HEADER_CORS_REQUEST_HEADERS = "Access-Control-Request-Headers"; 082 public static final String HEADER_CORS_REQUEST_METHOD = "Access-Control-Request-Method"; 083 public static final String HEADER_CORS_MAX_AGE = "Access-Control-Max-Age"; 084 085 // ============================================================== 086 // Common non-standard HTTP headers 087 // ============================================================== 088 089 public static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition"; 090 public static final String HEADER_COOKIE = "Cookie"; 091 public static final String HEADER_PREFER = "Prefer"; 092 public static final String HEADER_POWERED_BY = "X-Powered-By"; 093 public static final String HEADER_REQUEST_ID = "X-Request-ID"; 094 public static final String HEADER_X_CACHE = "X-Cache"; 095 public static final String HEADER_X_REQUESTED_WITH = "X-Requested-With"; 096 public static final String HEADER_X_CORRELATION_ID = "X-Correlation-ID"; 097 public static final String HEADER_X_FORWARDED_HOST = "X-Forwarded-Host"; 098 public static final String HEADER_X_FORWARDED_PROTO = "X-Forwarded-Proto"; 099 public static final String HEADER_X_FORWARDED_PREFIX = "X-Forwarded-Prefix"; 100 public static final String HEADER_X_FORWARDED_FOR = "X-Forwarded-For"; 101 102 // ============================================================== 103 // Proprietary HAPI HTTP headers 104 // ============================================================== 105 106 public static final String HEADER_REQUEST_SOURCE = "X-Request-Source"; 107 public static final String HEADER_REWRITE_HISTORY = "X-Rewrite-History"; 108 public static final String HEADER_RETRY_ON_VERSION_CONFLICT = "X-Retry-On-Version-Conflict"; 109 public static final String HEADER_X_SECURITY_CONTEXT = "X-Security-Context"; 110 public static final String HEADER_CASCADE = "X-Cascade"; 111 public static final String HEADER_X_PROGRESS = "X-Progress"; 112 public static final String HEADER_X_PROGRESS_LC = HEADER_X_PROGRESS.toLowerCase(); 113 public static final String HEADER_X_FHIR_STARTER = "X-FHIR-Starter"; 114 public static final String HEADER_X_REQUEST_PARTITION_IDS = "X-Request-Partition-IDs"; 115 116 // ============================================================== 117 // Other Constants 118 // ============================================================== 119 120 public static final String CT_TEXT_CSV = "text/csv"; 121 public static final String CACHE_CONTROL_MAX_RESULTS = "max-results"; 122 public static final String CACHE_CONTROL_NO_CACHE = "no-cache"; 123 public static final String CACHE_CONTROL_NO_STORE = "no-store"; 124 public static final String CHARSET_NAME_UTF8 = "UTF-8"; 125 public static final Charset CHARSET_UTF8; 126 public static final String CHARSET_UTF8_CTSUFFIX = "; charset=" + CHARSET_NAME_UTF8; 127 128 public static final String CT_FHIR_JSON = "application/json+fhir"; 129 public static final String CT_RDF_TURTLE = "application/x-turtle"; 130 /** 131 * The FHIR MimeType for JSON encoding in FHIR DSTU3+ 132 */ 133 public static final String CT_FHIR_JSON_NEW = "application/fhir+json"; 134 135 public static final String CT_FHIR_XML = "application/xml+fhir"; 136 137 /** 138 * The FHIR MimeType for XML encoding in FHIR DSTU3+ 139 */ 140 public static final String CT_FHIR_XML_NEW = "application/fhir+xml"; 141 142 public static final String CT_HTML = "text/html"; 143 public static final String CT_HTML_WITH_UTF8 = "text/html" + CHARSET_UTF8_CTSUFFIX; 144 public static final String CT_JSON = "application/json"; 145 public static final String CT_GRAPHQL = "application/graphql"; 146 public static final String CT_JSON_PATCH = "application/json-patch+json"; 147 public static final String CT_OCTET_STREAM = "application/octet-stream"; 148 public static final String CT_TEXT = "text/plain"; 149 public static final String CT_TEXT_WITH_UTF8 = CT_TEXT + CHARSET_UTF8_CTSUFFIX; 150 public static final String CT_TEXT_CDA = "text/xml+cda"; 151 public static final String CT_X_FORM_URLENCODED = "application/x-www-form-urlencoded"; 152 public static final String CT_XML = "application/xml"; 153 public static final String CT_XML_PATCH = "application/xml-patch+xml"; 154 public static final String ENCODING_GZIP = "gzip"; 155 public static final String EXTOP_PROCESS_MESSAGE = "$process-message"; // Used in messaging 156 public static final String EXTOP_VALIDATE = "$validate"; 157 public static final String EXTOP_VALIDATE_MODE = "mode"; 158 public static final String EXTOP_VALIDATE_PROFILE = "profile"; 159 public static final String EXTOP_VALIDATE_RESOURCE = "resource"; 160 public static final String FORMAT_HTML = "html"; 161 public static final String FORMAT_JSON = "json"; 162 public static final String FORMAT_NDJSON = "ndjson"; 163 public static final String FORMAT_XML = "xml"; 164 public static final String CT_RDF_TURTLE_LEGACY = "text/turtle"; 165 public static final String FORMAT_TURTLE = "ttl"; 166 167 /** 168 * "text/html" and "html" 169 */ 170 public static final Set<String> FORMATS_HTML; 171 172 public static final String FORMATS_HTML_JSON = "html/json"; 173 public static final String FORMATS_HTML_XML = "html/xml"; 174 public static final String FORMATS_HTML_TTL = "html/turtle"; 175 public static final String HEADER_ACCEPT_VALUE_JSON_NON_LEGACY = 176 CT_FHIR_JSON_NEW + ";q=1.0, " + CT_FHIR_JSON + ";q=0.9"; 177 public static final String HEADER_ACCEPT_VALUE_XML_NON_LEGACY = 178 CT_FHIR_XML_NEW + ";q=1.0, " + CT_FHIR_XML + ";q=0.9"; 179 public static final String HEADER_ACCEPT_VALUE_XML_OR_JSON_LEGACY = 180 CT_FHIR_XML + ";q=1.0, " + CT_FHIR_JSON + ";q=1.0"; 181 public static final String HEADER_ACCEPT_VALUE_XML_OR_JSON_NON_LEGACY = CT_FHIR_XML_NEW + ";q=1.0, " 182 + CT_FHIR_JSON_NEW + ";q=1.0, " + HEADER_ACCEPT_VALUE_XML_OR_JSON_LEGACY.replace("1.0", "0.9"); 183 public static final String HEADER_AUTHORIZATION_VALPREFIX_BASIC = "Basic "; 184 public static final String HEADER_AUTHORIZATION_VALPREFIX_BEARER = "Bearer "; 185 public static final String HEADER_PREFER_HANDLING = "handling"; 186 public static final String HEADER_PREFER_HANDLING_STRICT = "strict"; 187 public static final String HEADER_PREFER_HANDLING_LENIENT = "lenient"; 188 public static final String HEADER_PREFER_RETURN = "return"; 189 public static final String HEADER_PREFER_RETURN_MINIMAL = "minimal"; 190 public static final String HEADER_PREFER_RETURN_REPRESENTATION = "representation"; 191 public static final String HEADER_PREFER_RETURN_OPERATION_OUTCOME = "OperationOutcome"; 192 public static final String HEADER_SUFFIX_CT_UTF_8 = "; charset=UTF-8"; 193 public static final String HEADERVALUE_CORS_ALLOW_METHODS_ALL = "GET, POST, PUT, DELETE, OPTIONS"; 194 public static final String HEADER_MAX_RETRIES = "max-retries"; 195 public static final String HEADER_RETRY = "retry"; 196 public static final Map<Integer, String> HTTP_STATUS_NAMES; 197 public static final String LINK_FHIR_BASE = "fhir-base"; 198 public static final String LINK_FIRST = "first"; 199 public static final String LINK_LAST = "last"; 200 public static final String LINK_NEXT = "next"; 201 public static final String LINK_PREVIOUS = "previous"; 202 public static final String LINK_SELF = "self"; 203 public static final String OPENSEARCH_NS_OLDER = "http://purl.org/atompub/tombstones/1.0"; 204 public static final String PARAM_ASYNC = "async"; // Used in messaging 205 public static final String PARAM_AT = "_at"; 206 public static final String PARAM_ID = "_id"; 207 /** 208 * Used in paging links 209 */ 210 public static final String PARAM_BUNDLETYPE = "_bundletype"; 211 212 public static final String PARAM_FILTER = "_filter"; 213 public static final String PARAM_CONTAINED = "_contained"; 214 public static final String PARAM_CONTAINED_TYPE = "_containedType"; 215 public static final String PARAM_CONTENT = "_content"; 216 public static final String PARAM_COUNT = "_count"; 217 public static final String PARAM_OFFSET = "_offset"; 218 public static final String PARAM_DELETE = "_delete"; 219 public static final String PARAM_ELEMENTS = "_elements"; 220 public static final String PARAM_ELEMENTS_EXCLUDE_MODIFIER = ":exclude"; 221 public static final String PARAM_FORMAT = "_format"; 222 public static final String PARAM_HAS = "_has"; 223 public static final String PARAM_HISTORY = "_history"; 224 public static final String PARAM_INCLUDE = "_include"; 225 /** 226 * @since 7.0.0 227 */ 228 public static final String PARAM_LANGUAGE = "_language"; 229 230 public static final String PARAM_INCLUDE_QUALIFIER_RECURSE = ":recurse"; 231 public static final String PARAM_INCLUDE_RECURSE = "_include" + PARAM_INCLUDE_QUALIFIER_RECURSE; 232 public static final String PARAM_INCLUDE_QUALIFIER_ITERATE = ":iterate"; 233 public static final String PARAM_INCLUDE_ITERATE = "_include" + PARAM_INCLUDE_QUALIFIER_ITERATE; 234 public static final String PARAM_LASTUPDATED = "_lastUpdated"; 235 public static final String PARAM_NARRATIVE = "_narrative"; 236 public static final String PARAM_PAGINGACTION = "_getpages"; 237 public static final String PARAM_PAGINGOFFSET = "_getpagesoffset"; 238 public static final String PARAM_PRETTY = "_pretty"; 239 public static final String PARAM_PRETTY_VALUE_FALSE = "false"; 240 public static final String PARAM_PRETTY_VALUE_TRUE = "true"; 241 public static final String PARAM_PROFILE = "_profile"; 242 public static final String PARAM_PID = "_pid"; 243 244 public static final String PARAM_QUERY = "_query"; 245 public static final String PARAM_RESPONSE_URL = "response-url"; // Used in messaging 246 public static final String PARAM_REVINCLUDE = "_revinclude"; 247 public static final String PARAM_REVINCLUDE_RECURSE = PARAM_REVINCLUDE + PARAM_INCLUDE_QUALIFIER_RECURSE; 248 public static final String PARAM_REVINCLUDE_ITERATE = PARAM_REVINCLUDE + PARAM_INCLUDE_QUALIFIER_ITERATE; 249 public static final String PARAM_SEARCH = "_search"; 250 public static final String PARAM_SECURITY = "_security"; 251 public static final String PARAM_SINCE = "_since"; 252 public static final String PARAM_SORT = "_sort"; 253 public static final String PARAM_SORT_ASC = "_sort:asc"; 254 public static final String PARAM_SORT_DESC = "_sort:desc"; 255 public static final String PARAM_SOURCE = "_source"; 256 public static final String PARAM_SUMMARY = "_summary"; 257 public static final String PARAM_TAG = "_tag"; 258 public static final String PARAM_LIST = "_list"; 259 public static final String PARAM_TAGS = "_tags"; 260 public static final String PARAM_TEXT = "_text"; 261 public static final String PARAM_VALIDATE = "_validate"; 262 public static final String PARAM_MDM = "_mdm"; 263 264 public static final String PARAMQUALIFIER_MISSING = ":missing"; 265 public static final String PARAMQUALIFIER_MISSING_FALSE = "false"; 266 public static final String PARAMQUALIFIER_MISSING_TRUE = "true"; 267 public static final String PARAMQUALIFIER_STRING_TEXT = ":text"; 268 public static final String PARAMQUALIFIER_STRING_CONTAINS = ":contains"; 269 public static final String PARAMQUALIFIER_STRING_EXACT = ":exact"; 270 public static final String PARAMQUALIFIER_TOKEN_TEXT = ":text"; 271 public static final String PARAMQUALIFIER_MDM = ":mdm"; 272 public static final String PARAMQUALIFIER_NICKNAME = ":nickname"; 273 public static final String PARAMQUALIFIER_TOKEN_OF_TYPE = ":of-type"; 274 public static final String PARAMQUALIFIER_TOKEN_NOT = ":not"; 275 public static final String PARAMQUALIFIER_TOKEN_IDENTIFIER = ":identifier"; 276 277 public static final int STATUS_HTTP_200_OK = 200; 278 public static final int STATUS_HTTP_201_CREATED = 201; 279 public static final int STATUS_HTTP_204_NO_CONTENT = 204; 280 public static final int STATUS_HTTP_304_NOT_MODIFIED = 304; 281 public static final int STATUS_HTTP_400_BAD_REQUEST = 400; 282 public static final int STATUS_HTTP_401_CLIENT_UNAUTHORIZED = 401; 283 public static final int STATUS_HTTP_403_FORBIDDEN = 403; 284 285 public static final int STATUS_HTTP_404_NOT_FOUND = 404; 286 public static final int STATUS_HTTP_405_METHOD_NOT_ALLOWED = 405; 287 public static final int STATUS_HTTP_409_CONFLICT = 409; 288 public static final int STATUS_HTTP_410_GONE = 410; 289 public static final int STATUS_HTTP_412_PRECONDITION_FAILED = 412; 290 public static final int STATUS_HTTP_422_UNPROCESSABLE_ENTITY = 422; 291 public static final int STATUS_HTTP_500_INTERNAL_ERROR = 500; 292 public static final int STATUS_HTTP_501_NOT_IMPLEMENTED = 501; 293 public static final String TAG_SUBSETTED_CODE = "SUBSETTED"; 294 public static final String TAG_SUBSETTED_SYSTEM_DSTU3 = "http://hl7.org/fhir/v3/ObservationValue"; 295 public static final String TAG_SUBSETTED_SYSTEM_R4 = "http://terminology.hl7.org/CodeSystem/v3-ObservationValue"; 296 public static final String URL_TOKEN_HISTORY = "_history"; 297 public static final String URL_TOKEN_METADATA = "metadata"; 298 public static final String OO_INFOSTATUS_PROCESSING = "processing"; 299 public static final String PARAM_GRAPHQL_QUERY = "query"; 300 public static final Charset CHARSET_US_ASCII; 301 public static final String PARAM_PAGEID = "_pageId"; 302 public static final String JAVA_VALIDATOR_DETAILS_SYSTEM = "http://hl7.org/fhir/java-core-messageId"; 303 public static final String PARAM_SEARCH_TOTAL_MODE = "_total"; 304 public static final String CAPABILITYSTATEMENT_WEBSOCKET_URL = 305 "http://hl7.org/fhir/StructureDefinition/capabilitystatement-websocket"; 306 public static final String PARAMETER_CASCADE_DELETE = "_cascade"; 307 public static final String PARAMETER_CASCADE_DELETE_MAX_ROUNDS = "_maxRounds"; 308 public static final String HEADER_CASCADE_MAX_ROUNDS = "max-rounds"; 309 public static final String CASCADE_DELETE = "delete"; 310 public static final int MAX_RESOURCE_NAME_LENGTH = 100; 311 public static final String CACHE_CONTROL_PRIVATE = "private"; 312 public static final String CT_FHIR_NDJSON = "application/fhir+ndjson"; 313 public static final String CT_APP_NDJSON = "application/ndjson"; 314 public static final String CT_NDJSON = "ndjson"; 315 public static final Set<String> CTS_NDJSON; 316 public static final String HEADER_PREFER_RESPOND_ASYNC = "respond-async"; 317 public static final int STATUS_HTTP_412_PAYLOAD_TOO_LARGE = 413; 318 public static final String OPERATION_NAME_GRAPHQL = "$graphql"; 319 /** 320 * Note that this constant is used in a number of places including DB column lengths! Be careful if you decide to change it. 321 */ 322 public static final int REQUEST_ID_LENGTH = 16; 323 324 public static final int STATUS_HTTP_202_ACCEPTED = 202; 325 /** 326 * Operation name for the $lastn operation 327 */ 328 public static final String OPERATION_LASTN = "$lastn"; 329 330 public static final String PARAM_FHIRPATH = "_fhirpath"; 331 public static final String PARAM_TYPE = "_type"; 332 333 /** 334 * {@link org.hl7.fhir.instance.model.api.IBaseResource#getUserData(String) User metadata key} used 335 * to store the partition ID (if any) associated with the given resource. Value for this 336 * key will be of type {@link ca.uhn.fhir.interceptor.model.RequestPartitionId}. 337 */ 338 public static final String RESOURCE_PARTITION_ID = Constants.class.getName() + "_RESOURCE_PARTITION_ID"; 339 340 public static final String PARTITION_IDS = "partitionIds"; 341 public static final String CT_APPLICATION_GZIP = "application/gzip"; 342 public static final String[] EMPTY_STRING_ARRAY = new String[0]; 343 public static final String SUBSCRIPTION_MULTITYPE_PREFIX = "["; 344 public static final String SUBSCRIPTION_MULTITYPE_SUFFIX = "]"; 345 public static final String SUBSCRIPTION_MULTITYPE_STAR = "*"; 346 public static final String SUBSCRIPTION_STAR_CRITERIA = 347 SUBSCRIPTION_MULTITYPE_PREFIX + SUBSCRIPTION_MULTITYPE_STAR + SUBSCRIPTION_MULTITYPE_SUFFIX; 348 public static final String INCLUDE_STAR = "*"; 349 public static final String PARAMQUALIFIER_TOKEN_IN = ":in"; 350 public static final String PARAMQUALIFIER_TOKEN_NOT_IN = ":not-in"; 351 public static final String PARAMQUALIFIER_TOKEN_ABOVE = ":above"; 352 public static final String PARAMQUALIFIER_TOKEN_BELOW = ":below"; 353 354 public static final List<String> VALID_MODIFIERS = Collections.unmodifiableList(Arrays.asList( 355 PARAMQUALIFIER_STRING_CONTAINS, 356 PARAMQUALIFIER_STRING_EXACT, 357 PARAMQUALIFIER_TOKEN_IN, 358 PARAM_INCLUDE_QUALIFIER_ITERATE, 359 PARAMQUALIFIER_MISSING, 360 PARAMQUALIFIER_TOKEN_NOT_IN, 361 PARAMQUALIFIER_TOKEN_OF_TYPE, 362 PARAM_INCLUDE_QUALIFIER_RECURSE, 363 PARAMQUALIFIER_TOKEN_TEXT)); 364 /** 365 * The number of characters in a UUID (36) 366 */ 367 public static final int UUID_LENGTH = 36; 368 369 public static final String BULK_DATA_ACCESS_IG_URL = 370 "http://hl7.org/fhir/uv/bulkdata/CapabilityStatement/bulk-data"; 371 372 /** 373 * Application configuration key used to enable or disable Hibernate Envers. 374 */ 375 public static final String HIBERNATE_INTEGRATION_ENVERS_ENABLED = "hibernate.integration.envers.enabled"; 376 377 public static final String OPENTELEMETRY_BASE_NAME = "io.hapifhir"; 378 379 /** 380 * Contains a standard set of headers which are used by FHIR / HAPI FHIR, and therefore 381 * would make a useful set for CORS AllowedHeader declarations 382 */ 383 public static final Set<String> CORS_ALLOWED_HEADERS; 384 /** 385 * Contains a standard set of HTTP Methods which are used by FHIR / HAPI FHIR, and therefore 386 * would make a useful set for CORS AllowedMethod declarations 387 */ 388 public static final Set<String> CORS_ALLOWED_METHODS; 389 390 static { 391 CHARSET_UTF8 = StandardCharsets.UTF_8; 392 CHARSET_US_ASCII = StandardCharsets.ISO_8859_1; 393 394 HashSet<String> ctsNdjson = new HashSet<>(); 395 ctsNdjson.add(CT_FHIR_NDJSON); 396 ctsNdjson.add(CT_APP_NDJSON); 397 ctsNdjson.add(CT_NDJSON); 398 CTS_NDJSON = Collections.unmodifiableSet(ctsNdjson); 399 400 HashMap<Integer, String> statusNames = new HashMap<>(); 401 statusNames.put(200, "OK"); 402 statusNames.put(201, "Created"); 403 statusNames.put(202, "Accepted"); 404 statusNames.put(203, "Non-Authoritative Information"); 405 statusNames.put(204, "No Content"); 406 statusNames.put(205, "Reset Content"); 407 statusNames.put(206, "Partial Content"); 408 statusNames.put(207, "Multi-Status"); 409 statusNames.put(208, "Already Reported"); 410 statusNames.put(226, "IM Used"); 411 statusNames.put(300, "Multiple Choices"); 412 statusNames.put(301, "Moved Permanently"); 413 statusNames.put(302, "Found"); 414 statusNames.put(303, "See Other"); 415 statusNames.put(304, "Not Modified"); 416 statusNames.put(305, "Use Proxy"); 417 statusNames.put(307, "Temporary Redirect"); 418 statusNames.put(308, "Permanent Redirect"); 419 statusNames.put(400, "Bad Request"); 420 statusNames.put(401, "Unauthorized"); 421 statusNames.put(402, "Payment Required"); 422 statusNames.put(403, "Forbidden"); 423 statusNames.put(404, "Not Found"); 424 statusNames.put(405, "Method Not Allowed"); 425 statusNames.put(406, "Not Acceptable"); 426 statusNames.put(407, "Proxy Authentication Required"); 427 statusNames.put(408, "Request Timeout"); 428 statusNames.put(409, "Conflict"); 429 statusNames.put(410, "Gone"); 430 statusNames.put(411, "Length Required"); 431 statusNames.put(412, "Precondition Failed"); 432 statusNames.put(413, "Payload Too Large"); 433 statusNames.put(414, "URI Too Long"); 434 statusNames.put(415, "Unsupported Media Type"); 435 statusNames.put(416, "Requested range not satisfiable"); 436 statusNames.put(417, "Expectation Failed"); 437 statusNames.put(418, "I'm a teapot"); 438 statusNames.put(419, "Insufficient Space On Resource"); 439 statusNames.put(420, "Method Failure"); 440 statusNames.put(421, "Destination Locked"); 441 statusNames.put(422, "Unprocessable Entity"); 442 statusNames.put(423, "Locked"); 443 statusNames.put(424, "Failed Dependency"); 444 statusNames.put(426, "Upgrade Required"); 445 statusNames.put(428, "Precondition Required"); 446 statusNames.put(429, "Too Many Requests"); 447 statusNames.put(431, "Request Header Fields Too Large"); 448 statusNames.put(500, "Internal Server Error"); 449 statusNames.put(501, "Not Implemented"); 450 statusNames.put(502, "Bad Gateway"); 451 statusNames.put(503, "Service Unavailable"); 452 statusNames.put(504, "Gateway Timeout"); 453 statusNames.put(505, "HTTP Version not supported"); 454 statusNames.put(506, "Variant Also Negotiates"); 455 statusNames.put(507, "Insufficient Storage"); 456 statusNames.put(508, "Loop Detected"); 457 statusNames.put(509, "Bandwidth Limit Exceeded"); 458 statusNames.put(510, "Not Extended"); 459 statusNames.put(511, "Network Authentication Required"); 460 HTTP_STATUS_NAMES = Collections.unmodifiableMap(statusNames); 461 462 Set<String> formatsHtml = new HashSet<>(); 463 formatsHtml.add(CT_HTML); 464 formatsHtml.add(FORMAT_HTML); 465 FORMATS_HTML = Collections.unmodifiableSet(formatsHtml); 466 467 // ********************************************************* 468 // Update CorsInterceptor's constructor documentation if you change these: 469 // ********************************************************* 470 HashSet<String> corsAllowedHeaders = new HashSet<>(); 471 corsAllowedHeaders.add(HEADER_ACCEPT); 472 corsAllowedHeaders.add(Constants.HEADER_CORS_REQUEST_HEADERS); 473 corsAllowedHeaders.add(Constants.HEADER_CORS_REQUEST_METHOD); 474 corsAllowedHeaders.add(HEADER_CACHE_CONTROL); 475 corsAllowedHeaders.add(HEADER_CONTENT_TYPE); 476 corsAllowedHeaders.add(Constants.HEADER_CORS_ORIGIN); 477 corsAllowedHeaders.add(HEADER_PREFER); 478 corsAllowedHeaders.add(Constants.HEADER_X_FHIR_STARTER); 479 corsAllowedHeaders.add(HEADER_X_REQUESTED_WITH); 480 CORS_ALLOWED_HEADERS = Collections.unmodifiableSet(corsAllowedHeaders); 481 482 // ********************************************************* 483 // Update CorsInterceptor's constructor documentation if you change these: 484 // ********************************************************* 485 HashSet<String> corsAllowedMethods = new HashSet<>(); 486 corsAllowedMethods.addAll(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH")); 487 CORS_ALLOWED_METHODS = Collections.unmodifiableSet(corsAllowedMethods); 488 } 489 490 public static String codeSystemWithDefaultDescription(String theSystem) { 491 return defaultIfBlank(theSystem, "(none)"); 492 } 493}