Skip to content

Commit f2879df

Browse files
committed
Arrange encoding information more clearly
Refactor this to put the rules for mapping Encoding Objects to valules with the `encoding` field (which performs the mapping) rather than having most of it in the Encoding Object (which should focus on how to apply a single Encoding Object to a single value). This notably takes the special handling of arrays as repeated values out of the Encoding Object section (and the default `contentType` field value table) and moves it to the Media Type Object. The Encoding Object behavior is now consistent for all types, while the _mapping_ done by the `encoding` field handles the special case. The only change (as opposed to re-organization and re-wording) in this PR is the addition of a default `contentType` of `application/json` for array values, which in the context of the existing behavior is only relevant for array values nested under a top-level array. Past OAS versions were silent on this topic, and presumably it just does not come up much, but it was a gap we should fill. As dicussed in today's TDC call, we have increasing (and modern) use cases for supporting `multipart/mixed` (which we previously claimed to support but never did). This refactor makes possible future support easier by moving the array special case, which is governed by the `multipart/form-data` RFC, out of the Encoding Object (which needs to work with other `multipart` formats) and places it with the `encoding` field (which is web form-format-specific).
1 parent e511664 commit f2879df

File tree

1 file changed

+36
-26
lines changed

1 file changed

+36
-26
lines changed

src/oas.md

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ Some examples of possible media type definitions:
8484
application/vnd.github.v3.patch
8585
```
8686

87+
#### Media Type Registry
88+
8789
### HTTP Status Codes
8890

8991
The HTTP Status Codes are used to indicate the status of the executed operation.
@@ -1615,10 +1617,33 @@ See [Working With Examples](#working-with-examples) for further guidance regardi
16151617
| <a name="media-type-schema"></a>schema | [Schema Object](#schema-object) | The schema defining the content of the request, response, parameter, or header. |
16161618
| <a name="media-type-example"></a>example | Any | Example of the media type; see [Working With Examples](#working-with-examples). |
16171619
| <a name="media-type-examples"></a>examples | Map[ `string`, [Example Object](#example-object) \| [Reference Object](#reference-object)] | Examples of the media type; see [Working With Examples](#working-with-examples). |
1618-
| <a name="media-type-encoding"></a>encoding | Map[`string`, [Encoding Object](#encoding-object)] | A map between a property name and its encoding information. The key, being the property name, MUST exist in the schema as a property. The `encoding` field SHALL only apply when the media type is `multipart` or `application/x-www-form-urlencoded`. If no Encoding Object is provided for a property, the behavior is determined by the default values documented for the Encoding Object. |
1620+
| <a name="media-type-encoding"></a>encoding | Map[`string`, [Encoding Object](#encoding-object)] | A map between a property name and its encoding information for media types supporting name-value pairs and allowing duplicate names, as defined under [Encoding Usage and Restrictions](#encoding-usage-and-restrictions). |
1621+
16191622

16201623
This object MAY be extended with [Specification Extensions](#specification-extensions).
16211624

1625+
##### Encoding Usage and Restrictions
1626+
1627+
To use the `encoding` field, a `schema` MUST exist, and the `encoding` field's keys MUST exist in the schema as a property.
1628+
Array properties MUST be handled by applying the given Encoding Object to multiple parts (or query parameters) with the same `name`, as is recommended by [RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.3) for supplying multiple values per form field.
1629+
For all other property types, including array values within a top-level array, the Encoding Object MUST be applied to the entire values.
1630+
1631+
The behavior of the `encoding` field is only defined for media types structured as name-value pairs that allow repeat values.
1632+
The order of these name-value pairs in the target media type is implementation-defined.
1633+
1634+
For `application/x-www-form-urlencoded`, the encoding keys MUST map to parameter names, with the values produced according to the rules of the [Encoding Object](#encoding-object).
1635+
See [Encoding the `x-www-form-urlencoded` Media Type](#encoding-the-x-www-form-urlencoded-media-type) for guidance and examples, both with and without the `encoding` field.
1636+
1637+
For `multipart/*`, the encoding keys MUST map to the [`name` parameter](https://www.rfc-editor.org/rfc/rfc7578#section-4.2) of the `Content-Disposition: form-data` header of each part.
1638+
See [RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-5) for guidance regarding non-ASCII part names.
1639+
1640+
This usage of a `name` [`Content-Disposition` parameter](https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-2) is defined for `multipart/form-data` ([[?RFC7578]]) and the `form-data` [`Content-Disposition` value](https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-1).
1641+
Implementations MAY choose to support the `name` `Content-Disposition` parameter and the `encoding` field with other `multipart` formats, but this usage is unlikely to be supported by generic `multipart` implementations.
1642+
1643+
See [Encoding `multipart` Media Types](#encoding-multipart-media-types) for further guidance and examples, both with and without the `encoding` field.
1644+
1645+
For all media types where no mapping is defined by either this specification or the [Media Type Registry](#media-type-registry), the `encoding` field SHALL be ignored.
1646+
16221647
##### Media Type Examples
16231648

16241649
```json
@@ -1732,21 +1757,11 @@ requestBody:
17321757

17331758
To upload multiple files, a `multipart` media type MUST be used as shown under [Example: Multipart Form with Multiple Files](#example-multipart-form-with-multiple-files).
17341759

1735-
##### Support for x-www-form-urlencoded Request Bodies
1736-
1737-
See [Encoding the `x-www-form-urlencoded` Media Type](#encoding-the-x-www-form-urlencoded-media-type) for guidance and examples, both with and without the `encoding` field.
1738-
1739-
##### Special Considerations for `multipart` Content
1740-
1741-
See [Encoding `multipart` Media Types](#encoding-multipart-media-types) for further guidance and examples, both with and without the `encoding` field.
1742-
17431760
#### Encoding Object
17441761

1745-
A single encoding definition applied to a single schema property.
1746-
See [Appendix B](#appendix-b-data-type-conversion) for a discussion of converting values of various types to string representations.
1762+
A single encoding definition applied to a single value, as defined under [Encoding Usage and Restrictions](#encoding-usage-and-restrictions).
17471763

1748-
Properties are correlated with `multipart` parts using the [`name` parameter](https://www.rfc-editor.org/rfc/rfc7578#section-4.2) of `Content-Disposition: form-data`, and with `application/x-www-form-urlencoded` using the query string parameter names.
1749-
In both cases, their order is implementation-defined.
1764+
See [Appendix B](#appendix-b-data-type-conversion) for a discussion of converting values of various types to string representations.
17501765

17511766
See [Appendix E](#appendix-e-percent-encoding-and-form-media-types) for a detailed examination of percent-encoding concerns for form media types.
17521767

@@ -1763,7 +1778,8 @@ These fields MAY be used either with or without the RFC6570-style serialization
17631778

17641779
This object MAY be extended with [Specification Extensions](#specification-extensions).
17651780

1766-
The default values for `contentType` are as follows, where an _n/a_ in the `contentEncoding` column means that the presence or value of `contentEncoding` is irrelevant:
1781+
The default values for `contentType` are as follows, where an _n/a_ in the `contentEncoding` column means that the presence or value of `contentEncoding` is irrelevant.
1782+
This table is based on the value to which the Encoding Object is being applied, which as defined under [Encoding Usage and Restrictions](#encoding-usage-and-restrictions) is the array item for properties of type `"array"`, and the entire value for all other types.
17671783

17681784
| `type` | `contentEncoding` | Default `contentType` |
17691785
| ---- | ---- | ---- |
@@ -1772,7 +1788,7 @@ The default values for `contentType` are as follows, where an _n/a_ in the `cont
17721788
| `string` | _absent_ | `text/plain` |
17731789
| `number`, `integer`, or `boolean` | _n/a_ | `text/plain` |
17741790
| `object` | _n/a_ | `application/json` |
1775-
| `array` | _n/a_ | according to the `type` of the `items` schema |
1791+
| `array` | _n/a_ | `application/json` |
17761792

17771793
Determining how to handle a `type` value of `null` depends on how `null` values are being serialized.
17781794
If `null` values are entirely omitted, then the `contentType` is irrelevant.
@@ -1880,20 +1896,13 @@ However, this is not guaranteed, so it may be more interoperable to keep the pad
18801896

18811897
##### Encoding `multipart` Media Types
18821898

1883-
It is common to use `multipart/form-data` as a `Content-Type` when transferring forms as request bodies. In contrast to OpenAPI 2.0, a `schema` is REQUIRED to define the input parameters to the operation when using `multipart` content. This supports complex structures as well as supporting mechanisms for multiple file uploads.
1884-
1885-
The `form-data` disposition and its `name` parameter are mandatory for `multipart/form-data` ([RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.2)).
1886-
Array properties are handled by applying the same `name` to multiple parts, as is recommended by [RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.3) for supplying multiple values per form field.
1887-
See [RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-5) for guidance regarding non-ASCII part names.
1888-
1889-
Various other `multipart` types, most notable `multipart/mixed` ([RFC2046](https://www.rfc-editor.org/rfc/rfc2046.html#section-5.1.3)) neither require nor forbid specific `Content-Disposition` values, which means care must be taken to ensure that any values used are supported by all relevant software.
1890-
It is not currently possible to correlate schema properties with unnamed, ordered parts in media types such as `multipart/mixed`, but implementations MAY choose to support such types when `Content-Disposition: form-data` is used with a `name` parameter.
1899+
See [Encoding Usage and Restrictions](#encoding-usage-and-restrictions) for guidance on correlating schema properties with parts.
18911900

18921901
Note that there are significant restrictions on what headers can be used with `multipart` media types in general ([RFC2046](https://www.rfc-editor.org/rfc/rfc2046.html#section-5.1)) and `multi-part/form-data` in particular ([RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.8)).
18931902

18941903
Note also that `Content-Transfer-Encoding` is deprecated for `multipart/form-data` ([RFC7578](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.7)) where binary data is supported, as it is in HTTP.
18951904

1896-
+Using `contentEncoding` for a multipart field is equivalent to specifying an [Encoding Object](#encoding-object) with a `headers` field containing `Content-Transfer-Encoding` with a schema that requires the value used in `contentEncoding`.
1905+
Using `contentEncoding` for a multipart field is equivalent to specifying an [Encoding Object](#encoding-object) with a `headers` field containing `Content-Transfer-Encoding` with a schema that requires the value used in `contentEncoding`.
18971906
+If `contentEncoding` is used for a multipart field that has an Encoding Object with a `headers` field containing `Content-Transfer-Encoding` with a schema that disallows the value from `contentEncoding`, the result is undefined for serialization and parsing.
18981907

18991908
Note that as stated in [Working with Binary Data](#working-with-binary-data), if the Encoding Object's `contentType`, whether set explicitly or implicitly through its default value rules, disagrees with the `contentMediaType` in a Schema Object, the `contentMediaType` SHALL be ignored.
@@ -1921,8 +1930,9 @@ requestBody:
19211930
type: string
19221931
format: binary
19231932
addresses:
1924-
# default for arrays is based on the type in the `items`
1925-
# subschema, which is an object, so `application/json`
1933+
# for arrays, the Encoding Object applies to each item
1934+
# individually based on that item's type, which in this
1935+
# example is an object, so `application/json`
19261936
type: array
19271937
items:
19281938
$ref: '#/components/schemas/Address'

0 commit comments

Comments
 (0)