-
Notifications
You must be signed in to change notification settings - Fork 9.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multiple specifications for the header with the same name in components #1572
Comments
It is not recommended to define HTTP Authorization headers in operations. That's what security requirement objects are designed to. The spec says tooling should ignore headers called Having the same HTTP header name with two different set of rules seems like an unwise thing to do. It certainly isn't how standard HTTP headers are defined. |
I'm interested in this issue for the purpose of using the |
@hibaymj didn't you have some idea on how to handle multiple |
@dfornika Parsing a single link header is hard. Parsing two is really not that much harder. I just borrowed someone elses code when I needed to do it :-) https://github.com/tavis-software/Tavis.Link/blob/a6877ff4a98e3de662d52b281e06661957437ed5/src/Link/LinkHeaders/LinkHeaderParser.cs |
@darrelmiller the problem comes when trying to specify what links will or may be present. If you are making heavy use of the |
Yes @handrews that's exactly the situation I have in mind. I'm not sure if this is helpful but I made a couple of regex demos to demonstrate how it may be feasible to write regexes for relatively simple cases where each link is in a separate header, but it would be very difficult to do for multiple links in a single header. Single Link header with multiple links |
@dfornika right- and even that Single Link header with multiple links regex imposes an ordering on the links, which is not good as now it will break if the server reorders them for whatever reason. |
@handrews I concur that regex is not really up to the task of parsing multiple link headers with any associated semantics. Like @darrelmiller showed, I think it's really a case where some custom parsing is required. The thinking I had for multiple Links to be returned within a current OAS document was to define a schema which would describe the network and system semantics of the potential response, the ordering, the range of rel values, if a rel is required, while leaving domain semantics out of scope. This schema would then use the alternate schema functionality in #1532. @darrelmiller wrote:
I think this is related to the fact that there are some headers which are defined with strict bounds, and others like |
Disregarding The limitation only appears when two or more operations have headers with the same name but with other properties different. Not the best API design, nonetheless possible. |
|
@rafalkrupinski oh wow I've read this issue wrong... I assumed it was about objects of Header Objects not allowing duplicates (which is true because the header name is the object key). But the OP specifically mentioned the Components Object. I think the error here is due to two things:
|
|
@rafalkrupinski In this example, the header name is components:
headers:
NotAHeaderName:
schema: {...}
paths:
/whatever:
get:
responses:
"200":
headers:
X-ActualHeader:
$ref: "#/components/headers/NotAHeaderName" |
And yes, it's weird to separate the name from the description - that's one reason that we've talked about using arrays more than objects in Moonwalk (OAS 4). |
🤦 Of course I think this should answer OP's problem, at least if we disregard the fact that they were trying to reference headers from parameters edit: and that it's about authorization headers.
But I suppose children of components will remain objects either way, otherwise you'd need to reference them by index... or by their name property instead of ref. components:
header-groups:
rate-limited: # arbitrary name
x-rate-limit: # real header name
schema: ...
x-reset:
schema: ...
paths:
/op:
get:
responses:
"200":
headers-groups:
- $ref: '#/components/header-groups/rate-limited' |
Hello!
According to the specification header object (in components section) must not include a
name
, the name is derived from theheaders
map's key instead.But, what if I want to have multiple header specifications for the header with the same name?
For example, I can have different API endpoints (or groups of endpoints) which require different authentication parameters:
How do I extract those headers to
components
section and reference them with$ref
?I can do it this way, and actually swagger UI understand that and renders correctly:
But, it throws validation errors, because I'm using
name
property for headers specified in thecomponents/headers
section.Also, if
name
is not referenced in the header specification, the Swagger UI doesn't display header's name at all (look like it doesn't know how to derive it from the headers map's key), but it's another issue with the Swagger itself, but it could also be a sign of a more major problem.Could someone elaborate on this? Thank you!
The text was updated successfully, but these errors were encountered: