=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Doc/httpd.sm1,v retrieving revision 1.14 retrieving revision 1.19 diff -u -p -r1.14 -r1.19 --- OpenXM/src/kan96xx/Doc/httpd.sm1 2002/11/09 12:42:25 1.14 +++ OpenXM/src/kan96xx/Doc/httpd.sm1 2005/11/21 12:46:49 1.19 @@ -1,10 +1,19 @@ -%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd.sm1,v 1.13 2002/11/03 12:43:03 takayama Exp $ +%% $OpenXM: OpenXM/src/kan96xx/Doc/httpd.sm1,v 1.18 2005/11/21 09:12:22 takayama Exp $ %% common modules for httpd on sm1. +% [(Strict) 1] system_variable % for debugging. /Oxserver_history_variable (Oxserver_history_variable_) def /httpd.image.type [(getenv) (OpenXM_PSTOIMG_TYPE)] extension def +/httpd_sm1.cookie + [(oxGenPass)] extension +def +/httpd.set-cookie { + [(Set-Cookie: httpd_sm1=) httpd_sm1.cookie] cat +} def + + [(getenv) (OXWEB_DEBUG)] extension tag 0 eq { /httpd.debug 0 def } { @@ -82,6 +91,7 @@ def /httpd.serial 0 def /httpd.history [ ] def /httpd.result.history [ 0 ] def + [(nobody)] extension pop { httpd_startserver ; httpd_action ; @@ -133,6 +143,7 @@ def (HTTP/0.9 200 OK) sendln (Connection: close) sendln (Content-Type: text/html) sendln + httpd.set-cookie sendln 0 sendln %% (
) sendln result sendln @@ -286,27 +297,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 @@ -453,6 +443,7 @@ def [/in-preformatHTML /sss /c] pushVariables [ /sss arg1 def + sss toString /sss set sss (array) dc /sss set sss { /c set @@ -629,6 +620,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 @@ -686,6 +688,7 @@ def /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 @@ -693,9 +696,7 @@ def } { } ifelse fname (array) dc /fname set fname length 1 lt { - [(MSG) (

Invalid file name.

)] - httpd_sendfile - /httpd_sendfile.L1 /httpd_sendfile.L1 goto + /fname (index.html) (array) dc def } { } ifelse fname [47] eq { @@ -712,6 +713,10 @@ def /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 @@ -747,18 +752,9 @@ def [/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 + fname getFileType /ftype set + + /ans (text/plain) def % .txt, .jar, ftype (gif) eq { /ans (image/gif) def }{ } ifelse @@ -774,11 +770,82 @@ def ftype (html) eq ftype (htm) eq or { /ans (text/html) def } { } ifelse - ftype (txt) eq { - /ans (text/html) def - } { } ifelse + ftype (wav) eq { + /ans (audio/x-wav) def + } { } ifelse + ftype (class) eq { + /ans (application/octet-stream) def + } { } ifelse /arg1 ans def ] pop popVariables arg1 -} def +} 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 +} def + +/httpd.startBrowserUnix { + /arg1 set + [/portnum /browser /cmd /fd /msg /htmlfn] pushVariables + [ + arg1 /portnum set + portnum toString /portnum set + [(getenv) (OX_BROWSER)] extension /browser set + { + browser tag 0 eq { + [(sleep 3 ; netscape http://localhost:) portnum ( & ) ] cat + /cmd set cmd message + cmd system + exit + }{ } ifelse + browser (mac) eq, browser (MAC) eq, or { + (.sm1.httpd.startBrowserUnix.html) /htmlfn set + htmlfn (w) file /fd set + fd tag 0 eq { (httpd.startBrowserUnix fails to open a file.) error } + { } ifelse + [() nl + () + (Click here to connect to the ox server) + () nl + () nl + ] cat /msg set + fd msg writestring fd closefile + [(sleep 3 ; open ) htmlfn ( &) ] cat + /cmd set cmd message + cmd system + exit + }{ } ifelse + [(sleep 3 ; ) browser ( http://localhost:) portnum ( & ) ] cat + /cmd set cmd message + cmd system + exit + } loop + ] pop + popVariables +} def \ No newline at end of file