metosin / metosin/compojure-api
inconsistency in resource vs. macro based route definition behaviour
Nessuno ha ancora preso questa issue.
- Lingua principale
- Clojure
- Stelle
- 1.1k
- Fork
- 146
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
When making:
```
curl -X POST \
'http://localhost:7777/foo?rule_name=foo.logic&force_overwrite=true&version=1.1' \
-H 'accept: application/json' \
-H 'cache-control: no-cache' \
-H 'content-type: text/plain' \
-d 'bla'
```
the following definition behaves correctly:
```
(POST "/foo" []
:middleware [[muuntaja.middleware/wrap-format
(muuntaja/create
(assoc-in muuntaja/default-options
[:formats "text/plain"] text-plain-format))]]
:query-params [version :- String, rule_name :- String, force_overwrite :- String]
:body [b s/Str]
:return s/Any
(ok
{:ok b})
```
on other hand this one is failing
```
(context "/foo" []
(resource {
:post {
:middleware [[muuntaja.middleware/wrap-format
(muuntaja/create
(assoc-in muuntaja/default-options
[:formats "text/plain"] text-plain-format))]]
:parameters {:body-params String
:query-params {:version s/Str
:rule_name s/Str
:force_overwrite s/Str}}
:consumes ["text/plain"]
:responses {http-status/ok {:schema s/Any}}
:handler (fn [{body :body-params {:keys [version rule_name]} :path-params}]
(ok
{:foo body}
))}}))
```
the error is:
```
{
"schema": "java.lang.String",
"errors": "(not (instance? java.lang.String nil))",
"type": "compojure.api.exception/request-validation",
"coercion": "schema",
"value": null,
"in": [
"request",
"body-params"
]
}
```
I use this auxiliary fun:
```
(def text-plain-format
{:decoder [(fn make-json-decoder [options]
(fn [x ^String charset]
(if (string? x)
x
(slurp (InputStreamReader. ^InputStream x charset)))))]
:encoder [(fn make-json-encoder [options]
(fn [data ^String charset]
(ByteArrayInputStream. (.getBytes data charset))))]})
```
Guida per i contributori
Apri 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.
Direzione di ricerca
Riproduci la richiesta curl POST /foo, quindi confronta la route basata su macro con la definizione di context/resource. Inizia dalla validazione del parametro del body della route del resource e dal middleware personalizzato text/plain; il lavoro è completo quando entrambe le forme della route gestiscono la stessa richiesta in modo coerente senza l'errore di validazione String nil.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- clojure
- Ambito
- api, backend
- Tipo di issue
- Bug
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100