Clojure Immutant 2服务器Undertow;如何处理http POST? [英] Clojure Immutant 2 server Undertow; how to handle http POST?

查看:682
本文介绍了Clojure Immutant 2服务器Undertow;如何处理http POST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将以下行添加到我的 compojure 中可以使用来使用 clojure-paypal-ipn 调用这两个处理函数。

Putting the following line into my compojure defroutes to use clojure-paypal-ipn calling the two handler functions.

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

code> POST

How do I handle a POST request within Immutant?

我在Clojure 1.7-beta1上使用Immutant 2.0并构建了Immutant功能演示。

I'm using Immutant 2.0 with Clojure 1.7-beta1 and building off the Immutant feature demo. Posting directly with cURL give these same results, although I'm trying to use PayPal IPN.

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]


推荐答案

我不认为这是一个问题不明处理POST。在向IPN处理程序分派期间发生该问题,该处理程序试图在Undertow的 InputStream 上调用 reset 。我希望流的 markSupported 方法返回false。我不清楚为什么要重置被调用这里,因为它不出现 mark 被调用。不熟悉这个库,我可能建议缓冲输入某种程度上...可能直接调用 parse-paypal-ipn-string ?我真的只是猜测,但。

I don't think this is necessarily a problem with Immutant handling a POST. The problem occurs during the dispatch to the IPN handler, which is attempting to invoke reset on Undertow's InputStream. I would expect the stream's markSupported method to return false. It's not clear to me why reset is being called here, since it doesn't appear mark is ever called. Without being familiar with that library, I might suggest buffering the input somehow... maybe invoke parse-paypal-ipn-string directly? I'm really just guessing, though.

这篇关于Clojure Immutant 2服务器Undertow;如何处理http POST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆