Selaa lähdekoodia

php : fixed enum constructors sequence (issue 142)

Franco Ponticelli 15 vuotta sitten
vanhempi
commit
acee1baa3c
5 muutettua tiedostoa jossa 55 lisäystä ja 24 poistoa
  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)
 		this will only work if .toString called explicitely on Date class
 	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
 	js : added js.Scroll

+ 15 - 4
genphp.ml

@@ -1495,7 +1495,6 @@ and gen_expr ctx e =
 		spr ctx ", ";
 		gen_expr ctx (mk (TTypeExpr t) (mk_texpr t) e1.epos);
 		spr ctx ")"
-(*		gen_expr ctx (Codegen.default_cast ctx.com e1 t e.etype e.epos) *)
 
 and gen_value ctx 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
 
 	print ctx "class %s extends Enum {" ename;
-	let cl = open_block ctx in
 	PMap.iter (fun _ c ->
 		newline ctx;
 		match c.ef_type with
@@ -1894,8 +1892,22 @@ let generate_enum ctx e =
 		| _ ->
 			print ctx "public static $%s" c.ef_name;
 	) e.e_constrs;
-	cl();
 	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 "}";
 
 	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;
 	) e.e_constrs;
 
-	pack();
 	newline ctx
 
 let generate com =

+ 3 - 9
std/Type.hx

@@ -562,15 +562,9 @@ class Type {
 	**/
 	public static function getEnumConstructs( e : Enum<Dynamic> ) : Array<String> untyped {
 		#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
 			return untyped e.GetClassFields();
 		#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;
 	#end
 
+	/**
+	 * In PHP Https (SSL) connections are allowed only if the OpenSSL extension is enabled.
+	 * @param	url
+	 */
 	public function new( url : String ) {
 		this.url = url;
 		headers = new Hash();
@@ -265,19 +269,32 @@ class Http {
 	}
 
 	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]+)?(.*)$/;
+		#end
 		if( !url_regexp.match(url) ) {
 			onError("Invalid URL");
 			return;
 		}
-		if( sock == null )
+		if ( sock == null )
+			#if php
+			sock = (secure) ? Socket.newSslSocket() : new Socket();
+			#else
 			sock = new Socket();
+			#end
 		var host = url_regexp.matched(2);
 		var portString = url_regexp.matched(3);
 		var request = url_regexp.matched(4);
 		if( 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 multipart = (file != null);

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

@@ -36,12 +36,13 @@ class Socket {
 	public var output(default,null) : SocketOutput;
 	public var custom : Dynamic;
 
-	public var isUdp(default, null) : Bool;
+	public var protocol(default, null) : String;
 
 	public function new( ?s ) {
 		__s = s;
 		input = new SocketInput(__s);
 		output = new SocketOutput(__s);
+		protocol = "tcp";
 	}
 
 	private function assignHandler() {
@@ -72,8 +73,8 @@ class Socket {
 	public function connect(host : Host, port : Int) {
 		var errs = 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;
 		assignHandler();
 	}
@@ -99,8 +100,8 @@ class Socket {
 	public function bind(host : Host, port : Int) {
 		var errs = 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;
 		assignHandler();
 	}
@@ -147,9 +148,15 @@ class Socket {
 	// STATICS
 	public static function newUdpSocket() {
 		var s = new Socket();
-		untyped s.isUdp = true;
+		s.protocol = "udp";
 		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) {
 		if(!untyped __physeq__(r, false)) return;
@@ -160,9 +167,9 @@ class Socket {
 		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 {