lighttpd + promenade.cgi 00:48

Posted at 2010/01/02 00:48, Modified at 2010/01/02 21:29

2010年は Tokyo Promenade を使うことにしました。今年もよろしくお願いします。

8-p.info では、なんとなく lighttpd を使っています。lighttpd + TP だと

  • lighttpd は GET から CGI を起動するにも環境変数 CONTENT_LENGTH に "0" をセットする
  • TP は環境変数 CONTENT_LENGTH があると QUERY_STRING はみない

という二つがあわさって、結果「クエリパラメータが GET で渡せない」という悲しいことになったので、TP 側に回避するコードをいれました。

diff -r cb9efd6d3dd5 promenade.c
--- a/promenade.c       Thu Dec 03 01:36:18 2009 +0900
+++ b/promenade.c       Wed Dec 23 17:11:07 2009 +0900
@@ -329,9 +329,12 @@
   TCMAP *params = tcmpoolpushmap(mpool, tcmapnew2(TINYBNUM));
   double now = tctime();
   // read query parameters
-  rp = getenv("CONTENT_LENGTH");
+  const char *method = getenv("REQUEST_METHOD");
   bool post = false;
-  if(rp){
+  if(method && !strcmp(method, "GET")){
+    const char *query = getenv("QUERY_STRING");
+    if(query) tcwwwformdecode(query, params);
+  } else if((rp = getenv("CONTENT_LENGTH"))){
     int clen = tcatoi(rp);
     if(clen > g_recvmax){
       showerror(413, "The entity body was too long.");
@@ -344,9 +347,6 @@
     }
     tcwwwformdecode2(cbuf, clen, getenv("CONTENT_TYPE"), params);
     post = true;
-  } else {
-    const char *query = getenv("QUERY_STRING");
-    if(query) tcwwwformdecode(query, params);
   }
   rp = getenv("HTTP_COOKIE");
   if(rp) tcwwwformdecode(rp, params);

0 comments
riddle for guest comment authorization:
Where is the capital city of Japan? ...

blog.8-p.info加藤和良 の個人的なブログで、プログラミングのはなしが多めです。