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/test/haxe/src/Arguments.hx b/test/haxe/src/Arguments.hx
index cae91df..cc10749 100644
--- a/test/haxe/src/Arguments.hx
+++ b/test/haxe/src/Arguments.hx
@@ -72,12 +72,18 @@
 
     public function new() {
         #if sys
-        try {
+          #if !phpwebserver
+          try {
               ParseArgs();
-        } catch (e : String) {
+          } catch (e : String) {
             trace(GetHelp());
             throw e;
-        }
+          }
+          #else
+            //forcing server
+            server = true;
+            transport = http;
+          #end
         #else
         trace("WN: Platform does not support program arguments, using defaults.");
         #end
diff --git a/test/haxe/src/Main.hx b/test/haxe/src/Main.hx
index 30c04a6..9eb828f 100644
--- a/test/haxe/src/Main.hx
+++ b/test/haxe/src/Main.hx
@@ -31,6 +31,15 @@
 class Main
 {
     static function main() {
+        #if phpwebserver
+        initPhpWebServer();
+        //check method
+        if(php.Web.getMethod() != 'POST') {
+          Sys.println('http endpoint for thrift test server');
+          return;
+        }
+        #end
+
         try {
             var args = new Arguments();
 
@@ -48,4 +57,27 @@
         }
     }
 
+    #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
+
 }
diff --git a/test/haxe/src/TestClient.hx b/test/haxe/src/TestClient.hx
index 9436865..aa496dc 100644
--- a/test/haxe/src/TestClient.hx
+++ b/test/haxe/src/TestClient.hx
@@ -212,7 +212,9 @@
             case socket:
                 transport = new TSocket(args.host, args.port);
             case http:
-                transport = new THttpClient(args.host);
+                var uri = 'http://${args.host}:${args.port}';
+                trace('- http client : ${uri}');
+                transport = new THttpClient(uri);
             default:
                 throw "Unhandled transport";
         }
diff --git a/test/haxe/src/TestServer.hx b/test/haxe/src/TestServer.hx
index 8f4604a..450c8f2 100644
--- a/test/haxe/src/TestServer.hx
+++ b/test/haxe/src/TestServer.hx
@@ -42,8 +42,18 @@
                 transport = new TServerSocket( args.port);
             case http:
                 trace("- http");
-                throw "HTTP server not implemented yet";
+                #if !phpwebserver
+                  throw "HTTP server not implemented yet";
                  //transport = new THttpServer( targetHost);
+                #else
+                transport =    new TWrappingServerTransport(
+                        new TStreamTransport(
+                          new TFileStream("php://input", Read),
+                          new TFileStream("php://output", Append)
+                          )
+                        );
+
+                #end
             default:
                 throw "Unhandled transport";
             }
@@ -84,7 +94,12 @@
             switch( args.servertype)
             {
             case simple:
-                server = new TSimpleServer( processor, transport, transfactory, protfactory);
+                var simpleServer = new TSimpleServer( processor, transport, transfactory, protfactory);
+                #if phpwebserver
+                simpleServer.runOnce = true;
+                #end
+                server = simpleServer;
+
             default:
                 throw "Unhandled server type";
             }