Adding encoding section breaks model generation for multipart/form-data requests
- Dominant language
- C#
- Stars
- 3.8k
- Forks
- 333
- Avg merge
- 16h 29m
- Merged PRs (30d)
- 116
Description
### What are you generating using Kiota, clients or plugins?
API Client/SDK
### In what context or format are you using Kiota?
Nuget tool
### Client library/SDK language
Csharp
### Describe the bug
There is a small possibility this is related to: https://github.com/microsoft/kiota/issues/6451 (issue is closed, but the bug still exists)
When there is an endpoint in the OpenAPI spec that uses the multipart/form-data content type, and that part of the spec includes an encoding section that defines one but not all of the properties of the request, the generator will fail to generate models for properties of the request that do not have an encoding defined. If you completely remove the encoding section, the generator will generate the model for all properties. If you add an encoding for the property that doesn't get a model generated, it will then generate a model.
### Expected behavior
If the endpoint has an encoding section, and a property of a multipart/form-data request does not have an encoding defined, it should still generate a model for that property in the same way it does when there is no encoding section at all.
### How to reproduce
Save the Open API description file below to repro-api.yaml, then run this command:
dotnet tool run kiota generate --backing-store --exclude-backward-compatible --clean-output -l CSharp --dvr All -c UserClient -n KiotaContentTypeBugRepo -d ./repro-api.yaml -o ./KiotaContentTypeBugRepo
Expected a model created for #/components/schemas/create-user-info-request but none is generated.
Remove the encoding section from the Open API spec, and run the generator again.
Notice the model is now generated.
### Open API description file
```
openapi: 3.0.3
info:
title: User-API
description: External api for users
version: "1.0"
servers:
- url: https://example.com/api
paths:
/users:
post:
tags:
- create
operationId: create-user
requestBody:
content:
multipart/form-data:
schema:
required:
- template
- info
type: object
properties:
info:
$ref: "#/components/schemas/create-user-info-request"
template:
$ref: "#/components/schemas/user-email-template"
encoding:
template:
contentType: text/html
style: form
responses:
"201":
description: Created
"400":
description: Bad Request
components:
schemas:
create-user-info-request:
title: create-user-info-request
required:
- firstName
- lastName
type: object
properties:
firstName:
type: string
lastName:
type: string
x-internal: false
user-email-template:
title: user-email-template
type: string
format: binary
```
### Kiota Version
1.30.0+6ccf6da832742181cba0ab02588c5795b2185e13
### Latest Kiota version known to work for scenario above?(Not required)
_No response_
### Known Workarounds
We have to remove the encoding section or add an encoding for the missing model schema. This is not ideal as the Open API spec we're using is from a third party, and we'd prefer to minimize the number of manual edits of the spec we have to do before generating the client.
### Configuration
- OS: Windows 11
- Architecture: x64
- Doesn't appear to be specific to this configuration
### Debug output
```
info: Kiota.Builder.KiotaBuilder[659500454]
Cleaning output directory C:\Users\username\source\repos\sandbox\KiotaContentTypeBugRepo\KiotaContentTypeBugRepo\.\KiotaContentTypeBugRepo
dbug: Kiota.Builder.KiotaBuilder[1405590561]
kiota version 1.30.0
info: Kiota.Builder.KiotaBuilder[1423726202]
loaded description from local source
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 1 - reading the stream - took 00:00:00.0092098
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 2 - parsing the document - took 00:00:00.0598683
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 3 - updating generation configuration from kiota extension - took 00:00:00.0000810
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 4 - filtering API paths with patterns - took 00:00:00.0028770
info: Kiota.Builder.KiotaBuilder[543457275]
Client root URL set to https://example.com/api
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 5 - checking whether the output should be updated - took 00:00:00.0249451
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 6 - create uri space - took 00:00:00.0039850
dbug: Kiota.Builder.KiotaBuilder[1605292753]
InitializeInheritanceIndex 00:00:00.0091914
dbug: Kiota.Builder.KiotaBuilder[1605292753]
CreateRequestBuilderClass 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
MapTypeDefinitions 00:00:00.0050084
dbug: Kiota.Builder.KiotaBuilder[1605292753]
TrimInheritedModels 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
CleanUpInternalState 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 7 - create source model - took 00:00:00.0880633
dbug: Kiota.Builder.KiotaBuilder[1306343761]
18ms: Language refinement applied
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 8 - refine by language - took 00:00:00.0224810
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 9 - writing files - took 00:00:00.0269109
info: Kiota.Builder.KiotaBuilder[1423726202]
loaded description from local source
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 10 - writing lock file - took 00:00:00.0128555
Generation completed successfully
Client base url set to https://example.com/api
dbug: Kiota.Builder.KiotaBuilder[2121673205]
Api manifest path: C:\Users\username\source\repos\sandbox\KiotaContentTypeBugRepo\KiotaContentTypeBugRepo\apimanifest.json
Hint: use the info command to get the list of dependencies you need to add to your project.
Example: kiota info -d "C:\Users\username\source\repos\sandbox\KiotaContentTypeBugRepo\KiotaContentTypeBugRepo\.\repro-api.yaml" -l CSharp
Hint: use the --include-path and --exclude-path options with glob patterns to filter the paths generated.
Example: kiota generate --include-path "**/foo" -d "C:\Users\username\source\repos\sandbox\KiotaContentTypeBugRepo\KiotaContentTypeBugRepo\.\repro-api.yaml"
```
### Other information
_No response_
Contributor guide
Research direction
Start by saving the supplied OpenAPI description as repro-api.yaml and running the documented dotnet tool run kiota generate command. Trace multipart/form-data handling when the encoding section omits a property, comparing generation with and without that section. Done means the create-user-info-request model is generated in both cases, including its firstName and lastName properties.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- csharp
- Domain
- api, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 48/100