===================================================================
RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/httpd.sm1,v
retrieving revision 1.13
retrieving revision 1.16
diff -u -p -r1.13 -r1.16
--- OpenXM/src/kan96xx/Doc/httpd.sm1 2002/11/03 12:43:03 1.13
+++ OpenXM/src/kan96xx/Doc/httpd.sm1 2005/02/27 05:28:05 1.16
@@ -1,4 +1,4 @@
-%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd.sm1,v 1.12 2002/10/30 13:23:06 takayama Exp $
+%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd.sm1,v 1.15 2002/11/10 07:00:03 takayama Exp $
%% common modules for httpd on sm1.
/Oxserver_history_variable (Oxserver_history_variable_) def
/httpd.image.type
@@ -82,6 +82,7 @@ def
/httpd.serial 0 def
/httpd.history [ ] def
/httpd.result.history [ 0 ] def
+ [(nobody)] extension pop
{
httpd_startserver ;
httpd_action ;
@@ -286,27 +287,6 @@ def
} ifelse
-%% Decompose into tokens separated by a space.
-%% (GET /hoge.jpeg ???) ---> [(GET) (/hoge.jpeg) (???)]
-/toTokensBySpace {
- /arg1 set
- [/in-toTokesBySpace /ss /ss2 /i] pushVariables
- [
- /ss arg1 def
- ss 1 copy /ss set
- ss (array) dc /ss2 set
- 0 1 ss2 length 1 sub {
- /i set
- ss2 i get 32 eq { %% equal to space
- ss i (,) put
- } { } ifelse
- } for
- httpd.debug { ss message } { } ifelse
- [ ss to_records pop] /arg1 set
- ] pop
- popVariables
- arg1
-} def
/askToSendFile {
/arg1 set
@@ -629,6 +609,17 @@ def
tname s i0 get append /tname set
} for
+ %% Remove space and cr/lf from the key word.
+ [
+ 0 1 tname length 1 sub {
+ /j set
+ tname j get 36 le {
+ } {
+ tname j get
+ } ifelse
+ } for
+ ] /tname set
+
/j 0 def
i0 1 s length 1 sub {
/i set
@@ -642,7 +633,173 @@ def
/ans set
/httpd.exit
+ ans length 1 lt {
+ /ans [(Unknown)] def
+ } { } ifelse
/arg1 ans def
+ ] pop
+ popVariables
+ arg1
+} def
+
+/httpd.root [(getenv) (OXWEB_HTTPD_ROOT)] extension def
+%% /usr/local/www/data/ Assume slash!!
+
+% [(GET-file) (filename)] httpd_sendfile
+% [(MSG) (message)] httpd_sendfile
+/httpd_sendfile {
+ /arg1 set
+ [/in-htpd_sendfile /msg /fname /fname2
+ /fsize
+ ] pushVariables
+ [
+ /msg arg1 def
+ %% Send message. [(MSG) msg2 ...] httpd_sendfile
+ msg message
+ msg 0 get (MSG) eq {
+ (HTTP/0.9 200 OK) sendln
+ (Connection: close) sendln
+ (Content-Type: text/html) sendln
+ 0 sendln
+ msg rest { sendln } map
+ 0 sendln
+ [(flush)] extension
+ /httpd_sendfile.L1 goto
+ }{ } ifelse
+ %% Get a file message. [(GET-file) fname] httpd_sendfile
+ msg 0 get (GET-file) eq {
+ httpd.root tag 5 eq not {
+ [(MSG) (
File transfer is not allowed on this server.
)]
+ httpd_sendfile
+ /httpd_sendfile.L1 /httpd_sendfile.L1 goto
+ } { } ifelse
+ msg length 1 eq {
+ /fname (index.html) def
+ }{
+ /fname msg 1 get def
+ (fname=) messagen fname (array) dc message
+ fname tag 5 eq not {
+ [(MSG) ( Invalid file name.
)]
+ httpd_sendfile
+ /httpd_sendfile.L1 /httpd_sendfile.L1 goto
+ } { } ifelse
+ fname (array) dc /fname set
+ fname length 1 lt {
+ /fname (index.html) (array) dc def
+ } { } ifelse
+
+ fname [47] eq {
+ /fname (index.html) (array) dc def
+ }{ } ifelse
+
+ fname 0 get 47 eq { %% /
+ /fname fname rest def
+ } { } ifelse
+
+ fname { (string) dc } map cat /fname set
+ } ifelse
+
+ /fname2 fname def
+ [httpd.root fname2] cat /fname set
+ [(fname=) fname] cat message
+ fname httpd.check_name {
+ [(MSG) (Warning: invalid file name.)] httpd_sendfile
+ /httpd_sendfile.L1 /httpd_sendfile.L1 goto
+ } { } ifelse
+ [(stat) fname] extension 0 get tag 0 eq {
+ [(MSG) (Warning (sendfile): the file ) fname2 ( is not found.) ]
+ httpd_sendfile
+ /httpd_sendfile.L1 /httpd_sendfile.L1 goto
+ }{ }ifelse
+ [(stat) fname] extension 1 get 0 get toString /fsize set
+ (HTTP/1.1 200 OK) sendln
+ (Server: httpd_sm1) sendln
+ %% (ETag: "2197-bf6c-3b2d6541") sendln ???
+ (Accept-Ranges: bytes) sendln
+ [(Content-Length: ) fsize] cat sendln
+ (Connection: close) sendln
+ [(Content-Type: ) fname httpd_type] cat sendln
+ [(flush)] extension
+ 0 sendln
+ fname sendBinaryFile
+ 0 sendln
+ [(flush)] extension
+ 0 sendln
+ [(flush)] extension
+ /httpd_sendfile.L1 goto
+ }{
+ [(MSG) (Warning: unknown argument type for httpd_sendfile)]
+ httpd_sendfile
+ } ifelse
+ /httpd_sendfile.L1
+ ] pop
+ popVariables
+} def
+
+/httpd_type {
+ /arg1 set
+ [/in-httpd_type /fname /ftype /i /ans] pushVariables
+ [
+ /fname arg1 def
+ fname (array) dc /fname set
+ fname reverse /fname set
+ [
+ 0 1 fname length 1 sub {
+ /i set
+ fname i get 46 eq { % '.'
+ exit
+ } { fname i get } ifelse
+ } for
+ ] /ftype set
+ ftype reverse {(string) dc} map cat /ftype set
+ /ans (text/plain) def
+ ftype (gif) eq {
+ /ans (image/gif) def
+ }{ } ifelse
+ ftype (jpeg) eq ftype (jpg) eq or {
+ /ans (image/jpeg) def
+ }{ } ifelse
+ ftype (png) eq {
+ /ans (image/png) def
+ }{ } ifelse
+ ftype (png) eq {
+ /ans (image/png) def
+ }{ } ifelse
+ ftype (html) eq ftype (htm) eq or {
+ /ans (text/html) def
+ } { } ifelse
+ ftype (txt) eq {
+ /ans (text/html) def
+ } { } ifelse
+ /arg1 ans def
+ ] pop
+ popVariables
+ arg1
+} def
+
+/httpd.check_name {
+ /arg1 set
+ [/in-httpd.check_name /fname /invalid] pushVariables
+ [
+ /fname arg1 def
+ /invalid 0 def
+ [(regionMatches) fname [(..) (/.)]] extension 0 get -1 eq
+ {
+ } {
+ (The file name contains .. or /. ) message
+ /invalid 1 def /httpd.check_name.L1 /httpd.check_name.L1 goto
+ } ifelse
+ fname length 0 eq {
+ (Warning: empty file name.)
+ /invalid 1 def /httpd.check_name.L1 /httpd.check_name.L1 goto
+ }{ } ifelse
+ fname (array) dc 0 get 47 eq {
+ }{
+ (Warning: The first letter is not /) message
+ /invalid 1 def /httpd.check_name.L1 /httpd.check_name.L1 goto
+ } ifelse
+ /httpd.check_name.L1
+ /arg1 invalid def
] pop
popVariables
arg1