输入流到Clojure环映射
我看到,当web浏览器连接到HTTP服务器时,会发送以下行:输入流到Clojure环映射,clojure,ring,Clojure,Ring,我看到,当web浏览器连接到HTTP服务器时,会发送以下行: GET / HTTP/1.1 Content-Length: 13 Hello, world! 我想写一个程序,它接受一个InputStream,读取这些行并根据请求返回一个环请求映射 你能推荐一个Clojure图书馆吗?我快速查看了支持ring的web服务器源代码(例如),但到目前为止还没有成功。您可能希望查看Clojure Cookbook,或者更好的打印形式 这也是一本好书 我也有一个“你好世界” 以下是使用底座的请求图示
GET / HTTP/1.1
Content-Length: 13
Hello, world!
我想写一个程序,它接受一个InputStream
,读取这些行并根据请求返回一个环请求映射
你能推荐一个Clojure图书馆吗?我快速查看了支持ring的web服务器源代码(例如),但到目前为止还没有成功。您可能希望查看Clojure Cookbook,或者更好的打印形式 这也是一本好书 我也有一个“你好世界”
以下是使用底座的请求图示例:
request =>
{:protocol "HTTP/1.1",
:async-supported? true,
:remote-addr "127.0.0.1",
:servlet-response
#object[io.pedestal.test$test_servlet_response$reify__34946 0x3e71aa38 "io.pedestal.test$test_servlet_response$reify__34946@3e71aa38"],
:servlet
#object[io.pedestal.http.servlet.FnServlet 0x7168112e "io.pedestal.http.servlet.FnServlet@7168112e"],
:headers {"content-length" "0", "content-type" ""},
:server-port -1,
:servlet-request
#object[io.pedestal.test$test_servlet_request$reify__34934 0x3422eca "io.pedestal.test$test_servlet_request$reify__34934@3422eca"],
:content-length 0,
:content-type "",
:path-info "/echo/abcdef/12345",
:character-encoding "UTF-8",
:url-for #<Delay@5190186c: :not-delivered>,
:uri "/echo/abcdef/12345",
:server-name nil,
:query-string nil,
:path-params {:list-id "abcdef", :item-id "12345"},
:body
#object[io.pedestal.test.proxy$javax.servlet.ServletInputStream$ff19274a 0x2aff7cc4 "io.pedestal.test.proxy$javax.servlet.ServletInputStream$ff19274a@2aff7cc4"],
:scheme nil,
:request-method :get,
:context-path ""}
不知道你到底想要什么。。。。。?如果您真的想从头开始解析,您可能希望阅读Clojure食谱,或者更好地阅读印刷版 这也是一本好书 我也有一个“你好世界”
以下是使用底座的请求图示例:
request =>
{:protocol "HTTP/1.1",
:async-supported? true,
:remote-addr "127.0.0.1",
:servlet-response
#object[io.pedestal.test$test_servlet_response$reify__34946 0x3e71aa38 "io.pedestal.test$test_servlet_response$reify__34946@3e71aa38"],
:servlet
#object[io.pedestal.http.servlet.FnServlet 0x7168112e "io.pedestal.http.servlet.FnServlet@7168112e"],
:headers {"content-length" "0", "content-type" ""},
:server-port -1,
:servlet-request
#object[io.pedestal.test$test_servlet_request$reify__34934 0x3422eca "io.pedestal.test$test_servlet_request$reify__34934@3422eca"],
:content-length 0,
:content-type "",
:path-info "/echo/abcdef/12345",
:character-encoding "UTF-8",
:url-for #<Delay@5190186c: :not-delivered>,
:uri "/echo/abcdef/12345",
:server-name nil,
:query-string nil,
:path-params {:list-id "abcdef", :item-id "12345"},
:body
#object[io.pedestal.test.proxy$javax.servlet.ServletInputStream$ff19274a 0x2aff7cc4 "io.pedestal.test.proxy$javax.servlet.ServletInputStream$ff19274a@2aff7cc4"],
:scheme nil,
:request-method :get,
:context-path ""}
不知道你到底想要什么。。。。。?如果您真的想从头开始解析,.如果您正在寻找一个库来将文本HTTP输入转换为Ring请求映射,只需搜索Ring,用于处理HTTP和生成环请求映射的premiere库。如果您正在寻找将文本HTTP输入转换为环请求映射的库,请不要再搜索Ring,即用于处理HTTP和生成环请求映射的premiere库。这当然可以通过HTTP工具包库实现。但有两个问题:
org.httpkit.server.clojurring
是私有的。您必须通过反射来访问它的方法李>
:远程地址
值是从分配给请求的InetSocketAddress
对象读取的,或者您需要在请求字符串中包含X-Forwarded-For
头(let [request "POST / HTTP/1.1\nContent-Length: 13\nX-Forwarded-For: 127.0.0.1\n\nHello, world!"
bytes (java.nio.ByteBuffer/wrap (.getBytes request))
decoder (org.httpkit.server.HttpDecoder.
8388608 4096 ProxyProtocolOption/DISABLED)
method (.getMethod org.httpkit.server.ClojureRing
"buildRequestMap"
(into-array [org.httpkit.server.HttpRequest]))]
(.setAccessible method true)
(.invoke method nil (object-array [(.decode decoder bytes)])))
=>
{:remote-addr "127.0.0.1",
:headers {"content-length" "13", "x-forwarded-for" "127.0.0.1"},
:async-channel nil,
:server-port 80,
:content-length 13,
:websocket? false,
:content-type nil,
:character-encoding "utf8",
:uri "/",
:server-name nil,
:query-string nil,
:body #object[org.httpkit.BytesInputStream 0x4f078b2 "BytesInputStream[len=13]"],
:scheme :http,
:request-method :post}
这当然可以通过http工具包库实现。但有两个问题:
org.httpkit.server.clojurring
是私有的。您必须通过反射来访问它的方法李>
:远程地址
值是从分配给请求的InetSocketAddress
对象读取的,或者您需要在请求字符串中包含X-Forwarded-For
头(let [request "POST / HTTP/1.1\nContent-Length: 13\nX-Forwarded-For: 127.0.0.1\n\nHello, world!"
bytes (java.nio.ByteBuffer/wrap (.getBytes request))
decoder (org.httpkit.server.HttpDecoder.
8388608 4096 ProxyProtocolOption/DISABLED)
method (.getMethod org.httpkit.server.ClojureRing
"buildRequestMap"
(into-array [org.httpkit.server.HttpRequest]))]
(.setAccessible method true)
(.invoke method nil (object-array [(.decode decoder bytes)])))
=>
{:remote-addr "127.0.0.1",
:headers {"content-length" "13", "x-forwarded-for" "127.0.0.1"},
:async-channel nil,
:server-port 80,
:content-length 13,
:websocket? false,
:content-type nil,
:character-encoding "utf8",
:uri "/",
:server-name nil,
:query-string nil,
:body #object[org.httpkit.BytesInputStream 0x4f078b2 "BytesInputStream[len=13]"],
:scheme :http,
:request-method :post}
您能告诉我Ring的哪一部分处理文本http解析吗?将文本发送到Ring/Jetty Web服务器进程中,并使用一个处理程序为您提供请求映射。这似乎有点间接,但是,与尝试重新实现HTTP解析以及Ring和Jetty一样,它听起来更不容易出错。我担心将请求发送到Jetty Web服务器是解析流的一种繁重方式。您能告诉我Ring的哪一部分处理文本HTTP解析吗?将文本发送到正在处理的Ring/Jetty Web服务器,使用提供请求映射的处理程序。这似乎有点间接,但听起来比尝试重新实现HTTP解析以及Ring和Jetty更不容易出错。恐怕将请求发送到Jetty Web服务器是解析流的一种繁重方式。我已经知道Ring映射的外观,谢谢。然而,我很难解析并将流输入到环形映射中。你对底座的哪一部分可以用来解析有什么建议吗?你的最后一个链接断了!我已经知道环形地图是什么样子了,谢谢。然而,我很难解析并将流输入到环形映射中。你对底座的哪一部分可以用来解析有什么建议吗?你的最后一个链接断了!顺便说一下,这是一个非常奇怪的HTTP请求。带有主体的GET显然不是非法的,但是服务器应该忽略主体。顺便说一下,这是一个非常奇怪的HTTP请求。使用主体进行GET显然不是非法的,但是服务器应该忽略主体。