Skip to content

Commit 1164f03

Browse files
authored
Merge pull request #4562 from handrews/enc-refactor
v3.2 Arrange encoding information more clearly
2 parents e511664 + ed60733 commit 1164f03

File tree

1 file changed

+35
-26
lines changed

1 file changed

+35
-26
lines changed

src/oas.md

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,10 +1615,33 @@ See [Working With Examples](#working-with-examples) for further guidance regardi
16151615
| <a name="media-type-schema"></a>schema | [Schema Object](#schema-object) | The schema defining the content of the request, response, parameter, or header. |
16161616
| <a name="media-type-example"></a>example | Any | Example of the media type; see [Working With Examples](#working-with-examples). |
16171617
| <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. |
1618+
| <a name="media-type-encoding"></a>encoding | Map[`string`, [Encoding Object](#encoding-object)] | A map between a property name and its encoding information, as defined under [Encoding Usage and Restrictions](#encoding-usage-and-restrictions). 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. |
16191619

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

1622+
##### Encoding Usage and Restrictions
1623+
1624+
The `encoding` field defines how to map each [Encoding Object](#encoding-object) to a specific value in the data.
1625+
1626+
To use the `encoding` field, a `schema` MUST exist, and the `encoding` field's keys MUST exist in the schema as properties.
1627+
Array properties MUST be handled by applying the given Encoding Object to one part per array item, each with the same `name`, as is recommended by [[?RFC7578]] [Section 4.3](https://www.rfc-editor.org/rfc/rfc7578.html#section-4.3) for supplying multiple values per form field.
1628+
For all other value types for both top-level non-array properties and for values, including array values, within a top-level array, the Encoding Object MUST be applied to the entire value.
1629+
1630+
The behavior of the `encoding` field is designed to support web forms, and is therefore only defined for media types structured as name-value pairs that allow repeat values, most notably `application/x-www-form-urlencoded` and `multipart/form-data`.
1631+
The order of these name-value pairs in the target media type is implementation-defined.
1632+
1633+
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).
1634+
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.
1635+
1636+
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, as is defined for `multipart/form-data` in [[?RFC7578]].
1637+
See [[?RFC7578]] [Section 5](https://www.rfc-editor.org/rfc/rfc7578.html#section-5) for guidance regarding non-ASCII part names.
1638+
1639+
Other `multipart` media types are not directly supported as they do not define a mechanism for part names.
1640+
However, the usage of a `name` [`Content-Disposition` parameter](https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-2) is defined for the `form-data` [`Content-Disposition` value](https://www.iana.org/assignments/cont-disp/cont-disp.xhtml#cont-disp-1), which is not restricted to `multipart/form-data`.
1641+
Implementations MAY choose to support the a `Conent-Disposition` of `form-data` with a `name` parameter in other `multipart` media types in order to use the `encoding` field with them, 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+
16221645
##### Media Type Examples
16231646

16241647
```json
@@ -1732,21 +1755,11 @@ requestBody:
17321755

17331756
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).
17341757

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-
17431758
#### Encoding Object
17441759

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.
1760+
A single encoding definition applied to a single value, with the mapping of Encoding Objects to values determined by the [Media Type Object](@media-type-object) as described under [Encoding Usage and Restrictions](#encoding-usage-and-restrictions).
17471761

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.
1762+
See [Appendix B](#appendix-b-data-type-conversion) for a discussion of converting values of various types to string representations.
17501763

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

@@ -1763,7 +1776,9 @@ These fields MAY be used either with or without the RFC6570-style serialization
17631776

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

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:
1779+
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.
1780+
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.
1781+
Therefore the `array` row in this table applies only to array values inside of a top-level array.
17671782

17681783
| `type` | `contentEncoding` | Default `contentType` |
17691784
| ---- | ---- | ---- |
@@ -1772,7 +1787,7 @@ The default values for `contentType` are as follows, where an _n/a_ in the `cont
17721787
| `string` | _absent_ | `text/plain` |
17731788
| `number`, `integer`, or `boolean` | _n/a_ | `text/plain` |
17741789
| `object` | _n/a_ | `application/json` |
1775-
| `array` | _n/a_ | according to the `type` of the `items` schema |
1790+
| `array` | _n/a_ | `application/json` |
17761791

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

18811896
##### Encoding `multipart` Media Types
18821897

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.
1898+
See [Encoding Usage and Restrictions](#encoding-usage-and-restrictions) for guidance on correlating schema properties with parts.
18911899

18921900
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)).
18931901

18941902
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.
18951903

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`.
1904+
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`.
18971905
+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.
18981906

18991907
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 +1929,9 @@ requestBody:
19211929
type: string
19221930
format: binary
19231931
addresses:
1924-
# default for arrays is based on the type in the `items`
1925-
# subschema, which is an object, so `application/json`
1932+
# for arrays, the Encoding Object applies to each item
1933+
# individually based on that item's type, which in this
1934+
# example is an object, so `application/json`
19261935
type: array
19271936
items:
19281937
$ref: '#/components/schemas/Address'

0 commit comments

Comments
 (0)