{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:junexis:schema:registry-http-policy:0.1",
  "title": "Polityka HTTP klienta Junexis Registry 0.1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schemaVersion",
    "timeouts",
    "redirects",
    "retry",
    "limits"
  ],
  "properties": {
    "schemaVersion": { "const": "junexis.registry-http-policy/0.1" },
    "timeouts": {
      "type": "object",
      "additionalProperties": false,
      "required": ["connectSeconds", "attemptSeconds", "operationSeconds"],
      "properties": {
        "connectSeconds": { "type": "integer", "minimum": 1, "maximum": 60 },
        "attemptSeconds": { "type": "integer", "minimum": 1, "maximum": 300 },
        "operationSeconds": { "type": "integer", "minimum": 1, "maximum": 900 }
      }
    },
    "redirects": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "maximumHops",
        "allowedSchemes",
        "allowHttpsDowngrade",
        "authorizationForwarding"
      ],
      "properties": {
        "maximumHops": { "type": "integer", "minimum": 0, "maximum": 10 },
        "allowedSchemes": {
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "uniqueItems": true,
          "items": { "enum": ["https", "http"] },
          "contains": { "const": "https" }
        },
        "allowHttpsDowngrade": { "const": false },
        "authorizationForwarding": { "const": "same-origin-only" }
      }
    },
    "retry": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "maximumAttempts",
        "methods",
        "statusCodes",
        "transportFailures",
        "honorRetryAfter",
        "baseDelayMilliseconds",
        "maximumDelayMilliseconds",
        "maximumRetryAfterSeconds"
      ],
      "properties": {
        "maximumAttempts": { "type": "integer", "minimum": 1, "maximum": 5 },
        "methods": {
          "type": "array",
          "minItems": 1,
          "maxItems": 2,
          "uniqueItems": true,
          "items": { "enum": ["GET", "HEAD"] }
        },
        "statusCodes": {
          "type": "array",
          "minItems": 1,
          "maxItems": 101,
          "uniqueItems": true,
          "items": {
            "anyOf": [
              { "const": 429 },
              { "type": "integer", "minimum": 500, "maximum": 599 }
            ]
          }
        },
        "transportFailures": {
          "type": "array",
          "minItems": 1,
          "maxItems": 3,
          "uniqueItems": true,
          "items": { "enum": ["connection", "timeout", "truncated-response"] }
        },
        "honorRetryAfter": { "const": true },
        "baseDelayMilliseconds": { "type": "integer", "minimum": 10, "maximum": 10000 },
        "maximumDelayMilliseconds": { "type": "integer", "minimum": 10, "maximum": 60000 },
        "maximumRetryAfterSeconds": { "type": "integer", "minimum": 0, "maximum": 86400 }
      }
    },
    "limits": {
      "type": "object",
      "additionalProperties": false,
      "required": ["responseHeadersBytes", "metadataBytes", "artifactBytes"],
      "properties": {
        "responseHeadersBytes": { "type": "integer", "minimum": 1024, "maximum": 1048576 },
        "metadataBytes": { "type": "integer", "minimum": 1024, "maximum": 16777216 },
        "artifactBytes": { "type": "integer", "minimum": 1024, "maximum": 1073741824 }
      }
    }
  }
}
