输入流到Clojure环映射

输入流到Clojure环映射,clojure,ring,Clojure,Ring,我看到,当web浏览器连接到HTTP服务器时,会发送以下行: GET / HTTP/1.1 Content-Length: 13 Hello, world! 我想写一个程序,它接受一个InputStream,读取这些行并根据请求返回一个环请求映射 你能推荐一个Clojure图书馆吗?我快速查看了支持ring的web服务器源代码(例如),但到目前为止还没有成功。您可能希望查看Clojure Cookbook,或者更好的打印形式 这也是一本好书 我也有一个“你好世界” 以下是使用底座的请求图示

我看到,当web浏览器连接到HTTP服务器时,会发送以下行:

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显然不是非法的,但是服务器应该忽略主体。