You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2022/02/11 03:28:23 UTC

[royale-asjs] branch develop updated: Community request - adding CORS support to URLStream, similar to URLLoader.

This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 5e48fef  Community request - adding CORS support to URLStream, similar to URLLoader.
     new 8131b98  Merge branch 'develop' of https://github.com/apache/royale-asjs into develop
5e48fef is described below

commit 5e48feffd57623201f733810a577946efd2cf869
Author: greg-dove <gr...@gmail.com>
AuthorDate: Fri Feb 11 16:27:48 2022 +1300

    Community request - adding CORS support to URLStream, similar to URLLoader.
---
 .../Network/src/main/resources/basic-manifest.xml  |   1 +
 .../main/royale/org/apache/royale/net/URLStream.as |  22 ++++
 .../royale/net/beads/GlobalCORSCredentialsBead.as  | 129 +++++++++++++++++++++
 3 files changed, 152 insertions(+)

diff --git a/frameworks/projects/Network/src/main/resources/basic-manifest.xml b/frameworks/projects/Network/src/main/resources/basic-manifest.xml
index 5218ee1..ffa702c 100644
--- a/frameworks/projects/Network/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Network/src/main/resources/basic-manifest.xml
@@ -28,6 +28,7 @@
     <component id="BinaryUploader" class="org.apache.royale.net.BinaryUploader"/>
     <component id="CORSCredentialsBead" class="org.apache.royale.net.beads.CORSCredentialsBead"/>
     <component id="URLLoaderCORSCredentialsBead" class="org.apache.royale.net.beads.URLLoaderCORSCredentialsBead"/>
+    <component id="GlobalCORSCredentialsBead" class="org.apache.royale.net.beads.GlobalCORSCredentialsBead"/>
     <component id="FileProxy" class="org.apache.royale.file.FileProxy"/>
     <component id="FileBrowser" class="org.apache.royale.file.beads.FileBrowser"/>
     <component id="FileBrowserWithFilter" class="org.apache.royale.file.beads.FileBrowserWithFilter"/>
diff --git a/frameworks/projects/Network/src/main/royale/org/apache/royale/net/URLStream.as b/frameworks/projects/Network/src/main/royale/org/apache/royale/net/URLStream.as
index d72bf64..c6485d3 100644
--- a/frameworks/projects/Network/src/main/royale/org/apache/royale/net/URLStream.as
+++ b/frameworks/projects/Network/src/main/royale/org/apache/royale/net/URLStream.as
@@ -52,6 +52,25 @@ package org.apache.royale.net
 		{
 			protected var xhr:XMLHttpRequest;
 		}
+
+		COMPILE::JS
+		private static var _corsCredentialsChecker:Function;
+		COMPILE::JS
+		/**
+		 * Intended as global configuration of CORS withCredentials setting on requests
+		 * This method is not reflectable, is js-only and is eliminated via dead-code-elimination
+		 * in js-release builds if it is never used.
+		 * URLStream is used a service base in other service classes, so this provides
+		 * a 'low level' solution for a bead that can work at application level.
+		 * The 'checker' function parameter should be a function that takes a url as its single argument
+		 * and returns true or false depending on whether 'withCredentials' should be set for
+		 * that http request. Set it to null to always be false.
+		 * @private
+		 * @royalesuppressexport
+		 */
+		public static function setCORSCredentialsChecker(checker:Function):void{
+			_corsCredentialsChecker = checker;
+		}
 			
 		COMPILE::SWF
 		{
@@ -117,6 +136,9 @@ package org.apache.royale.net
 			COMPILE::JS {
 				requestStatus = 0;
 				createXmlHttpRequest();
+				if (_corsCredentialsChecker != null) {
+					xhr.withCredentials = _corsCredentialsChecker( urlRequest.url);
+				}
 
 				xhr.open(urlRequest.method, urlRequest.url);
 				xhr.responseType = "arraybuffer";
diff --git a/frameworks/projects/Network/src/main/royale/org/apache/royale/net/beads/GlobalCORSCredentialsBead.as b/frameworks/projects/Network/src/main/royale/org/apache/royale/net/beads/GlobalCORSCredentialsBead.as
new file mode 100644
index 0000000..e9c9382
--- /dev/null
+++ b/frameworks/projects/Network/src/main/royale/org/apache/royale/net/beads/GlobalCORSCredentialsBead.as
@@ -0,0 +1,129 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package org.apache.royale.net.beads {
+    import org.apache.royale.core.IBead;
+    import org.apache.royale.core.IStrand;
+    import org.apache.royale.net.URLLoader;
+    import org.apache.royale.net.URLStream;
+    
+
+    COMPILE::SWF
+    public class GlobalCORSCredentialsBead implements IBead{
+        public function GlobalCORSCredentialsBead(filter:* = null) {
+            trace("Only needed for JavaScript HTTP Server calls");
+        }
+    
+        public function set strand(value:IStrand):void {
+            //doing nothing with strand
+        }
+    }
+
+    /**
+     *  [JS] Bead to allow passing on user authentication information in a XMLHttpRequest request.
+     *  Affects all http support classes that use org.apache.royale.net.URLLoader or org.apache.royale.net.URLStream
+     *
+     *  If you don't use this bead any cross domain calls that require user authentication
+     *  (via say basic authentication or cookies) will fail.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9
+     */
+    COMPILE::JS
+    public class GlobalCORSCredentialsBead implements IBead {
+    
+        private static const alwaysTrue:Function = function(url:String):Boolean{return true};
+        private static function getRegexpChecker(regexp:RegExp):Function {
+            return function(url:String):Boolean{
+                return regexp.test(url);
+            }
+        }
+        
+        
+        
+        public function GlobalCORSCredentialsBead(filter:* = null) {
+            if (filter) {
+                withCredentialsFilter = filter;
+            }
+        }
+
+
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         */
+        public function set strand(value:IStrand):void {
+            //doing nothing with strand
+        }
+
+        
+        
+        private var _withCredentialsFilter:* ;
+
+        /**
+         *  configure setting for URLLoader requests
+         *  Can be set to true or false
+         *  Or a Regexp that tests for what should be true in a url string
+         *  Or a String value this is 'always' or 'never'
+         *  Or a String that is used to construct a Regexp
+         *  Or a Function that does its own checking
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.8
+         */
+        public function get withCredentialsFilter():* {
+            return _withCredentialsFilter;
+        }
+
+        public function set withCredentialsFilter(filter:*):void {
+            if (!filter) {
+                _withCredentialsFilter = null;
+            } else {
+                if (typeof filter == 'boolean' || filter == 'always' || filter == 'never') { //it must be true because false was already eliminated
+                    _withCredentialsFilter = filter != 'never' ? alwaysTrue : null;
+                } else {
+                    if (filter is String) {
+                        //pre-process to Regexp
+                        filter = new RegExp(String(filter));
+                    }
+                    if (filter is RegExp) {
+                        _withCredentialsFilter = getRegexpChecker(filter as RegExp);
+                    } else {
+                        if (filter is Function) {
+                            _withCredentialsFilter = filter as Function;
+                        } else  {
+            
+                            throw new Error('Unsupported argument for withCredentialsFilter');
+                        }
+                    }
+                }
+            }
+            URLLoader.setCORSCredentialsChecker(_withCredentialsFilter);
+            URLStream.setCORSCredentialsChecker(_withCredentialsFilter);
+        }
+    }
+}