Skip to content

Headers in responses do not get their refs resolved in the same way as other headers do #1746

@AndySpaven

Description

@AndySpaven

The function updateRefs(apiResponse, pathRef) does not update refs for headers in the response whilst it does this correctly for examples and content. As a result relative references in this section cause errors turning the OpenApi spec file into a model as these then get mangled when joined with the base url.

For example:

application.yaml
commonHeaders.yaml
endpoints/
  list.yaml

list.yaml would then reference common headers

    "200":
      description: some text here
      headers:
        X-CorrelationId:
          $ref: '../commonHeaders.yaml#/components/parameters/correlationId'
       ... <more response definition>

The final url to resolve commonHeaders.yaml looses the last part of the {baseUrl}/../commonHeaders.yaml rather than having {baseUrl}/endpoints/../commonHeaders.yaml

Looking at the code for updateRefs locally we can fix it by changing/adding the following code (and all existing tests pass) but this may not be the correct or ideal way to address this (not knowing the whole codebase).

        if (response.get$ref() != null){
        	response.set$ref(computeRef(response.get$ref(), pathRef));
        }
        if(response.getContent() != null) {
            Map<String, MediaType> content = response.getContent();
            for (String key: content.keySet()) {
                MediaType mediaType = content.get(key);
                if (mediaType.getSchema() != null) {
                    updateRefs(mediaType.getSchema(), pathRef);
                }
                Map<String, Example> examples = content.get(key).getExamples();
                if (examples != null) {
                    for( Example example:examples.values()){
                        updateRefs(example, pathRef);
                    }
                }
            }
        }

+        Map<String, Header> headers = response.getHeaders();
+        if(headers != null) {
+            for( Header header : headers.values()) {
+                updateRefs(header, pathRef);
+            }
+        }
    }

+    protected void updateRefs(Header header, String pathRef) {
+        if (header.get$ref() != null) {
+            header.set$ref(computeRef(header.get$ref(), pathRef));
+        }
+    }

We believe that the OpenAPI specification supports the way that our specification files are structured.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions