[BACK]Return to cgi.sm1 CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Doc

Annotation of OpenXM/src/kan96xx/Doc/cgi.sm1, Revision 1.9

1.9     ! takayama    1: % $OpenXM: OpenXM/src/kan96xx/Doc/cgi.sm1,v 1.8 2004/11/22 12:30:32 takayama Exp $
1.3       takayama    2: %  OpenXM/src/polymake/cgi/cgi-polymake.sh
                      3: %   is a shell script to call sm1/polymake as a CGI script.
                      4: %  Override as /doPolymake {doPolymake.OoHG} def if you need.
                      5:
1.5       takayama    6: /cgi.verbose 0 def
                      7:
1.3       takayama    8: [(plugin-cgi)
                      9: [(Key words: )
                     10:  ( cgiUrlEncodingToKeyValuePair)
                     11:  ( cgiKeyValuePairToHttpString)
                     12:  ( cgiKeyValuePairToUrlEncodingString)
                     13:  ( cgiStringToUrlEncoding)
                     14:  ( cgiUrlEncodedStringToObj)
                     15:  ( cgiHttpToKeyValuePair)
                     16: ]] putUsages
1.1       takayama   17:
1.2       takayama   18: % A sample code
                     19: % (OpenXM) cgiQueryGoogle  --> it does not work well.
                     20: /cgiQueryGoogle {
1.1       takayama   21:    /key set
                     22:    [[(URL),(/search)],
                     23:     [(hl),(ja)],
                     24:     [(ie),(UTF-8)],
                     25:     [(q),key]] /kv set
                     26:    [(cgiKeyValuePairToUrlEncodingString) kv] extension /sss set
                     27:    [(GET ) , sss , ( HTTP/0.9) , nl , nl ] cat /sss2 set
                     28:
                     29:    [(sm1.socket) (connect) [80 (www.google.co.jp)]] extension 0 get /goo set
                     30:    [(sm1.socket) (write) [goo sss2]]  extension
1.2       takayama   31:    goo readHTTP0 /pp set
1.1       takayama   32:    pp message
                     33:    [(sm1.socket) (close) [goo]] extension
                     34:    [(cgiHttpToKeyValuePair) pp] extension /pp2 set
                     35: } def
                     36:
1.2       takayama   37: % A sample
                     38: % (www.math.kobe-u.ac.jp) cgiGetIndex
                     39: /cgiGetIndex {
1.1       takayama   40:    /url set
1.2       takayama   41:    [[(URL),(/index.html)]
1.1       takayama   42:    ] /kv set
                     43:    [(cgiKeyValuePairToUrlEncodingString) kv] extension /sss set
                     44:    [(GET ) , sss , ( HTTP/0.9) , nl , nl ] cat /sss2 set
                     45:
                     46:    sss2 message
                     47:    [(sm1.socket) (connect) [80 url]] extension 0 get /goo set
                     48:    [(sm1.socket) (write) [goo sss2]]  extension
1.2       takayama   49:    goo readHTTP0 /pp set
1.1       takayama   50:    pp message
                     51:    [(sm1.socket) (close) [goo]] extension
                     52:    [(cgiHttpToKeyValuePair) pp] extension /pp2 set
1.2       takayama   53: } def
                     54:
1.3       takayama   55: [(readHTTP0)
                     56: [(fd readHTTP0 result-str)
                     57:  (Read data from fd until the connection is closed.)
                     58:  (Example:)
                     59:  $[(sm1.socket) (connect) [80 (www.math.kobe-u.ac.jp)]] extension $
                     60:  $ 0 get /goo set $
                     61:  $goo readHTTP0 /pp set pp message$
                     62:  $[(sm1.socket) (close) [goo]] extension $
                     63: ]] putUsages
1.2       takayama   64: /readHTTP0 {
                     65:   /arg1 set
                     66:   [/fd /sss /pp /pp2 /nn] pushVariables
                     67:   [
                     68:     /fd arg1 def
                     69:     /sss [ ] def
                     70:     {
                     71:       [(sm1.socket) (select) [fd -1]] extension {
                     72:       } { (select error) error } ifelse
                     73:
                     74:       [(sm1.socket) (read) [fd]] extension /pp set
                     75:       pp length 0 eq { exit } { } ifelse
                     76:       sss pp append /sss set
                     77:     } loop
                     78:     sss cat /arg1 set
                     79:   ] pop
                     80:   popVariables
                     81:   arg1
                     82: } def
                     83:
1.3       takayama   84: % -----------------------  server side -----------------------
                     85: %  command filename action
                     86: /cgiPolymake.polymakeName (polymake) def
                     87: %/cgiPolymake.polymakeName (polymake_dummy) def
                     88: %/cgiPolymake.polymakeName (hoge) def
                     89:
                     90: [(cgiPolymake)
                     91: [(Make sm1 to a polymake server based on CGI/OoHG)
                     92:  $ sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit " $
                     93: ]] putUsages
                     94: % Server-side-script
                     95: % oxMessageBody=action input-data-for-polymake
1.9     ! takayama   96: % t.t : oxMessageBody=FACETS++POINTS%0A1+0+0+%0A1+1+0+%0A1+0+1%0A
        !            97: %   t?oxMe...
        !            98: % env CONTENT_LENGTH=57 sm1 -q -s "[(parse) (cgi.sm1) pushfile] extension cgiPolymake quit " <t.t
1.2       takayama   99: /cgiPolymake {
1.3       takayama  100:   {
1.9     ! takayama  101:    [(getenv) (CONTENT_LENGTH)] extension /cgi.content_length set
        !           102:    cgi.content_length .. (integer) dc /cgi.content_length set
        !           103:    [(read) 0 cgi.content_length] extension /cgi.query_string set
1.4       takayama  104:    cgi.query_string isString {
                    105:      cgi.query_string length 0 eq  {
                    106:        cgiPolymake.errorMessage message  exit
                    107:      } { } ifelse
                    108:    }
1.3       takayama  109:    {
                    110:      cgiPolymake.errorMessage message  exit
                    111:    } ifelse
1.4       takayama  112:    cgi.body.http0 message
1.3       takayama  113:    cgi.query_string cgiPolymake.0
                    114:    cgi.body cgiReplyInHttp0 /cgi.body.http set
                    115:    cgi.body.http message
                    116:    exit
                    117:   } loop
1.4       takayama  118:   [(flush)] extension
1.2       takayama  119: } def
1.3       takayama  120: /cgiPolymake.errorMessage
                    121:   [ (Content-Type: text/html) nl
                    122:     nl
                    123:     (<html><body>) nl
                    124:     (Input <br> action polymake-data <br> ) nl
                    125:     (Example: <pre> ) nl
                    126:     (FACETS  POINTS) nl
                    127:     (1 0 0 ) nl
                    128:     (1 1 0 ) nl
                    129:     (1 0 1 ) nl
                    130:     (</pre>) nl
1.9     ! takayama  131:     (<form method="POST">) nl
1.3       takayama  132:     (<input type=submit>) nl
1.4       takayama  133:     (<textarea name="oxMessageBody") nl
1.3       takayama  134:     ( rows=10 cols="80" wrap="soft"></textarea>) nl
                    135:     (</form>) nl
                    136:     (</body></html>) nl
                    137:   ] cat
                    138: def
                    139:
                    140: /cgi.body.http0
                    141:   (Content-Type: text/plain)
                    142: def
1.2       takayama  143: /cgiPolymake.0 {
                    144:   /arg1 set
                    145:   [/sss /kv /comm /i /acti0 /pError] pushVariables
                    146:   [
                    147:     /sss arg1 def
1.3       takayama  148: % Step 1.  analyze the query string in URL encoding.
1.6       takayama  149:     [(cgiUrlEncodingToKeyValuePair) sss] extension /kv set
1.2       takayama  150:     kv (oxMessageBody) getNode /comm set
1.4       takayama  151: %   [nl nl] cat message sss message kv message  % for debug.
1.3       takayama  152: % Step 2. Extract action part and file part for polymake.
1.2       takayama  153:     comm (array) dc /comm set
                    154:     /i 0 def
                    155:     [
                    156:        0 1, comm length 1 sub {
                    157:          /i set
                    158:          comm,i,get 33 lt {
                    159:            exit
                    160:          } { comm,i,get } ifelse
                    161:        } for
                    162:     ] /acti0 set
                    163:     acti0 { (string) dc } map cat /acti0 set
                    164:
                    165:     /cgi.body comm def
                    166:     0 1 i {
                    167:       cgi.body rest /cgi.body set
                    168:     } for
                    169:     cgi.body { (string) dc } map cat /cgi.body set
                    170:
1.3       takayama  171: % Step 3. Calling polymake
1.2       takayama  172: % acti0  cgi.body
                    173:     /pError [ ] def
1.3       takayama  174: %  cgi.body --> oxsVarToFile(), value is not a string object ...
1.2       takayama  175: %    [(polymake) (stringInOut://cgi.body) acti0] addStdoutStderr
1.3       takayama  176: %  It is not a bug; .body is removed from the variable name.
                    177:     /cgi_body cgi.body def
                    178:     [cgiPolymake.polymakeName (stringInOut://cgi_body.poly) acti0] addStdoutStderr
1.2       takayama  179:     oxshell pop
                    180:     pError [@@@stdout @@@stderr] append /pError set
1.4       takayama  181:     /cgi.body cgi_body def
1.2       takayama  182:   ] pop
                    183:   popVariables
                    184: } def
                    185:
                    186: /cgi.test0 {
                    187:   [[(URL) (hoge)]
                    188:    [(oxMessageBody)
                    189:    [(FACETS )
                    190:     (POINTS) nl
                    191:     (1 0 0) nl
                    192:     (1 1 0) nl
                    193:     (1 0 1) nl
                    194:     (1 1 1) nl ] cat
                    195:    ]] /ff set
                    196:    [(cgiKeyValuePairToUrlEncodingString) ff] extension /ff1 set
                    197:    ff1 message
                    198:    ff1 cgiPolymake.0
                    199:    cgi.body message
1.3       takayama  200: } def
                    201:
                    202: /cgiReplyInHttp0 {
                    203:   /arg1 set
                    204:   [/ss /sskv] pushVariables
                    205:   [
                    206:     /ss arg1 def
                    207:     [[(Content-Body) ss]
                    208: %     [(Content-Type) (text/plain)]
1.4       takayama  209:      [(oxshell-stdout) [(cgiStringToUrlEncoding) @@@stdout] extension]
                    210:      [(oxshell-stderr) [(cgiStringToUrlEncoding) @@@stderr] extension]
1.3       takayama  211:     ] /sskv set
                    212:     [(cgiKeyValuePairToHttpString) sskv] extension /arg1 set
                    213:   ] pop
                    214:   arg1
                    215: } def
                    216:
                    217: % ------------  client side script ---------------
                    218: /cgiQueryPolymake.hostname (polymake.math.kobe-u.ac.jp) def
1.4       takayama  219: /cgiQueryPolymake.cginame (/cgi-bin/cgi-polymake.sh) def
1.3       takayama  220: /cgiQueryPolymake {
                    221:   /arg2 set /arg1 set
                    222:   [/saction /sfile /ff /ff1 /sss2 /goo /pp /pp2] pushVariables
                    223:   [
                    224:     /saction arg1 def /sfile arg2 def
                    225: % step1. Generate query in URL encoding.
1.9     ! takayama  226:      [(http://) cgiQueryPolymake.hostname cgiQueryPolymake.cginame] cat
        !           227:      /ff1 set
1.7       takayama  228: % full URL necessary for virtual host of apache.
1.9     ! takayama  229:      [[(oxMessageBody)
        !           230:        [saction ( )
        !           231:         sfile nl ] cat
        !           232:        ]
        !           233:      ] /ff set
        !           234:      [(cgiKeyValuePairToUrlEncodingString) ff] extension /ff set
        !           235:      [(POST ) , ff1 , ( HTTP/0.9) , nl ,
        !           236:       (Connection: Keep-Alive) , nl ,
        !           237:       (Content-length: ) , ff length (string) dc , nl ,
        !           238:       ff ] cat /sss2 set
1.3       takayama  239: % step 2. Call the server and get the response in pp
                    240:      [(sm1.socket) (connect)
                    241:         [80 cgiQueryPolymake.hostname]] extension 0 get /goo set
                    242:      [(sm1.socket) (write) [goo sss2]]  extension
                    243:      goo readHTTP0 /pp set
1.8       takayama  244:
                    245:      % For the case of error.
                    246:      [(regexec) (200 OK) [pp]] extension length 0 eq {
                    247:         (sss2=) message
                    248:         sss2 message
                    249:         (pp=) message
                    250:         pp message
                    251:         (cgi.sm1: there seems to be an error in the HTTP connection.)
                    252:      } { } ifelse
                    253:
1.5       takayama  254:      cgi.verbose { pp message } {  } ifelse
1.3       takayama  255:      [(sm1.socket) (close) [goo]] extension
                    256:      [(cgiHttpToKeyValuePair) pp] extension /pp2 set
                    257:
                    258: % step 3. Analyze the response.
                    259:      [pp2 (Content-Body) getNode
                    260:       pp2 (oxshell-stdout) getNode
                    261:       pp2 (oxshell-stderr) getNode
                    262:      ] /arg1 set
                    263:   ] pop
                    264:   popVariables
                    265:   arg1
                    266: } def
                    267:
                    268: % Overrides doPolymake
                    269: %/doPolymake { doPolymake.OoHG } def
1.7       takayama  270: %/polymake.start { polymake.start.OoHG } def
1.3       takayama  271:
                    272: [(doPolymake.OoHG)
                    273: [(It first looks for local polymake. If there is, it calls the local polymake.)
                    274:  (If not, it calls http://polymake.math.kobe-u.ac.jp/cgi-bin/cgi-polymake.sh)
                    275:  (to make a computation in polymake.)
                    276:  (See doPolymake for the syntax. doPolymake.OoHG may overrides doPolymake.)
                    277: ]] putUsages
                    278: /doPolymake.OoHG  {
                    279:   /arg1 set
                    280:   [/in-doPolymake.OoHG  /pAction /pData /pNative /ptree
                    281:    /pResult  /pError
                    282:   ] pushVariables
                    283:   [
                    284:     arg1 0 get /pAction set
                    285:     arg1 1 get /pData set
                    286:     polymake.start
                    287:
                    288:     /pError [ ] def
                    289: %% step 1:  polymake tfb ===> polymake native data
                    290:     @@@polymake.k0.ccc ( polymake=Object; ) oxexecutestring
                    291:     @@@polymake.k0.ccc ( QuoteMode(1); ) oxexecutestring
                    292:     @@@polymake.k0.ccc [pData ( ;)] cat oxexecutestring
                    293:     @@@polymake.k0.ccc oxpopcmo /ptree set
                    294:     @@@polymake.k0.ccc ( QuoteMode(0); ) oxexecutestring
                    295:     [(treeToPolymake) ptree] extension /pNative set
                    296: %% step 2: calling the polymake
1.4       takayama  297: %    [(which) (polymake)] oxshell tag 0 eq
                    298:     1  % always call web service
1.3       takayama  299:     {
                    300: % cgi-polymake
                    301:        (Trying web service.) message
                    302:        pAction pNative  cgiQueryPolymake /doPolymake.OoHG.result set
                    303:
1.7       takayama  304:       [(regexec) (Not Found) [doPolymake.OoHG.result 0 get ]]
                    305:       extension length 0 eq not {
                    306:          doPolymake.OoHG.result message
                    307:          (The polymake cgi seems to be out of service.) error
                    308:       } {  } ifelse
                    309:
1.3       takayama  310:       doPolymake.OoHG.result 0 get /pNative set
1.7       takayama  311:
                    312:
1.3       takayama  313:       pError doPolymake.OoHG.result rest append /pError set
                    314:     } {
                    315: % local polymake
                    316:       [(polymake) (stringInOut://pNative.poly) pAction] addStdoutStderr
                    317:       oxshell pop
                    318:       pError [@@@stdout @@@stderr] append /pError set
                    319:     } ifelse
                    320: %% step 3: polymake native data to polymake tfb
                    321:     [(polymake2tfb) (<) (stringIn://pNative) (>) (stringOut://pResult)
                    322:      (2>) (stringOut://@@@stderr)] oxshell pop
                    323:     pError [@@@stderr] append /pError set
                    324: %% step 4: get also tree style data.
                    325:     @@@polymake.k0.ccc ( polymake=Object; ) oxexecutestring
                    326:     @@@polymake.k0.ccc ( QuoteMode(1); ) oxexecutestring
                    327:     @@@polymake.k0.ccc [pResult ( ;)] cat oxexecutestring
                    328:     @@@polymake.k0.ccc oxpopcmo /ptree set
                    329:     @@@polymake.k0.ccc ( QuoteMode(0); ) oxexecutestring
                    330:     [pResult ptree pError] /arg1 set
                    331:   ] pop
                    332:   popVariables
                    333:   arg1
1.7       takayama  334: } def
                    335:
                    336: /polymake.start.OoHG {
                    337:   (ox.k0.loaded) boundp {  }
                    338:   { [(parse) (ox.sm1) pushfile] extension
                    339:     /@@@polymake.k0.ccc [ ] def
                    340:   } ifelse
                    341:   @@@polymake.k0.ccc [ ] eq {
                    342:      k0connectr /@@@polymake.k0.ccc oxk0.ccc def /oxk0.ccc [ ] def
                    343:      @@@polymake.k0.ccc oxsetmathcap @@@polymake.k0.ccc oxmathcap
                    344:   } {  } ifelse
                    345:   @@@polymake.k0.ccc 0 get (closed) eq {
                    346:      k0connectr /@@@polymake.k0.ccc oxk0.ccc def /oxk0.ccc [ ] def
                    347:      @@@polymake.k0.ccc oxsetmathcap @@@polymake.k0.ccc oxmathcap
                    348:   } {  } ifelse
                    349:   [(which) (polymake2tfb)] oxshell tag 0 eq {
                    350:      (polymake2tfb is not installed in this system.) error
                    351:   } {  } ifelse
1.3       takayama  352: } def
                    353:
                    354:
                    355:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>