-! Copyright (C) 2007, 2009 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: namespaces kernel assocs io.files io.streams.duplex\r
-combinators arrays io.launcher io.encodings io.encodings.binary io\r
-http.server.static http.server http accessors sequences strings\r
-math.parser fry urls urls.encoding calendar make ;\r
-IN: http.server.cgi\r
-\r
-: cgi-variables ( script-path -- assoc )\r
- #! This needs some work.\r
- [\r
- "CGI/1.0" "GATEWAY_INTERFACE" ,,\r
- "HTTP/" request get version>> append "SERVER_PROTOCOL" ,,\r
- "Factor" "SERVER_SOFTWARE" ,,\r
-\r
- [ "PATH_TRANSLATED" ,, ] [ "SCRIPT_FILENAME" ,, ] bi\r
-\r
- url get path>> "SCRIPT_NAME" ,,\r
-\r
- url get host>> "SERVER_NAME" ,,\r
- url get port>> number>string "SERVER_PORT" ,,\r
- "" "PATH_INFO" ,,\r
- "" "REMOTE_HOST" ,,\r
- "" "REMOTE_ADDR" ,,\r
- "" "AUTH_TYPE" ,,\r
- "" "REMOTE_USER" ,,\r
- "" "REMOTE_IDENT" ,,\r
-\r
- request get method>> "REQUEST_METHOD" ,,\r
- url get query>> assoc>query "QUERY_STRING" ,,\r
- request get "cookie" header "HTTP_COOKIE" ,,\r
-\r
- request get "user-agent" header "HTTP_USER_AGENT" ,,\r
- request get "accept" header "HTTP_ACCEPT" ,,\r
-\r
- post-request? [\r
- request get post-data>> data>>\r
- [ "CONTENT_TYPE" ,, ]\r
- [ length number>string "CONTENT_LENGTH" ,, ]\r
- bi\r
- ] when\r
- ] H{ } make ;\r
-\r
-: <cgi-process> ( name -- desc )\r
- <process>\r
- over 1array >>command\r
- swap cgi-variables >>environment\r
- 1 minutes >>timeout ;\r
-\r
-: serve-cgi ( name -- response )\r
- <raw-response>\r
- 200 >>code\r
- "CGI output follows" >>message\r
- swap '[\r
- binary encode-output\r
- output-stream get _ <cgi-process> binary <process-stream> [\r
- post-request? [ request get post-data>> data>> write flush ] when\r
- '[ _ stream-write ] each-block\r
- ] with-stream\r
- ] >>body ;\r
-\r
-SLOT: special\r
-\r
-: enable-cgi ( responder -- responder )\r
- [ serve-cgi ] "application/x-cgi-script"\r
- pick special>> set-at ;\r
+! Copyright (C) 2007, 2009 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: namespaces kernel assocs io.files io.streams.duplex
+combinators arrays io.launcher io.encodings io.encodings.binary io
+http.server.static http.server http accessors sequences strings
+math.parser fry urls urls.encoding calendar make ;
+IN: http.server.cgi
+
+: cgi-variables ( script-path -- assoc )
+ #! This needs some work.
+ [
+ "CGI/1.0" "GATEWAY_INTERFACE" ,,
+ "HTTP/" request get version>> append "SERVER_PROTOCOL" ,,
+ "Factor" "SERVER_SOFTWARE" ,,
+
+ [ "PATH_TRANSLATED" ,, ] [ "SCRIPT_FILENAME" ,, ] bi
+
+ url get path>> "SCRIPT_NAME" ,,
+
+ url get host>> "SERVER_NAME" ,,
+ url get port>> number>string "SERVER_PORT" ,,
+ "" "PATH_INFO" ,,
+ "" "REMOTE_HOST" ,,
+ "" "REMOTE_ADDR" ,,
+ "" "AUTH_TYPE" ,,
+ "" "REMOTE_USER" ,,
+ "" "REMOTE_IDENT" ,,
+
+ request get method>> "REQUEST_METHOD" ,,
+ url get query>> assoc>query "QUERY_STRING" ,,
+ request get "cookie" header "HTTP_COOKIE" ,,
+
+ request get "user-agent" header "HTTP_USER_AGENT" ,,
+ request get "accept" header "HTTP_ACCEPT" ,,
+
+ post-request? [
+ request get post-data>> data>>
+ [ "CONTENT_TYPE" ,, ]
+ [ length number>string "CONTENT_LENGTH" ,, ]
+ bi
+ ] when
+ ] H{ } make ;
+
+: <cgi-process> ( name -- desc )
+ <process>
+ over 1array >>command
+ swap cgi-variables >>environment
+ 1 minutes >>timeout ;
+
+: serve-cgi ( name -- response )
+ <raw-response>
+ 200 >>code
+ "CGI output follows" >>message
+ swap '[
+ binary encode-output
+ output-stream get _ <cgi-process> binary <process-stream> [
+ post-request? [ request get post-data>> data>> write flush ] when
+ '[ _ stream-write ] each-block
+ ] with-stream
+ ] >>body ;
+
+SLOT: special
+
+: enable-cgi ( responder -- responder )
+ [ serve-cgi ] "application/x-cgi-script"
+ pick special>> set-at ;