--- loncom/auth/switchserver.pm	2019/06/15 02:50:04	1.49
+++ loncom/auth/switchserver.pm	2021/05/04 18:47:37	1.55
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Switch Servers Handler
 #
-# $Id: switchserver.pm,v 1.49 2019/06/15 02:50:04 raeburn Exp $
+# $Id: switchserver.pm,v 1.55 2021/05/04 18:47:37 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -29,7 +29,7 @@
 package Apache::switchserver;
 
 use strict;
-use Apache::Constants qw(:common);
+use Apache::Constants qw(:common :remotehost);
 use Apache::lonnet;
 use Digest::MD5 qw(md5_hex);
 use CGI::Cookie();
@@ -111,7 +111,7 @@ sub handler {
 						   $env{'user.name'});
 	if (! $env{'form.otherserver'}) {
 	    $env{'form.otherserver'} = 
-		&Apache::lonnet::spareserver(30000,undef,1);
+		&Apache::lonnet::spareserver($r,30000,undef,1);
 	}
 	$switch_to=&Apache::lonnet::hostname($env{'form.otherserver'});
     }
@@ -123,6 +123,10 @@ sub handler {
         if ($Apache::lonnet::protocol{$env{'form.otherserver'}} eq 'https') {
             $protocol = $Apache::lonnet::protocol{$env{'form.otherserver'}};
         }
+        unless ($env{'form.otherserver'} eq $r->dir_config('lonHostID')) {
+            my $alias = &Apache::lonnet::use_proxy_alias($r,$env{'form.otherserver'});
+            $switch_to = $alias if ($alias ne '');
+        }
     }
 
     if ($env{'user.name'} eq 'public'
@@ -211,7 +215,8 @@ sub handler {
     } else {
         $logmsg .= " (no role)";
     }
-    $logmsg .= ' '.$ENV{'REMOTE_ADDR'};
+    my $ip = &Apache::lonnet::get_requestor_ip($r,REMOTE_NOLOOKUP);
+    $logmsg .= ' '.$ip;
     &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
 			 $env{'user.home'},$logmsg);
 
@@ -231,13 +236,13 @@ sub handler {
 	return OK;
     }
 # -------------------------------------------------------- Menu script and info
-	   
+
 # ---------------------------------------------------------------- Get handover
 
-    my $newcookieid;
+    my ($is_balancer,$setcookie,$newcookieid,$otherbalcookie,$offloadto,$dom_balancers);
     my $only_body = 0;
-    my ($is_balancer,$posshost,$setcookie,$offloadto,$dom_balancers) =
-        &Apache::lonnet::check_loadbalancing($env{'user.name'},$env{'user.domain'});
+    ($is_balancer,undef,$setcookie,$offloadto,$dom_balancers) =
+        &Apache::lonnet::check_loadbalancing($env{'user.name'},$env{'user.domain'},'switchserver');
     if ($is_balancer && $setcookie && $env{'form.otherserver'}) {
 
         # Set a balancer cookie unless browser already sent LON-CAPA load balancer
@@ -252,8 +257,11 @@ sub handler {
                                               $env{'user.name'},$env{'user.domain'});
         }
     }
+    if ((!$is_balancer) && ($env{'request.balancercookie'})) {
+        $otherbalcookie = $env{'request.balancercookie'};
+    }
 
-    my %info=('ip'            => $ENV{'REMOTE_ADDR'},
+    my %info=('ip'            => $ip,
               'domain'        => $env{'user.domain'},
               'username'      => $env{'user.name'},
               'home'          => $env{'user.home'},
@@ -274,6 +282,8 @@ sub handler {
     }
     if ($newcookieid) {
         $info{'balcookie'} = $newcookieid;
+    } elsif ($otherbalcookie) {
+        $info{'otherbalcookie'} = $otherbalcookie;
     }
     if ($env{'form.origurl'}) {
         $info{'origurl'} = $env{'form.origurl'};