THRIFT-3833 haxe http server implementation (by embeding into php web server)
Client: Haxe
Patch: Oleksii Prudkyi <Oleksii.Prudkyi@gmail.com> + some modifications by Jens Geyer

This closes #1013
This closes #1020
diff --git a/tutorial/haxe/src/Main.hx b/tutorial/haxe/src/Main.hx
index 8f168c1..6bebe71 100644
--- a/tutorial/haxe/src/Main.hx
+++ b/tutorial/haxe/src/Main.hx
@@ -51,7 +51,8 @@
     private static var targetPort : Int = 9090;
 
     static function main() {
-        #if ! (flash || js)
+
+        #if ! (flash || js || phpwebserver)
         try {
               ParseArgs();
         } catch (e : String) {
@@ -59,6 +60,17 @@
             trace(GetHelp());
             return;
         }
+
+        #elseif  phpwebserver
+        //forcing server
+        server = true;
+        trns = http;
+        initPhpWebServer();
+        //check method
+        if(php.Web.getMethod() != 'POST') {
+          Sys.println('http endpoint for thrift test server');
+          return;
+        }
         #end
 
         try {
@@ -73,6 +85,29 @@
         trace("Completed.");
     }
 
+    #if phpwebserver
+    private static function initPhpWebServer()
+    {
+        //remap trace to error log
+        haxe.Log.trace = function(v:Dynamic, ?infos:haxe.PosInfos)
+        {
+          // handle trace
+          var newValue : Dynamic;
+          if (infos != null && infos.customParams!=null) {
+            var extra:String = "";
+            for( v in infos.customParams )
+              extra += "," + v;
+            newValue = v + extra;
+          }
+          else {
+            newValue = v;
+          }
+          var msg = infos != null ? infos.fileName + ':' + infos.lineNumber + ': ' : '';
+          Sys.stderr().writeString('${msg}${newValue}\n');
+        }
+    }
+    #end
+
 
     #if ! (flash || js)
 
@@ -154,8 +189,9 @@
              trace('- socket transport $targetHost:$targetPort');
             transport = new TSocket( targetHost, targetPort);
         case http:
-             trace('- HTTP transport $targetHost');
-            transport = new THttpClient( targetHost);
+            var uri = 'http://${targetHost}:${targetPort}';
+            trace('- HTTP transport $uri');
+            transport = new THttpClient(uri);
         default:
             throw "Unhandled transport";
         }
@@ -267,9 +303,20 @@
             transport = new TServerSocket( targetPort);
             #end
         case http:
-            throw "HTTP server not implemented yet";
-             //trace("- http transport");
-             //transport = new THttpClient( targetHost);
+            #if !phpwebserver
+              throw "HTTP server not implemented yet";
+              //trace("- http transport");
+              //transport = new THttpClient( targetHost);
+            #else
+              trace("- http transport");
+              transport = new TWrappingServerTransport(
+                      new TStreamTransport(
+                        new TFileStream("php://input", Read),
+                        new TFileStream("php://output", Append)
+                        )
+                      );
+
+            #end
         default:
             throw "Unhandled transport";
         }
@@ -301,6 +348,10 @@
         var handler = new CalculatorHandler();
         var processor = new CalculatorProcessor(handler);
         var server = new TSimpleServer( processor, transport, transfactory, protfactory);
+        #if phpwebserver
+        server.runOnce = true;
+        #end
+
         return server;
     }
 
@@ -321,4 +372,4 @@
     }
 
 }
- 
\ No newline at end of file
+