@typespec/http-specs 0.1.0-alpha.9-dev.5 → 0.1.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +256 -2
- package/README.md +11 -3
- package/dist/specs/authentication/noauth/union/mockapi.d.ts +3 -0
- package/dist/specs/authentication/noauth/union/mockapi.d.ts.map +1 -0
- package/dist/specs/authentication/noauth/union/mockapi.js +25 -0
- package/dist/specs/authentication/noauth/union/mockapi.js.map +1 -0
- package/dist/specs/documentation/mockapi.d.ts +3 -0
- package/dist/specs/documentation/mockapi.d.ts.map +1 -0
- package/dist/specs/documentation/mockapi.js +40 -0
- package/dist/specs/documentation/mockapi.js.map +1 -0
- package/dist/specs/encode/array/mockapi.d.ts +3 -0
- package/dist/specs/encode/array/mockapi.d.ts.map +1 -0
- package/dist/specs/encode/array/mockapi.js +33 -0
- package/dist/specs/encode/array/mockapi.js.map +1 -0
- package/dist/specs/encode/bytes/mockapi.js +16 -24
- package/dist/specs/encode/bytes/mockapi.js.map +1 -1
- package/dist/specs/encode/datetime/mockapi.js +2 -2
- package/dist/specs/encode/datetime/mockapi.js.map +1 -1
- package/dist/specs/encode/duration/mockapi.d.ts.map +1 -1
- package/dist/specs/encode/duration/mockapi.js +110 -3
- package/dist/specs/encode/duration/mockapi.js.map +1 -1
- package/dist/specs/encode/numeric/mockapi.js +2 -2
- package/dist/specs/encode/numeric/mockapi.js.map +1 -1
- package/dist/specs/helper.d.ts +2 -2
- package/dist/specs/helper.d.ts.map +1 -1
- package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/basic/mockapi.js +3 -3
- package/dist/specs/parameters/basic/mockapi.js.map +1 -1
- package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/body-optionality/mockapi.js +14 -4
- package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
- package/dist/specs/parameters/collection-format/mockapi.js +4 -15
- package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
- package/dist/specs/parameters/path/mockapi.d.ts +3 -0
- package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
- package/dist/specs/parameters/path/mockapi.js +29 -0
- package/dist/specs/parameters/path/mockapi.js.map +1 -0
- package/dist/specs/parameters/query/mockapi.d.ts +3 -0
- package/dist/specs/parameters/query/mockapi.d.ts.map +1 -0
- package/dist/specs/parameters/query/mockapi.js +14 -0
- package/dist/specs/parameters/query/mockapi.js.map +1 -0
- package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/spread/mockapi.js +19 -19
- package/dist/specs/parameters/spread/mockapi.js.map +1 -1
- package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
- package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
- package/dist/specs/payload/media-type/mockapi.js +2 -2
- package/dist/specs/payload/media-type/mockapi.js.map +1 -1
- package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
- package/dist/specs/payload/multipart/mockapi.js +189 -60
- package/dist/specs/payload/multipart/mockapi.js.map +1 -1
- package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -1
- package/dist/specs/payload/pageable/mockapi.js +594 -14
- package/dist/specs/payload/pageable/mockapi.js.map +1 -1
- package/dist/specs/payload/xml/mockapi.d.ts +3 -0
- package/dist/specs/payload/xml/mockapi.d.ts.map +1 -1
- package/dist/specs/payload/xml/mockapi.js +35 -5
- package/dist/specs/payload/xml/mockapi.js.map +1 -1
- package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -1
- package/dist/specs/response/status-code-range/mockapi.js +5 -9
- package/dist/specs/response/status-code-range/mockapi.js.map +1 -1
- package/dist/specs/routes/mockapi.js +16 -16
- package/dist/specs/routes/mockapi.js.map +1 -1
- package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
- package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
- package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
- package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
- package/dist/specs/server/versions/versioned/mockapi.js +8 -12
- package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
- package/dist/specs/special-words/mockapi.d.ts.map +1 -1
- package/dist/specs/special-words/mockapi.js +59 -6
- package/dist/specs/special-words/mockapi.js.map +1 -1
- package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
- package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
- package/dist/specs/streaming/jsonl/mockapi.js +30 -0
- package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
- package/dist/specs/type/array/mockapi.js +1 -1
- package/dist/specs/type/array/mockapi.js.map +1 -1
- package/dist/specs/type/dictionary/mockapi.js +1 -1
- package/dist/specs/type/dictionary/mockapi.js.map +1 -1
- package/dist/specs/type/enum/extensible/mockapi.js +1 -1
- package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
- package/dist/specs/type/enum/fixed/mockapi.js +2 -2
- package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
- package/dist/specs/type/file/mockapi.d.ts +3 -0
- package/dist/specs/type/file/mockapi.d.ts.map +1 -0
- package/dist/specs/type/file/mockapi.js +187 -0
- package/dist/specs/type/file/mockapi.js.map +1 -0
- package/dist/specs/type/model/empty/mockapi.js +2 -2
- package/dist/specs/type/model/empty/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
- package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
- package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/usage/mockapi.js +4 -4
- package/dist/specs/type/model/usage/mockapi.js.map +1 -1
- package/dist/specs/type/model/visibility/mockapi.js +9 -10
- package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
- package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
- package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
- package/dist/specs/type/property/nullable/mockapi.js +2 -6
- package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
- package/dist/specs/type/property/optionality/mockapi.js +1 -1
- package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
- package/dist/specs/type/property/value-types/mockapi.js +3 -3
- package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
- package/dist/specs/type/scalar/mockapi.js +9 -9
- package/dist/specs/type/scalar/mockapi.js.map +1 -1
- package/dist/specs/type/union/discriminated/mockapi.d.ts +3 -0
- package/dist/specs/type/union/discriminated/mockapi.d.ts.map +1 -0
- package/dist/specs/type/union/discriminated/mockapi.js +212 -0
- package/dist/specs/type/union/discriminated/mockapi.js.map +1 -0
- package/dist/specs/type/union/mockapi.js +2 -2
- package/dist/specs/type/union/mockapi.js.map +1 -1
- package/dist/specs/versioning/added/mockapi.js +6 -6
- package/dist/specs/versioning/added/mockapi.js.map +1 -1
- package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
- package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
- package/dist/specs/versioning/removed/mockapi.js +11 -11
- package/dist/specs/versioning/removed/mockapi.js.map +1 -1
- package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
- package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
- package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
- package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
- package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
- package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
- package/manifest.json +11200 -0
- package/package.json +30 -19
- package/smoke/petstore/main.tsp +96 -0
- package/smoke/todoapp/main.tsp +293 -0
- package/spec-summary.md +1745 -121
- package/specs/authentication/noauth/union/main.tsp +30 -0
- package/specs/authentication/noauth/union/mockapi.ts +27 -0
- package/specs/documentation/main.tsp +158 -0
- package/specs/documentation/mockapi.ts +59 -0
- package/specs/encode/array/main.tsp +339 -0
- package/specs/encode/array/mockapi.ts +83 -0
- package/specs/encode/bytes/main.tsp +29 -20
- package/specs/encode/bytes/mockapi.ts +13 -31
- package/specs/encode/datetime/main.tsp +2 -7
- package/specs/encode/datetime/mockapi.ts +2 -2
- package/specs/encode/duration/main.tsp +420 -7
- package/specs/encode/duration/mockapi.ts +216 -2
- package/specs/encode/numeric/mockapi.ts +2 -2
- package/specs/parameters/basic/mockapi.ts +3 -3
- package/specs/parameters/body-optionality/main.tsp +2 -0
- package/specs/parameters/body-optionality/mockapi.ts +24 -4
- package/specs/parameters/collection-format/main.tsp +5 -25
- package/specs/parameters/collection-format/mockapi.ts +4 -16
- package/specs/parameters/path/main.tsp +48 -0
- package/specs/parameters/path/mockapi.ts +34 -0
- package/specs/parameters/query/main.tsp +22 -0
- package/specs/parameters/query/mockapi.ts +15 -0
- package/specs/parameters/spread/mockapi.ts +19 -19
- package/specs/payload/json-merge-patch/main.tsp +2 -2
- package/specs/payload/json-merge-patch/mockapi.ts +4 -4
- package/specs/payload/media-type/mockapi.ts +2 -2
- package/specs/payload/multipart/main.tsp +230 -32
- package/specs/payload/multipart/mockapi.ts +200 -59
- package/specs/payload/pageable/main.tsp +601 -0
- package/specs/payload/pageable/mockapi.ts +656 -14
- package/specs/payload/xml/main.tsp +89 -0
- package/specs/payload/xml/mockapi.ts +44 -5
- package/specs/response/status-code-range/main.tsp +2 -2
- package/specs/response/status-code-range/mockapi.ts +5 -9
- package/specs/routes/main.tsp +29 -29
- package/specs/routes/mockapi.ts +16 -16
- package/specs/serialization/encoded-name/json/main.tsp +1 -1
- package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
- package/specs/server/endpoint/not-defined/main.tsp +1 -3
- package/specs/server/path/multiple/main.tsp +3 -5
- package/specs/server/versions/not-versioned/mockapi.ts +1 -1
- package/specs/server/versions/versioned/main.tsp +1 -1
- package/specs/server/versions/versioned/mockapi.ts +6 -12
- package/specs/special-headers/conditional-request/main.tsp +1 -1
- package/specs/special-headers/repeatability/main.tsp +2 -2
- package/specs/special-words/main.tsp +118 -6
- package/specs/special-words/mockapi.ts +62 -6
- package/specs/streaming/jsonl/main.tsp +33 -0
- package/specs/streaming/jsonl/mockapi.ts +32 -0
- package/specs/type/array/mockapi.ts +1 -1
- package/specs/type/dictionary/mockapi.ts +1 -1
- package/specs/type/enum/extensible/main.tsp +18 -2
- package/specs/type/enum/extensible/mockapi.ts +1 -1
- package/specs/type/enum/fixed/main.tsp +15 -3
- package/specs/type/enum/fixed/mockapi.ts +2 -2
- package/specs/type/file/main.tsp +109 -0
- package/specs/type/file/mockapi.ts +200 -0
- package/specs/type/model/empty/mockapi.ts +2 -2
- package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
- package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
- package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
- package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
- package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
- package/specs/type/model/usage/mockapi.ts +4 -4
- package/specs/type/model/visibility/main.tsp +9 -17
- package/specs/type/model/visibility/mockapi.ts +9 -10
- package/specs/type/property/additional-properties/main.tsp +17 -17
- package/specs/type/property/additional-properties/mockapi.ts +10 -10
- package/specs/type/property/nullable/mockapi.ts +7 -8
- package/specs/type/property/optionality/mockapi.ts +1 -1
- package/specs/type/property/value-types/mockapi.ts +3 -3
- package/specs/type/scalar/main.tsp +58 -9
- package/specs/type/scalar/mockapi.ts +9 -9
- package/specs/type/union/discriminated/main.tsp +251 -0
- package/specs/type/union/discriminated/mockapi.ts +230 -0
- package/specs/type/union/mockapi.ts +2 -2
- package/specs/versioning/added/mockapi.ts +6 -6
- package/specs/versioning/madeOptional/mockapi.ts +2 -2
- package/specs/versioning/removed/main.tsp +5 -5
- package/specs/versioning/removed/mockapi.ts +11 -11
- package/specs/versioning/renamedFrom/mockapi.ts +5 -5
- package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
- package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
- package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
- package/temp/.tsbuildinfo +1 -1
- package/tsconfig.build.json +0 -4
- package/tspconfig.yaml +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
|
|
1
|
+
import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
|
|
2
2
|
|
|
3
3
|
export const Scenarios: Record<string, ScenarioMockApi> = {};
|
|
4
4
|
|
|
@@ -6,9 +6,9 @@ Scenarios.Parameters_Spread_Model_spreadAsRequestBody = passOnSuccess({
|
|
|
6
6
|
uri: `/parameters/spread/model/request-body`,
|
|
7
7
|
method: "put",
|
|
8
8
|
request: {
|
|
9
|
-
body: {
|
|
9
|
+
body: json({
|
|
10
10
|
name: "foo",
|
|
11
|
-
},
|
|
11
|
+
}),
|
|
12
12
|
},
|
|
13
13
|
response: {
|
|
14
14
|
status: 204,
|
|
@@ -20,9 +20,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequestOnlyWithBody = passOnSuc
|
|
|
20
20
|
uri: `/parameters/spread/model/composite-request-only-with-body`,
|
|
21
21
|
method: "put",
|
|
22
22
|
request: {
|
|
23
|
-
body: {
|
|
23
|
+
body: json({
|
|
24
24
|
name: "foo",
|
|
25
|
-
},
|
|
25
|
+
}),
|
|
26
26
|
},
|
|
27
27
|
response: {
|
|
28
28
|
status: 204,
|
|
@@ -48,9 +48,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequest = passOnSuccess({
|
|
|
48
48
|
uri: `/parameters/spread/model/composite-request/foo`,
|
|
49
49
|
method: "put",
|
|
50
50
|
request: {
|
|
51
|
-
body: {
|
|
51
|
+
body: json({
|
|
52
52
|
name: "foo",
|
|
53
|
-
},
|
|
53
|
+
}),
|
|
54
54
|
headers: {
|
|
55
55
|
"test-header": "bar",
|
|
56
56
|
},
|
|
@@ -65,9 +65,9 @@ Scenarios.Parameters_Spread_Model_spreadCompositeRequestMix = passOnSuccess({
|
|
|
65
65
|
uri: `/parameters/spread/model/composite-request-mix/foo`,
|
|
66
66
|
method: "put",
|
|
67
67
|
request: {
|
|
68
|
-
body: {
|
|
68
|
+
body: json({
|
|
69
69
|
prop: "foo",
|
|
70
|
-
},
|
|
70
|
+
}),
|
|
71
71
|
headers: {
|
|
72
72
|
"test-header": "bar",
|
|
73
73
|
},
|
|
@@ -82,9 +82,9 @@ Scenarios.Parameters_Spread_Alias_spreadAsRequestBody = passOnSuccess({
|
|
|
82
82
|
uri: `/parameters/spread/alias/request-body`,
|
|
83
83
|
method: "put",
|
|
84
84
|
request: {
|
|
85
|
-
body: {
|
|
85
|
+
body: json({
|
|
86
86
|
name: "foo",
|
|
87
|
-
},
|
|
87
|
+
}),
|
|
88
88
|
},
|
|
89
89
|
response: {
|
|
90
90
|
status: 204,
|
|
@@ -96,9 +96,9 @@ Scenarios.Parameters_Spread_Alias_spreadAsRequestParameter = passOnSuccess({
|
|
|
96
96
|
uri: `/parameters/spread/alias/request-parameter/1`,
|
|
97
97
|
method: "put",
|
|
98
98
|
request: {
|
|
99
|
-
body: {
|
|
99
|
+
body: json({
|
|
100
100
|
name: "foo",
|
|
101
|
-
},
|
|
101
|
+
}),
|
|
102
102
|
headers: {
|
|
103
103
|
"x-ms-test-header": "bar",
|
|
104
104
|
},
|
|
@@ -113,12 +113,12 @@ Scenarios.Parameters_Spread_Alias_spreadWithMultipleParameters = passOnSuccess({
|
|
|
113
113
|
uri: `/parameters/spread/alias/multiple-parameters/1`,
|
|
114
114
|
method: "put",
|
|
115
115
|
request: {
|
|
116
|
-
body: {
|
|
116
|
+
body: json({
|
|
117
117
|
requiredString: "foo",
|
|
118
118
|
optionalInt: 1,
|
|
119
119
|
requiredIntList: [1, 2],
|
|
120
120
|
optionalStringList: ["foo", "bar"],
|
|
121
|
-
},
|
|
121
|
+
}),
|
|
122
122
|
headers: {
|
|
123
123
|
"x-ms-test-header": "bar",
|
|
124
124
|
},
|
|
@@ -133,9 +133,9 @@ Scenarios.Parameters_Spread_Alias_spreadParameterWithInnerModel = passOnSuccess(
|
|
|
133
133
|
uri: `/parameters/spread/alias/inner-model-parameter/1`,
|
|
134
134
|
method: "post",
|
|
135
135
|
request: {
|
|
136
|
-
body: {
|
|
136
|
+
body: json({
|
|
137
137
|
name: "foo",
|
|
138
|
-
},
|
|
138
|
+
}),
|
|
139
139
|
headers: {
|
|
140
140
|
"x-ms-test-header": "bar",
|
|
141
141
|
},
|
|
@@ -150,10 +150,10 @@ Scenarios.Parameters_Spread_Alias_spreadParameterWithInnerAlias = passOnSuccess(
|
|
|
150
150
|
uri: `/parameters/spread/alias/inner-alias-parameter/1`,
|
|
151
151
|
method: "post",
|
|
152
152
|
request: {
|
|
153
|
-
body: {
|
|
153
|
+
body: json({
|
|
154
154
|
name: "foo",
|
|
155
155
|
age: 1,
|
|
156
|
-
},
|
|
156
|
+
}),
|
|
157
157
|
headers: {
|
|
158
158
|
"x-ms-test-header": "bar",
|
|
159
159
|
},
|
|
@@ -58,7 +58,7 @@ model InnerModel {
|
|
|
58
58
|
}
|
|
59
59
|
],
|
|
60
60
|
"intValue": 1,
|
|
61
|
-
"floatValue": 1.
|
|
61
|
+
"floatValue": 1.25,
|
|
62
62
|
"innerModel": {
|
|
63
63
|
"name": "InnerMadge",
|
|
64
64
|
"description": "innerDesc"
|
|
@@ -85,7 +85,7 @@ model InnerModel {
|
|
|
85
85
|
}
|
|
86
86
|
],
|
|
87
87
|
"intValue": 1,
|
|
88
|
-
"floatValue": 1.
|
|
88
|
+
"floatValue": 1.25,
|
|
89
89
|
"innerModel": {
|
|
90
90
|
"name": "InnerMadge",
|
|
91
91
|
"description": "innerDesc"
|
|
@@ -18,7 +18,7 @@ export const expectedCreateBody = {
|
|
|
18
18
|
},
|
|
19
19
|
],
|
|
20
20
|
intValue: 1,
|
|
21
|
-
floatValue: 1.
|
|
21
|
+
floatValue: 1.25,
|
|
22
22
|
innerModel: {
|
|
23
23
|
name: "InnerMadge",
|
|
24
24
|
description: "innerDesc",
|
|
@@ -45,7 +45,7 @@ Scenarios.Payload_JsonMergePatch_createResource = passOnSuccess({
|
|
|
45
45
|
uri: "/json-merge-patch/create/resource",
|
|
46
46
|
method: "put",
|
|
47
47
|
request: {
|
|
48
|
-
body: expectedCreateBody,
|
|
48
|
+
body: json(expectedCreateBody),
|
|
49
49
|
},
|
|
50
50
|
response: {
|
|
51
51
|
status: 200,
|
|
@@ -58,7 +58,7 @@ Scenarios.Payload_JsonMergePatch_updateResource = passOnSuccess({
|
|
|
58
58
|
uri: "/json-merge-patch/update/resource",
|
|
59
59
|
method: "patch",
|
|
60
60
|
request: {
|
|
61
|
-
body: expectedUpdateBody,
|
|
61
|
+
body: json(expectedUpdateBody),
|
|
62
62
|
},
|
|
63
63
|
response: {
|
|
64
64
|
status: 200,
|
|
@@ -78,7 +78,7 @@ Scenarios.Payload_JsonMergePatch_updateOptionalResource = passOnSuccess({
|
|
|
78
78
|
uri: "/json-merge-patch/update/resource/optional",
|
|
79
79
|
method: "patch",
|
|
80
80
|
request: {
|
|
81
|
-
body: expectedUpdateBody,
|
|
81
|
+
body: json(expectedUpdateBody),
|
|
82
82
|
},
|
|
83
83
|
response: {
|
|
84
84
|
status: 200,
|
|
@@ -6,7 +6,7 @@ Scenarios.Payload_MediaType_StringBody_sendAsText = passOnSuccess({
|
|
|
6
6
|
uri: "/payload/media-type/string-body/sendAsText",
|
|
7
7
|
method: "post",
|
|
8
8
|
request: {
|
|
9
|
-
body: "{cat}",
|
|
9
|
+
body: json("{cat}"),
|
|
10
10
|
headers: {
|
|
11
11
|
"Content-Type": "text/plain",
|
|
12
12
|
},
|
|
@@ -36,7 +36,7 @@ Scenarios.Payload_MediaType_StringBody_sendAsJson = passOnSuccess({
|
|
|
36
36
|
uri: "/payload/media-type/string-body/sendAsJson",
|
|
37
37
|
method: "post",
|
|
38
38
|
request: {
|
|
39
|
-
body: "foo",
|
|
39
|
+
body: json("foo"),
|
|
40
40
|
headers: {
|
|
41
41
|
"Content-Type": "application/json",
|
|
42
42
|
},
|
|
@@ -9,8 +9,18 @@ using Spector;
|
|
|
9
9
|
namespace Payload.MultiPart;
|
|
10
10
|
|
|
11
11
|
model MultiPartRequest {
|
|
12
|
-
id: string
|
|
13
|
-
profileImage: bytes
|
|
12
|
+
id: HttpPart<string>;
|
|
13
|
+
profileImage: HttpPart<bytes>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
model MultiPartRequestWithWireName {
|
|
17
|
+
identifier: HttpPart<string, #{ name: "id" }>;
|
|
18
|
+
image: HttpPart<bytes, #{ name: "profileImage" }>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
model MultiPartOptionalRequest {
|
|
22
|
+
id?: HttpPart<string>;
|
|
23
|
+
profileImage?: HttpPart<bytes>;
|
|
14
24
|
}
|
|
15
25
|
|
|
16
26
|
model Address {
|
|
@@ -52,25 +62,25 @@ model ComplexHttpPartsModelRequest {
|
|
|
52
62
|
}
|
|
53
63
|
|
|
54
64
|
model ComplexPartsRequest {
|
|
55
|
-
id: string
|
|
56
|
-
address: Address
|
|
57
|
-
profileImage: bytes
|
|
58
|
-
pictures: bytes[];
|
|
65
|
+
id: HttpPart<string>;
|
|
66
|
+
address: HttpPart<Address>;
|
|
67
|
+
profileImage: HttpPart<bytes>;
|
|
68
|
+
pictures: HttpPart<bytes>[];
|
|
59
69
|
}
|
|
60
70
|
|
|
61
71
|
model JsonPartRequest {
|
|
62
|
-
address: Address
|
|
63
|
-
profileImage: bytes
|
|
72
|
+
address: HttpPart<Address>;
|
|
73
|
+
profileImage: HttpPart<bytes>;
|
|
64
74
|
}
|
|
65
75
|
|
|
66
76
|
model BinaryArrayPartsRequest {
|
|
67
|
-
id: string
|
|
68
|
-
pictures: bytes[];
|
|
77
|
+
id: HttpPart<string>;
|
|
78
|
+
pictures: HttpPart<bytes>[];
|
|
69
79
|
}
|
|
70
80
|
|
|
71
81
|
model MultiBinaryPartsRequest {
|
|
72
|
-
profileImage: bytes
|
|
73
|
-
picture?: bytes
|
|
82
|
+
profileImage: HttpPart<bytes>;
|
|
83
|
+
picture?: HttpPart<bytes>;
|
|
74
84
|
}
|
|
75
85
|
|
|
76
86
|
@route("/form-data")
|
|
@@ -79,9 +89,9 @@ namespace FormData {
|
|
|
79
89
|
@scenarioDoc("""
|
|
80
90
|
Expect request (
|
|
81
91
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
82
|
-
appropriate media type,
|
|
92
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
83
93
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
84
|
-
If there are duplicated filename in same fieldName,
|
|
94
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
85
95
|
):
|
|
86
96
|
```
|
|
87
97
|
POST /upload HTTP/1.1
|
|
@@ -106,16 +116,115 @@ namespace FormData {
|
|
|
106
116
|
@route("/mixed-parts")
|
|
107
117
|
op basic(
|
|
108
118
|
@header contentType: "multipart/form-data",
|
|
109
|
-
@
|
|
119
|
+
@multipartBody body: MultiPartRequest,
|
|
120
|
+
): NoContentResponse;
|
|
121
|
+
|
|
122
|
+
@scenario
|
|
123
|
+
@scenarioDoc("""
|
|
124
|
+
Expect request with wire names (
|
|
125
|
+
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
126
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
127
|
+
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
128
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
129
|
+
):
|
|
130
|
+
```
|
|
131
|
+
POST /upload HTTP/1.1
|
|
132
|
+
Content-Length: 428
|
|
133
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
134
|
+
|
|
135
|
+
--abcde12345
|
|
136
|
+
Content-Disposition: form-data; name="id"
|
|
137
|
+
Content-Type: text/plain
|
|
138
|
+
|
|
139
|
+
123
|
|
140
|
+
--abcde12345
|
|
141
|
+
Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
|
|
142
|
+
Content-Type: application/octet-stream;
|
|
143
|
+
|
|
144
|
+
{…file content of .jpg file…}
|
|
145
|
+
--abcde12345--
|
|
146
|
+
```
|
|
147
|
+
""")
|
|
148
|
+
@doc("Test content-type: multipart/form-data with wire names")
|
|
149
|
+
@post
|
|
150
|
+
@route("/mixed-parts-with-wire-name")
|
|
151
|
+
op withWireName(
|
|
152
|
+
@header contentType: "multipart/form-data",
|
|
153
|
+
@multipartBody body: MultiPartRequestWithWireName,
|
|
154
|
+
): NoContentResponse;
|
|
155
|
+
|
|
156
|
+
@scenario
|
|
157
|
+
@scenarioDoc("""
|
|
158
|
+
Please send request three times:
|
|
159
|
+
- First time with only id
|
|
160
|
+
- Second time with only profileImage
|
|
161
|
+
- Third time with both id and profileImage
|
|
162
|
+
|
|
163
|
+
Expect requests (
|
|
164
|
+
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
165
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
166
|
+
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
167
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
168
|
+
):
|
|
169
|
+
```
|
|
170
|
+
POST /upload HTTP/1.1
|
|
171
|
+
Content-Length: 428
|
|
172
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
173
|
+
|
|
174
|
+
--abcde12345
|
|
175
|
+
Content-Disposition: form-data; name="id"
|
|
176
|
+
Content-Type: text/plain
|
|
177
|
+
|
|
178
|
+
123
|
|
179
|
+
--abcde12345--
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
POST /upload HTTP/1.1
|
|
184
|
+
Content-Length: 428
|
|
185
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
186
|
+
|
|
187
|
+
--abcde12345
|
|
188
|
+
Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
|
|
189
|
+
Content-Type: application/octet-stream
|
|
190
|
+
|
|
191
|
+
{…file content of .jpg file…}
|
|
192
|
+
--abcde12345--
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
POST /upload HTTP/1.1
|
|
197
|
+
Content-Length: 428
|
|
198
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
199
|
+
|
|
200
|
+
--abcde12345
|
|
201
|
+
Content-Disposition: form-data; name="id"
|
|
202
|
+
Content-Type: text/plain
|
|
203
|
+
|
|
204
|
+
123
|
|
205
|
+
--abcde12345
|
|
206
|
+
Content-Disposition: form-data; name="profileImage"; filename="<any-or-no-name-is-ok>"
|
|
207
|
+
Content-Type: application/octet-stream
|
|
208
|
+
|
|
209
|
+
{…file content of .jpg file…}
|
|
210
|
+
--abcde12345--
|
|
211
|
+
```
|
|
212
|
+
""")
|
|
213
|
+
@doc("Test content-type: multipart/form-data with optional parts")
|
|
214
|
+
@post
|
|
215
|
+
@route("/optional-parts")
|
|
216
|
+
op optionalParts(
|
|
217
|
+
@header contentType: "multipart/form-data",
|
|
218
|
+
@multipartBody body: MultiPartOptionalRequest,
|
|
110
219
|
): NoContentResponse;
|
|
111
220
|
|
|
112
221
|
@scenario
|
|
113
222
|
@scenarioDoc("""
|
|
114
223
|
Expect request (
|
|
115
224
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
116
|
-
appropriate media type,
|
|
225
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
117
226
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
118
|
-
If there are duplicated filename in same fieldName,
|
|
227
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
119
228
|
):
|
|
120
229
|
```
|
|
121
230
|
POST /upload HTTP/1.1
|
|
@@ -166,16 +275,16 @@ namespace FormData {
|
|
|
166
275
|
@route("/complex-parts")
|
|
167
276
|
op fileArrayAndBasic(
|
|
168
277
|
@header contentType: "multipart/form-data",
|
|
169
|
-
@
|
|
278
|
+
@multipartBody body: ComplexPartsRequest,
|
|
170
279
|
): NoContentResponse;
|
|
171
280
|
|
|
172
281
|
@scenario
|
|
173
282
|
@scenarioDoc("""
|
|
174
283
|
Expect request (
|
|
175
284
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
176
|
-
appropriate media type,
|
|
285
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
177
286
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
178
|
-
If there are duplicated filename in same fieldName,
|
|
287
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
179
288
|
):
|
|
180
289
|
```
|
|
181
290
|
POST /upload HTTP/1.1
|
|
@@ -202,16 +311,16 @@ namespace FormData {
|
|
|
202
311
|
@route("/json-part")
|
|
203
312
|
op jsonPart(
|
|
204
313
|
@header contentType: "multipart/form-data",
|
|
205
|
-
@
|
|
314
|
+
@multipartBody body: JsonPartRequest,
|
|
206
315
|
): NoContentResponse;
|
|
207
316
|
|
|
208
317
|
@scenario
|
|
209
318
|
@scenarioDoc("""
|
|
210
319
|
Expect request (
|
|
211
320
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
212
|
-
appropriate media type,
|
|
321
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
213
322
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
214
|
-
If there are duplicated filename in same fieldName,
|
|
323
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
215
324
|
):
|
|
216
325
|
```
|
|
217
326
|
POST /upload HTTP/1.1
|
|
@@ -241,16 +350,16 @@ namespace FormData {
|
|
|
241
350
|
@route("/binary-array-parts")
|
|
242
351
|
op binaryArrayParts(
|
|
243
352
|
@header contentType: "multipart/form-data",
|
|
244
|
-
@
|
|
353
|
+
@multipartBody body: BinaryArrayPartsRequest,
|
|
245
354
|
): NoContentResponse;
|
|
246
355
|
|
|
247
356
|
@scenario
|
|
248
357
|
@scenarioDoc("""
|
|
249
358
|
Please send request twice, first time with only profileImage, second time with both profileImage and picture(
|
|
250
359
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
251
|
-
appropriate media type,
|
|
360
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
252
361
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
253
|
-
If there are duplicated filename in same fieldName,
|
|
362
|
+
If there are duplicated filename in same fieldName, server can't parse them all.
|
|
254
363
|
):
|
|
255
364
|
```
|
|
256
365
|
POST /upload HTTP/1.1
|
|
@@ -275,7 +384,7 @@ namespace FormData {
|
|
|
275
384
|
@route("/multi-binary-parts")
|
|
276
385
|
op multiBinaryParts(
|
|
277
386
|
@header contentType: "multipart/form-data",
|
|
278
|
-
@
|
|
387
|
+
@multipartBody body: MultiBinaryPartsRequest,
|
|
279
388
|
): NoContentResponse;
|
|
280
389
|
|
|
281
390
|
@scenario
|
|
@@ -304,16 +413,16 @@ namespace FormData {
|
|
|
304
413
|
@route("/check-filename-and-content-type")
|
|
305
414
|
op checkFileNameAndContentType(
|
|
306
415
|
@header contentType: "multipart/form-data",
|
|
307
|
-
@
|
|
416
|
+
@multipartBody body: MultiPartRequest,
|
|
308
417
|
): NoContentResponse;
|
|
309
418
|
|
|
310
419
|
@scenario
|
|
311
420
|
@scenarioDoc("""
|
|
312
421
|
Expect request (
|
|
313
422
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.4, content-type of file part shall be labeled with
|
|
314
|
-
appropriate media type,
|
|
423
|
+
appropriate media type, server will check it; content-type of other parts is optional, server will ignore it.
|
|
315
424
|
- according to https://datatracker.ietf.org/doc/html/rfc7578#section-4.2, filename of file part SHOULD be supplied.
|
|
316
|
-
If there are duplicated filename in same filedName,
|
|
425
|
+
If there are duplicated filename in same filedName, server can't parse them all.
|
|
317
426
|
):
|
|
318
427
|
```
|
|
319
428
|
POST /multipart/form-data/anonymous-model HTTP/1.1
|
|
@@ -333,7 +442,9 @@ namespace FormData {
|
|
|
333
442
|
@route("/anonymous-model")
|
|
334
443
|
op anonymousModel(
|
|
335
444
|
@header contentType: "multipart/form-data",
|
|
336
|
-
|
|
445
|
+
@multipartBody body: {
|
|
446
|
+
profileImage: HttpPart<bytes>;
|
|
447
|
+
},
|
|
337
448
|
): NoContentResponse;
|
|
338
449
|
|
|
339
450
|
namespace HttpParts {
|
|
@@ -412,7 +523,7 @@ namespace FormData {
|
|
|
412
523
|
}
|
|
413
524
|
@scenario
|
|
414
525
|
@scenarioDoc("""
|
|
415
|
-
For File part, filename will not be checked but it is necessary otherwise
|
|
526
|
+
For File part, filename will not be checked but it is necessary otherwise server can't parse it;
|
|
416
527
|
content-type will be checked with value "application/octet-stream". Expect request:
|
|
417
528
|
```
|
|
418
529
|
POST /upload HTTP/1.1
|
|
@@ -497,4 +608,91 @@ namespace FormData {
|
|
|
497
608
|
): NoContentResponse;
|
|
498
609
|
}
|
|
499
610
|
}
|
|
611
|
+
|
|
612
|
+
@route("/file")
|
|
613
|
+
namespace File {
|
|
614
|
+
model FileWithRequiredFilename extends TypeSpec.Http.File<"image/png"> {
|
|
615
|
+
filename: string;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
@scenario
|
|
619
|
+
@scenarioDoc("""
|
|
620
|
+
Test File type in multipart form data with specific content type.
|
|
621
|
+
Expected request:
|
|
622
|
+
```
|
|
623
|
+
POST /multipart/form-data/file/specific-content-type HTTP/1.1
|
|
624
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
625
|
+
|
|
626
|
+
--abcde12345
|
|
627
|
+
Content-Disposition: form-data; name="file"; filename="image.png"
|
|
628
|
+
Content-Type: image/png
|
|
629
|
+
|
|
630
|
+
{…file content of image.png…}
|
|
631
|
+
--abcde12345--
|
|
632
|
+
```
|
|
633
|
+
""")
|
|
634
|
+
@post
|
|
635
|
+
@route("/specific-content-type")
|
|
636
|
+
op uploadFileSpecificContentType(
|
|
637
|
+
@header contentType: "multipart/form-data",
|
|
638
|
+
@multipartBody body: {
|
|
639
|
+
file: HttpPart<TypeSpec.Http.File<"image/png">>;
|
|
640
|
+
},
|
|
641
|
+
): NoContentResponse;
|
|
642
|
+
|
|
643
|
+
@scenario
|
|
644
|
+
@scenarioDoc("""
|
|
645
|
+
Test File type in multipart form data with required filename.
|
|
646
|
+
Expected request:
|
|
647
|
+
```
|
|
648
|
+
POST /multipart/form-data/file/required-filename HTTP/1.1
|
|
649
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
650
|
+
|
|
651
|
+
--abcde12345
|
|
652
|
+
Content-Disposition: form-data; name="file"; filename="image.png"
|
|
653
|
+
Content-Type: image/png
|
|
654
|
+
|
|
655
|
+
{…file content of image.png…}
|
|
656
|
+
--abcde12345--
|
|
657
|
+
```
|
|
658
|
+
""")
|
|
659
|
+
@post
|
|
660
|
+
@route("/required-filename")
|
|
661
|
+
op uploadFileRequiredFilename(
|
|
662
|
+
@header contentType: "multipart/form-data",
|
|
663
|
+
@multipartBody body: {
|
|
664
|
+
file: HttpPart<FileWithRequiredFilename>;
|
|
665
|
+
},
|
|
666
|
+
): NoContentResponse;
|
|
667
|
+
|
|
668
|
+
@scenario
|
|
669
|
+
@scenarioDoc("""
|
|
670
|
+
Test multiple File instances in multipart form data.
|
|
671
|
+
Expected request:
|
|
672
|
+
```
|
|
673
|
+
POST /multipart/form-data/file/file-array HTTP/1.1
|
|
674
|
+
Content-Type: multipart/form-data; boundary=abcde12345
|
|
675
|
+
|
|
676
|
+
--abcde12345
|
|
677
|
+
Content-Disposition: form-data; name="files"; filename="image1.png"
|
|
678
|
+
Content-Type: image/png
|
|
679
|
+
|
|
680
|
+
{…file content of image.png…}
|
|
681
|
+
--abcde12345
|
|
682
|
+
Content-Disposition: form-data; name="files"; filename="image2.png"
|
|
683
|
+
Content-Type: image/png
|
|
684
|
+
|
|
685
|
+
{…file content of image.png…}
|
|
686
|
+
--abcde12345--
|
|
687
|
+
```
|
|
688
|
+
""")
|
|
689
|
+
@post
|
|
690
|
+
@route("/file-array")
|
|
691
|
+
op uploadFileArray(
|
|
692
|
+
@header contentType: "multipart/form-data",
|
|
693
|
+
@multipartBody body: {
|
|
694
|
+
files: HttpPart<TypeSpec.Http.File<"image/png">>[];
|
|
695
|
+
},
|
|
696
|
+
): NoContentResponse;
|
|
697
|
+
}
|
|
500
698
|
}
|