Snippets for a multipart request documented with WebTestClient include both the raw body and the parts
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Ambito
- documentation, testing
Direzione di ricerca
Start by comparing WebTestClientRequestConverter with MockMvcRequestConverter, which builds multipart requests with empty content, and reproduce the bad output with WebTestClientRestDocumentationIntegrationTests.multipart(). Check how CurlRequestSnippet, HttpieRequestSnippet and HttpRequestSnippet handle requests that have parts. Done means the curl, HTTPie and HTTP snippets are usable for WebTestClient multipart requests. The issue asks the maintainer to choose between the two fixes first, so confirm that choice before editing.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
When a multipart request is documented with WebTestClient, the curl, HTTPie, and HTTP request snippets can't be used as they are. This can be reproduced with the existing WebTestClientRestDocumentationIntegrationTests.multipart() test, which only checks request-parts.adoc. On 4.0.x, it produces the following snippets (the boundary is shortened here):
curl-request.adoc
$ curl 'https://api.example.com/upload' -i -X POST \
-H 'Content-Type: multipart/form-data;boundary=abnXMtqL…' \
-F 'a=alpha;type=text/plain;charset=UTF-8' \
-F 'b=bravo;type=text/plain;charset=UTF-8' \
-d '--abnXMtqL…
Content-Disposition: form-data; name="a"
…
--abnXMtqL…--
'
curl refuses to run this command because it contains both -F and -d:
Warning: You can only select one HTTP request method! You asked for both POST
Warning: (-d, --data) and multipart formpost (-F, --form).
The boundary in the -H option also doesn't match the boundary that curl generates for the -F parts.
httpie-request.adoc
$ echo '--abnXMtqL…
…
--abnXMtqL…--
' | http --multipart POST 'https://api.example.com/upload' \
'a'='alpha' \
'b'='bravo'
HTTPie doesn't allow a request body from stdin to be combined with request items such as 'a'='alpha'.
http-request.adoc
POST /upload HTTP/1.1
Content-Type: multipart/form-data;boundary=abnXMtqL…; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
…
--abnXMtqL…
The Content-Type header has two boundary parameters, and the second one, which is added by the snippet, doesn't match the body.
Cause
MockMvcRequestConverter creates a multipart OperationRequest with empty content and the parts, and the snippets are written with that in mind. WebTestClientRequestConverter creates it with both the raw multipart body (result.getRequestBodyContent()) and the parts that are parsed from it. As a result:
CurlRequestSnippetwrites-Ffor each part and also writes-dfor the content. It also keeps the request'smultipart/form-dataContent-Typeheader.HttpieRequestSnippetpipes the content to stdin and also writes each part as a request item.HttpRequestSnippetwrites the content instead of the parts. Because there are parts, it also appends its ownboundaryto theContent-Typeheader, even though there's already one.
In main, RestTestClientRequestConverter does the same as WebTestClientRequestConverter.
Possible fixes
I can see two ways to fix this, and I'd like to know which you'd prefer before opening a pull request:
- In the converters: when the parts are parsed successfully,
WebTestClientRequestConverter(andRestTestClientRequestConverterinmain) would create the request with empty content, which is whatMockMvcRequestConverterdoes. This is limited to the converters, and the snippets wouldn't need to change. However, it changes the request that's passed to user preprocessors and snippets. For example, therequest-bodysnippet for a multipart request would be empty, as it already is with MockMvc. - In the snippets: when a request has parts,
CurlRequestSnippetwould not write-dor themultipart/form-dataContent-Typeheader,HttpieRequestSnippetwould not use stdin, andHttpRequestSnippetwould write the parts and replace any existingboundaryinstead of appending another one. The converters wouldn't change, but there are more changes and they're spread across three snippets.
I think the first option is the more consistent one, but I may be missing a reason why the WebTestClient converter keeps the raw content. Please let me know if either of these looks right to you.
- Lingua principale
- Java
- Stelle
- 1.2k
- Fork
- 733
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di spring-projects/spring-restdocs
-
Support extracting Bean Validation constraints from method parametersForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertastatus: waiting-for-triage
Difficoltà 5/5 Più di una settimana Idoneità per principianti 45/100
spring-projects/spring-restdocs#1026 · 2 commenti ·
-
status: blocked status: waiting-for-triage
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
spring-projects/spring-restdocs#953 · 7 commenti ·
-
Add support for modifying a URI's path during pre-processingForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Apertatype: enhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
-
status: feedback-provided status: waiting-for-triage
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
spring-projects/spring-restdocs#937 · 4 commenti ·
-
type: enhancement
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
spring-projects/spring-restdocs#887 · 2 commenti · 1 reazione ·
Tutte le issue di spring-projects/spring-restdocs
Issue simili
-
pdfium-drift
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
Stirling-Tools/JPDFium#188 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
openremote/openremote#3487 · 1 commento ·
-
Type/Bug U2
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
wso2/product-is#28675 ·
I maintainer di solito rispondono entro 1 giorno
-
a:bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
erupts/erupt#460 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno