Bläddra i källkod

php : fixed enum constructors sequence (issue 142)

Franco Ponticelli 15 år sedan
förälder
incheckning
acee1baa3c
5 ändrade filer med 55 tillägg och 24 borttagningar
  1. 2 0
      doc/CHANGES.txt
  2. 15 4
      genphp.ml
  3. 3 9
      std/Type.hx
  4. 19 2
      std/haxe/Http.hx
  5. 16 9
      std/php/net/Socket.hx

+ 2 - 0
doc/CHANGES.txt

@@ -36,6 +36,8 @@
 	as3 : fixed Date.toString issue in flash.Boot (now use .toStringHX instead)
 	as3 : fixed Date.toString issue in flash.Boot (now use .toStringHX instead)
 		this will only work if .toString called explicitely on Date class
 		this will only work if .toString called explicitely on Date class
 	all : only allow "using" on Dynamic if first parameter is Dynamic
 	all : only allow "using" on Dynamic if first parameter is Dynamic
+	php : haxe.Http now supports Https connections when OpenSSL extension is enabled (issue 143)
+	php : fixed enum constructors sequence (issue 142)
 	
 	
 2010-01-09: 2.05
 2010-01-09: 2.05
 	js : added js.Scroll
 	js : added js.Scroll

+ 15 - 4
genphp.ml

@@ -1495,7 +1495,6 @@ and gen_expr ctx e =
 		spr ctx ", ";
 		spr ctx ", ";
 		gen_expr ctx (mk (TTypeExpr t) (mk_texpr t) e1.epos);
 		gen_expr ctx (mk (TTypeExpr t) (mk_texpr t) e1.epos);
 		spr ctx ")"
 		spr ctx ")"
-(*		gen_expr ctx (Codegen.default_cast ctx.com e1 t e.etype e.epos) *)
 
 
 and gen_value ctx e =
 and gen_value ctx e =
 	let assign e =
 	let assign e =
@@ -1877,7 +1876,6 @@ let generate_enum ctx e =
 	let ename = s_path ctx e.e_path e.e_extern e.e_pos in
 	let ename = s_path ctx e.e_path e.e_extern e.e_pos in
 
 
 	print ctx "class %s extends Enum {" ename;
 	print ctx "class %s extends Enum {" ename;
-	let cl = open_block ctx in
 	PMap.iter (fun _ c ->
 	PMap.iter (fun _ c ->
 		newline ctx;
 		newline ctx;
 		match c.ef_type with
 		match c.ef_type with
@@ -1894,8 +1892,22 @@ let generate_enum ctx e =
 		| _ ->
 		| _ ->
 			print ctx "public static $%s" c.ef_name;
 			print ctx "public static $%s" c.ef_name;
 	) e.e_constrs;
 	) e.e_constrs;
-	cl();
 	newline ctx;
 	newline ctx;
+	
+	spr ctx "public static $__constructors = array(";
+	
+	let first = ref true in
+	PMap.iter (fun _ c ->
+		if not !first then spr ctx ", ";
+		print ctx "%d => '%s'" c.ef_index c.ef_name;
+		first := false;
+	) e.e_constrs;
+	
+	spr ctx ")";
+	
+	newline ctx;
+	pack();
+	
 	print ctx "}";
 	print ctx "}";
 
 
 	PMap.iter (fun _ c ->
 	PMap.iter (fun _ c ->
@@ -1907,7 +1919,6 @@ let generate_enum ctx e =
 			print ctx "%s::$%s = new %s(\"%s\", %d)" ename c.ef_name ename c.ef_name  c.ef_index;
 			print ctx "%s::$%s = new %s(\"%s\", %d)" ename c.ef_name ename c.ef_name  c.ef_index;
 	) e.e_constrs;
 	) e.e_constrs;
 
 
-	pack();
 	newline ctx
 	newline ctx
 
 
 let generate com =
 let generate com =

+ 3 - 9
std/Type.hx

@@ -562,15 +562,9 @@ class Type {
 	**/
 	**/
 	public static function getEnumConstructs( e : Enum<Dynamic> ) : Array<String> untyped {
 	public static function getEnumConstructs( e : Enum<Dynamic> ) : Array<String> untyped {
 		#if php
 		#if php
-			if(__php__("$e->__tname__ == 'Bool'")) return ['true', 'false'];
-			if(__php__("$e->__tname__ == 'Void'")) return [];
-			var rfl = __php__("new ReflectionClass($e->__tname__)");
-			var sps : ArrayAccess<Dynamic> = rfl.getStaticProperties();
-//			var r : ArrayAccess<String> = __call__('array');
-			__php__("$r = array(); while(list($k) = each($sps)) $r[] = $k");
-			sps = rfl.getMethods();
-			__php__("while(list(, $m) = each($sps)) { $n = $m->getName(); if($n != '__construct' && $n != '__toString') $r[] = $n; }");
-			return __php__("new _hx_array($r)");
+			if (__php__("$e->__tname__ == 'Bool'")) return ['true', 'false'];
+			if (__php__("$e->__tname__ == 'Void'")) return [];
+			return __call__("new _hx_array", e.__constructors);
 		#elseif cpp
 		#elseif cpp
 			return untyped e.GetClassFields();
 			return untyped e.GetClassFields();
 		#else
 		#else

+ 19 - 2
std/haxe/Http.hx

@@ -69,6 +69,10 @@ class Http {
 	public static var PROXY : { host : String, port : Int, auth : { user : String, pass : String } } = null;
 	public static var PROXY : { host : String, port : Int, auth : { user : String, pass : String } } = null;
 	#end
 	#end
 
 
+	/**
+	 * In PHP Https (SSL) connections are allowed only if the OpenSSL extension is enabled.
+	 * @param	url
+	 */
 	public function new( url : String ) {
 	public function new( url : String ) {
 		this.url = url;
 		this.url = url;
 		headers = new Hash();
 		headers = new Hash();
@@ -265,19 +269,32 @@ class Http {
 	}
 	}
 
 
 	public function customRequest( post : Bool, api : haxe.io.Output, ?sock : AbstractSocket, ?method : String  ) {
 	public function customRequest( post : Bool, api : haxe.io.Output, ?sock : AbstractSocket, ?method : String  ) {
+		#if php
+		var url_regexp = ~/^(https?:\/\/)?([a-zA-Z\.0-9-]+)(:[0-9]+)?(.*)$/;
+		var secure = (url_regexp.matched(1) == "https://");
+		#else
 		var url_regexp = ~/^(http:\/\/)?([a-zA-Z\.0-9-]+)(:[0-9]+)?(.*)$/;
 		var url_regexp = ~/^(http:\/\/)?([a-zA-Z\.0-9-]+)(:[0-9]+)?(.*)$/;
+		#end
 		if( !url_regexp.match(url) ) {
 		if( !url_regexp.match(url) ) {
 			onError("Invalid URL");
 			onError("Invalid URL");
 			return;
 			return;
 		}
 		}
-		if( sock == null )
+		if ( sock == null )
+			#if php
+			sock = (secure) ? Socket.newSslSocket() : new Socket();
+			#else
 			sock = new Socket();
 			sock = new Socket();
+			#end
 		var host = url_regexp.matched(2);
 		var host = url_regexp.matched(2);
 		var portString = url_regexp.matched(3);
 		var portString = url_regexp.matched(3);
 		var request = url_regexp.matched(4);
 		var request = url_regexp.matched(4);
 		if( request == "" )
 		if( request == "" )
 			request = "/";
 			request = "/";
-		var port = if( portString == null || portString == "" ) 80 else Std.parseInt(portString.substr(1,portString.length-1));
+		#if php
+		var port = if( portString == null || portString == "" ) ((!secure) ? 80 : 443) else Std.parseInt(portString.substr(1,portString.length-1));
+		#else
+		var port = if ( portString == null || portString == "" ) 80 else Std.parseInt(portString.substr(1, portString.length - 1));
+		#end
 		var data;
 		var data;
 
 
 		var multipart = (file != null);
 		var multipart = (file != null);

+ 16 - 9
std/php/net/Socket.hx

@@ -36,12 +36,13 @@ class Socket {
 	public var output(default,null) : SocketOutput;
 	public var output(default,null) : SocketOutput;
 	public var custom : Dynamic;
 	public var custom : Dynamic;
 
 
-	public var isUdp(default, null) : Bool;
+	public var protocol(default, null) : String;
 
 
 	public function new( ?s ) {
 	public function new( ?s ) {
 		__s = s;
 		__s = s;
 		input = new SocketInput(__s);
 		input = new SocketInput(__s);
 		output = new SocketOutput(__s);
 		output = new SocketOutput(__s);
+		protocol = "tcp";
 	}
 	}
 
 
 	private function assignHandler() {
 	private function assignHandler() {
@@ -72,8 +73,8 @@ class Socket {
 	public function connect(host : Host, port : Int) {
 	public function connect(host : Host, port : Int) {
 		var errs = null;
 		var errs = null;
 		var errn = null;
 		var errn = null;
-		var r = untyped __call__('stream_socket_client', (isUdp ? 'udp' : 'tcp') + '://' +host._ip + ':' + port, errn, errs);
-		checkError(r, errn, errs);
+		var r = untyped __call__('stream_socket_client', protocol + '://' +host._ip + ':' + port, errn, errs);
+		Socket.checkError(r, errn, errs);
 		__s = cast r;
 		__s = cast r;
 		assignHandler();
 		assignHandler();
 	}
 	}
@@ -99,8 +100,8 @@ class Socket {
 	public function bind(host : Host, port : Int) {
 	public function bind(host : Host, port : Int) {
 		var errs = null;
 		var errs = null;
 		var errn = null;
 		var errn = null;
-		var r = untyped __call__('stream_socket_server', (isUdp ? 'udp' : 'tcp') + '://' +host._ip + ':' + port, errn, errs, isUdp ? __php__('STREAM_SERVER_BIND') : __php__('STREAM_SERVER_BIND | STREAM_SERVER_LISTEN'));
-		checkError(r, errn, errs);
+		var r = untyped __call__('stream_socket_server', protocol + '://' +host._ip + ':' + port, errn, errs, (protocol=="udp") ? __php__('STREAM_SERVER_BIND') : __php__('STREAM_SERVER_BIND | STREAM_SERVER_LISTEN'));
+		Socket.checkError(r, errn, errs);
 		__s = cast r;
 		__s = cast r;
 		assignHandler();
 		assignHandler();
 	}
 	}
@@ -147,9 +148,15 @@ class Socket {
 	// STATICS
 	// STATICS
 	public static function newUdpSocket() {
 	public static function newUdpSocket() {
 		var s = new Socket();
 		var s = new Socket();
-		untyped s.isUdp = true;
+		s.protocol = "udp";
 		return s;
 		return s;
 	}
 	}
+	
+	public static function newSslSocket() {
+		var s = new Socket();
+		s.protocol = "ssl";
+ 		return s;
+ 	}
 
 
 	private static function checkError(r : Bool, code : Int, msg : String) {
 	private static function checkError(r : Bool, code : Int, msg : String) {
 		if(!untyped __physeq__(r, false)) return;
 		if(!untyped __physeq__(r, false)) return;
@@ -160,9 +167,9 @@ class Socket {
 		return isUdp ? untyped __php__('SOCK_DGRAM') : untyped __php__('SOCK_STREAM');
 		return isUdp ? untyped __php__('SOCK_DGRAM') : untyped __php__('SOCK_STREAM');
 	}
 	}
 
 
-	private static function getProtocol(isUdp : Bool) : Int {
-		return isUdp ? untyped __call__('getprotobyname', 'udp') : untyped __call__('getprotobyname', 'tcp');
-	}
+	private static function getProtocol(protocol : String) : Int {
+		return untyped __call__('getprotobyname', protocol);
+ 	}
 }
 }
 
 
 enum SocketDomain {
 enum SocketDomain {