2013-06-28 7 views
3

는 : 입력 앱이 처리하는 정상 뭔가 그런대로입니다 :Compojure : 트랩 500 URL 디코딩 오류 나는이처럼 보이는 한 경로와 Compojure에서 웹 서비스를

"/myapp/dosomething/:input" 

이 때 잘 작동 단어, 숫자 자릿수 등이 있지만 쓰레기를 넣을 때

GET /myapp/dosomething/%25%24%25%5E%24%25%5E%25%24%5E 

나는 500 오류가 발생합니다. 내 질문은, 내가 어떻게이 함정에, 대신 400 반환?

HTTP ERROR 500 

Problem accessing /myapp/dosomething/%25%24%25%5E%24%25%5E%25%24%5E. Reason: 

    Server Error 
Caused by: 

java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "$%" 
at java.net.URLDecoder.decode(URLDecoder.java:192) 
at clout.core$path_decode.invoke(core.clj:33) 
at clout.core$path_decode.invoke(core.clj:31) 
at clojure.core$map$fn__4207.invoke(core.clj:2485) 
at clojure.lang.LazySeq.sval(LazySeq.java:42) 
at clojure.lang.LazySeq.seq(LazySeq.java:60) 
at clojure.lang.RT.seq(RT.java:484) 
at clojure.core$seq.invoke(core.clj:133) 
at clojure.core$map$fn__4211.invoke(core.clj:2490) 
at clojure.lang.LazySeq.sval(LazySeq.java:42) 
at clojure.lang.LazySeq.seq(LazySeq.java:60) 
at clojure.lang.RT.seq(RT.java:484) 
at clojure.core$seq.invoke(core.clj:133) 
at clojure.core.protocols$seq_reduce.invoke(protocols.clj:30) 
at clojure.core.protocols$fn__6026.invoke(protocols.clj:54) 
at clojure.core.protocols$fn__5979$G__5974__5992.invoke(protocols.clj:13) 
at clojure.core$reduce.invoke(core.clj:6177) 
at clout.core$assoc_keys_with_groups.invoke(core.clj:54) 
at clout.core.CompiledRoute.route_matches(core.clj:84) 
at compojure.core$if_route$fn__472.invoke(core.clj:38) 
at compojure.core$if_method$fn__465.invoke(core.clj:24) 
at compojure.core$routing$fn__490.invoke(core.clj:106) 
at clojure.core$some.invoke(core.clj:2443) 
at compojure.core$routing.doInvoke(core.clj:106) 
at clojure.lang.RestFn.applyTo(RestFn.java:139) 
at clojure.core$apply.invoke(core.clj:619) 
at compojure.core$routes$fn__494.invoke(core.clj:111) 
at ring.middleware.keyword_params$wrap_keyword_params$fn__710.invoke(keyword_params.clj:27) 
at ring.middleware.nested_params$wrap_nested_params$fn__749.invoke(nested_params.clj:65) 
at ring.middleware.params$wrap_params$fn__682.invoke(params.clj:55) 
at ring.middleware.multipart_params$wrap_multipart_params$fn__777.invoke(multipart_params.clj:103) 
at ring.middleware.flash$wrap_flash$fn__1064.invoke(flash.clj:14) 
at ring.middleware.session$wrap_session$fn__1055.invoke(session.clj:40) 
at ring.middleware.cookies$wrap_cookies$fn__986.invoke(cookies.clj:160) 
at vinws_chrome.servlet$_service$fn__116.invoke(servlet.clj:1) 
at ring.util.servlet$make_service_method$fn__54.invoke(servlet.clj:145) 
+2

오류를 재현하려고하지만 URL이 500이 아닙니다. 그냥'clout.core/path_decode'를 직접 호출하고 있는지 확인하십시오. 이것은''(경로 디코드/myapp/dosomething/% 25 % 24 % 25 % 5E % 24 % 25 % 5E % 25 % 24 % 5E ")'평가하는 것입니다. 그리고 이것은 반환 값입니다"/myapp/dosomething/% $ %^$ %^% $^"'. –

+1

@juan 오류가 약 % $ 불법 탈출 시퀀스라는 것을 고려하면 url이 이미 URL 구문 분석기에 전달되기 전에 이스케이프 처리되지 않은 것 같습니다. – Slartibartfast

+1

@Slartibartfast 나는 너무 생각 했으므로 '400 Bad Request'가 아닌 것입니다. a 500) 오류 "/ myapp/dosomething/% $ %^$ %^% $ ^"을 시도해보십시오. 어쩌면 REPL에서 링 앱을 실제로 실행하고 있기 때문에 다른 설정이있을 수도 있습니다. 우리가 똑같은 문제를 해결할 수 있는지 확인하고 싶습니다. –

답변

4

이 문제는 Lein 링 플러그인에 의해 생성 된 war 파일에서 발생하고 최근이 보고서의 결과로 Lein 링 0.8.6에서 수정되었습니다.

원인은 Java Servlet과 Ring이 path-info 필드를 처리하는 방법의 차이와 관련이 있습니다. Java Servlet 사양에는 컨텍스트 경로 url-encoded가 있지만 경로 정보는 디코딩됩니다. Ring은 :context:path-info 키를 모두 URL 인코딩으로 처리합니다.