Here’s a handy tip which can help you when deploying Flex applications on mulitple servers (such as a staging/production server). Basically you can listen for the Application tag to dispatch the applicationComplete event, grab the URL of the SWF using the loaderInfo.url property, and then use the URLUtil.getServerName() method to parse out the server name.

Full code after the jump.

<?xml version="1.0" encoding="utf-8"?>
<!-- http://blog.flexexamples.com/2007/08/09/determining-which-serverdomain-a-swf-is-hosted-on/ -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" applicationComplete="init()">
 
    <mx:Script>
        <![CDATA[
            import mx.utils.URLUtil;
 
            private function init():void {
                lbl.text = "url=" + URLUtil.getServerName(Application.application.loaderInfo.url);
            }
        ]]>
    </mx:Script>
 
    <mx:Label id="lbl" text="" />
 
</mx:Application>

View source is enabled in the following example.

 
Tagged with:
 
About The Author

Peter deHaan

Peter deHaan currently works for Adobe on the Flex SDK QA team. While not working on Flex, Flash, and ColdFusion applications, Peter enjoys making up bios and writing in 3rd person. Peter's rarely updated blog can be found at blogs.adobe.com/pdehaan/, actionscriptexamples.com, airexamples.com, and coldfusionexamples.com.

19 Responses to Determining which server/domain a SWF is hosted on

  1. Charly says:

    Hi,

    what kind of dataType is returned from the loaderInfo.url? Must be a String…isn’t it?

  2. peterd says:

    Charly,

    Yep, its a String. If I would have displayed the full URL, it would have shown:
    http://blog.flexexamples.com/wp-content/uploads/Application_loaderInfo_url_test/bin/main.swf

    Although I used the URLUtil.getServerName() method to just return the server name, or just “blog.flexexamples.com”.

  3. Dasa says:

    Couldn’t you also just use Application.application.url ?

  4. peterd says:

    Dasa,

    Yes, I believe you can use Application.application.url if you just have one main SWF (Application.application.url and Application.application.loaderInfo.url should return the same value), but if you’re loading another Flex SWF using the SWFLoader control, I believe they start returning different values.

    For example, in the loaded SWF, I believe Application.application.loaderInfo.url returns the current losded SWF file’s URL, whereas Application.application.url returns the parent SWFs URL.

    At least thats what I think.

  5. Dale says:

    Thanks for this one peterd – I’d been scouring around all morning trying to find a solution like this!

  6. Wayne says:

    peterd,
    Very handy. Does URLUtil has functions to get referer and user agent, similar to PHP’s $_SERVER['HTTP_REFERER'] and $_SERVER['HTTP_USER_AGENT']? Thank you.
    Wayne

  7. peterd says:

    Wayne,

    I don’t believe it does, but you could use the ExternalInterface API to get that information from your HTML container using JavaScript. For example, see “Returning values from JavaScript in your Flex applications using the ExternalInterface API”.

    Peter

  8. Charles says:

    Thanks for this solution peterd.
    Congrats for the post.

    Charles, http://www.tldsco.com

  9. jlafferty says:

    Thanks PD. I did a quick web search because I forgot how to do this and you had the answer. :)

  10. peterd says:

    jlafferty,

    You are welcome. That will be $3 please.

    Peter

  11. Pike Nike says:

    I found a work around for this problem:

    use a full url in request.url as follows

    var serverName : String URLUtil.getServerName(Application.application.loaderInfo.url;
    var request:URLRequest = new URLRequest();
    request.url = "https://" + serverName + ":8443/appContext/uploadServlet";
    fileReference.upload(request);
  12. Pike Nike says:

    sorry nevermind, wrong post

  13. Steve says:

    Hi
    I have a project where i have a flex application that launches a.swf file and need’s to add a uri value to the .swf, and i am not sure how to begin with this.

    The .swf file currently has a datainput field where you can manually type the uri value, but i need the flex input value to automatically overwrite or be added to this component….

    This is pulling my hair out, any help would be much appreciated. I would even compensate someone for helping me here as i have a deadline approaching.

    Regards

    steve

    • Peter deHaan says:

      Steve,

      I’m a little unclear on what you’re trying to do. Are you trying to load an external SWF into a Flex project at runtime (presumably using SWFLoader) and pass variables to the nested SWF?

      If so, does this help:

      <?xml version="1.0" encoding="utf-8"?>
      <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
       
          <mx:Script>
              <![CDATA[
                  protected function btn_clickHandler(evt:MouseEvent):void {
                      swfLdr.source = "subApp.swf?text=" + encodeURIComponent(txtInput.text) + "&color=" + cp.selectedColor;
                  }
              ]]>
          </mx:Script>
       
          <mx:ApplicationControlBar dock="true" defaultButton="{btn}">
              <mx:TextInput id="txtInput" maxChars="32" />
              <mx:ColorPicker id="cp" />
              <mx:Button id="btn" label="Send and Load" click="btn_clickHandler(event);" />
          </mx:ApplicationControlBar>
       
          <mx:SWFLoader id="swfLdr" width="320" height="240" />
       
      </mx:Application>

      And my nested SWF, subApp.swf, was built from the following (subApp.mxml):

      <?xml version="1.0" encoding="utf-8"?>
      <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
              backgroundColor="haloBlue"
              applicationComplete="init();">
       
          <mx:Script>
              <![CDATA[
                  protected function init():void {
                      lbl.text = this.loaderInfo.parameters.text;
                      lbl.setStyle("color", this.loaderInfo.parameters.color);
                  }
              ]]>
          </mx:Script>
       
          <mx:Text id="lbl"
                  fontSize="32"
                  width="90%" height="90%"
                  horizontalCenter="0" verticalCenter="0" />
       
      </mx:Application>

      Or, for bonus points, here’s how you could create the loaded sub-application using ActionScript only (oooooh, fancy!):

      package {
          import flash.display.MovieClip;
          import flash.text.TextField;
          import flash.text.TextFormat;
       
          [SWF(width="320", height="240", backgroundColor="#CCCCCC")]
       
          public class subASApp extends MovieClip {
              public var tf:TextField;
       
              public function subASApp() {
                  super();
                  init();
              }
       
              private function init():void {
                  var fmt:TextFormat = new TextFormat();
                  fmt.font = "Arial";
                  fmt.size = 24;
                  if (this.loaderInfo.parameters.hasOwnProperty("color")) {
                      fmt.color = parseInt(this.loaderInfo.parameters.color);
                  }
       
                  tf = new TextField();
                  tf.width = 300;
                  tf.height = 220;
                  tf.x = 10;
                  tf.y = 10;
                  tf.wordWrap = true;
                  tf.multiline = true;
                  tf.defaultTextFormat = fmt;
                  tf.text = this.loaderInfo.parameters.text;
                  if (tf.text.length == 0) {
                      tf.text = "(default)";
                  }
                  addChild(tf);
              }
          }
      }

      Peter

  14. Anonymous says:

    Great, thanx! :)

  15. vineet says:

    Thanks for the posting. I have a flex application that communicates with a .net webservice. The problem is I do not want to hard code the webservice address. ie wsdl=”http://…..” How do I know the domain name at runtime where the application is hosted. Please help.

  16. jbuda says:

    Very handy post, just been looking at how to do this with my Flex application, and found this solution spot on.

    Thanks

  17. moonraider says:

    I am new to flex. i wanted to do the following
    i want an swf file to call another swf file which has widgets in it and is hosted on another server. like a main swf hosted on iis. i added link of another swf file (full qualified path on its config.xml file) which is hosted on apache. will it work

  18. umpirsky says:

    var localConnection:LocalConnection = new LocalConnection();
    trace(localConnection.domain);

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Anti-Spam Protection by WP-SpamFree