Clojure Immutant 2 服务器 Undertow;如何处理http POST?

标签 clojure http-post paypal-ipn undertow immutant

将以下行放入我的 compojure defroutes 中,以使用 clojure-paypal-ipn 调用两个处理函数。

(POST "/paypal/ipn" [] (make-ipn-handler payment/paypal-data payment/paypal-error))

如何在 Immutant 中处理 POST 请求?

我正在使用 Immutant 2.0 和 Clojure 1.7-beta1 并构建 Immutant 功能演示。尽管我尝试使用 PayPal IPN,但直接使用 cURL 发布会给出相同的结果。

17:29:40.220 ERROR [io.undertow.request] (XNIO-1 task-1) Undertow request failed HttpServerExchange{ POST /paypal/ipn}
java.io.IOException: mark/reset not supported
    at java.io.InputStream.reset(InputStream.java:348) ~[na:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45]
    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93) ~[clojure-1.7.0-beta1.jar:na]
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:313) ~[clojure-1.7.0-beta1.jar:na]
    at clojure_paypal_ipn.core$req__GT_raw_body_str.invoke(core.clj:59) ~[na:na]
    at clojure_paypal_ipn.core$make_ipn_handler$fn__16823.invoke(core.clj:69) ~[na:na]
    at compojure.response$eval6101$fn__6102.invoke(response.clj:34) ~[na:na]
    at compojure.response$eval6068$fn__6069$G__6059__6076.invoke(response.clj:7) ~[na:na]
    at compojure.core$make_route$fn__7513.invoke(core.clj:113) ~[na:na]
    at compojure.core$wrap_route_middleware$fn__7509.invoke(core.clj:103) ~[na:na]
    at compojure.core$if_route$fn__7488.invoke(core.clj:41) ~[na:na]
    at compojure.core$if_method$fn__7480.invoke(core.clj:27) ~[na:na]
    at compojure.core$routing$fn__7519.invoke(core.clj:127) ~[na:na]
    at clojure.core$some.invoke(core.clj:2568) ~[clojure-1.7.0-beta1.jar:na]
    at compojure.core$routing.doInvoke(core.clj:127) ~[na:na]
    at clojure.lang.RestFn.applyTo(RestFn.java:139) ~[clojure-1.7.0-beta1.jar:na]
    at clojure.core$apply.invoke(core.clj:630) ~[clojure-1.7.0-beta1.jar:na]
    at compojure.core$routes$fn__7523.invoke(core.clj:132) ~[na:na]
    at immutant.web.internal.undertow$wrap_undertow_session$fn__5292.invoke(undertow.clj:69) ~[na:na]
    at immutant.web.internal.undertow$create_http_handler$reify__5362.handleRequest(undertow.clj:130) ~[na:na]
    at org.projectodd.wunderboss.web.async.websocket.UndertowWebsocket$2.handleRequest(UndertowWebsocket.java:96) ~[wunderboss-web-0.6.1.jar:na]
    at io.undertow.server.session.SessionAttachmentHandler.handleRequest(SessionAttachmentHandler.java:68) ~[undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) ~[undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) ~[undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_45]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

最佳答案

我认为这不一定是 Immutant 处理 POST 的问题。问题发生在分派(dispatch)到 IPN 处理程序期间,该处理程序尝试在 Undertow 的 InputStream 上调用 reset。我希望流的 markSupported 方法返回 false。我不清楚为什么调用重置 here ,因为它似乎没有被调用过 mark 。如果不熟悉该库,我可能会建议以某种方式缓冲输入......也许直接调用 parse-paypal-ipn-string ?不过我真的只是猜测。

关于Clojure Immutant 2 服务器 Undertow;如何处理http POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834778/

相关文章:

emacs - 如何在 Clojure 模式下导航到当前缓冲区中的函数

java - GC Clojure/Java/JVM 内存设置

javascript - 如何使用 Angular 中的 POST 上传文件?

javascript - 如何等待下一个POST请求

Paypal 一次性无效 ipn?

php - Paypal 订阅 "custom"变量问题(沙盒)

lisp - 为什么 Clojure 除了 "keywords"之外还有 "symbols"?

clojure - Clojure 中更高效的 split-with

http-post - Google Analytics 使用 gif get 请求为什么不使用 post 请求?

transactions - Paypal IPN 返回空字符串而不是 "VERIFIED"或 "INVALID"