Subject: Re: Remembering the last used mirror

From: "Dave Page" <[email-masked]>
Date: Sun, 18 Mar 2007 20:34:47 -0000

> ------- Original Message -------
> From: Magnus Hagander <[email-masked]>
> To: PostgreSQL www <[email-masked]>
> Sent: 18/03/07, 19:41:35
> Subject: [pgsql-www] Remembering the last used mirror
> 
>  (Or for that matter, does anybody think this whole
> thing is a crappy idea?)

Yes, we used to do that and it was a real pita that caused nothing but trouble. Please do not commit.

/D

---

From: Magnus Hagander <[email-masked]>
Date: Sun, 18 Mar 2007 22:42:52 +0100

Dave Page wrote:
> Yes, we used to do that and it was a real pita that caused nothing but trouble. 

Really? That must've been before my time, 'cuz I don't remember any of
that. Out of curiosity, exactly what were the issues, if you recall?
(Not questioning you, just want to know given that so many others to it
that way..)

> Please do not commit.

Ok, I won't.

//Magnus

---

From: Dave Page <[email-masked]>
Date: Mon, 19 Mar 2007 08:51:48 +0000

Magnus Hagander wrote:
> that. 

It almost certainly was, back when Vince did most of the web stuff.

> Out of curiosity, exactly what were the issues, if you recall?

Well it was slightly different back then so what you have now may be OK
- I just want to make sure it's gonna work this time before
inadvertently annoying people!

Back then, the front page of the website was an auto-redirect to one of
the mirror sites. This used to lead to two problems:

- If the site you got directed to was down or slow, it was a nightmare
to get to another mirror because the auto-redirect kicked in instantly
when you hit the back button. This shouldn't be a problem this time as
now I'm in a position to look at what you've done, I can see you display
the page, a warning and give a delay before redirecting.

- After the auto-redirect had kicked in, some browsers (notably, IE)
misbehave and won't respond to the stop or back button for some time -
seemingly whilst they wait for the initial connection to succeed or
timeout. This could also be a PITA, but should be purely a browser issue
with the delay you've included (it magnified the annoyance levels caused
by the bad design previously).

So I *think* the main issues that auto-redirecting had last time round
are not problems with your code.

One thought that does spring to mind though, what happens if the mirror
used previously has dropped out of use when you return? Will it still
default to it?

Regards, Dave.

---

From: Magnus Hagander <[email-masked]>
Date: Mon, 19 Mar 2007 10:01:24 +0100

> It almost certainly was, back when Vince did most of the web stuff.

That was certainly way back. And I *do* remember there being problems
around that. I thoguht yo were referring to ftp downloads specifically.

> inadvertently annoying people!

:-) Yeah, that's why I brought it up before I committed anything.

> the page, a warning and give a delay before redirecting.

Right, this is the very reason why I want to discuss that timeout of 5
seconds. It will direct you off there in 5 seconds. If the site is very
slow, you can click on another link. If the site is 404 (but hasn't been
picked up by the mirror checkign script yet), you will get redirected to
that 404 page. But at least in my tests with firefox, if I then hit
back, I get to the mirror list and it will *not* redirect me again. But
that's a client-side thing, so it might be different in different
browsers.

> by the bad design previously).

I haven't seen that with any other sites, so maybe it's just been fixed
in more recent versions of the browsers. There have been a couple coming
out since that time :-)

> used previously has dropped out of use when you return? Will it still

No, then it will not show a default mirror at all - it will look like
you had never picked a mirror.

I'll attach a diff for the actual code, so you can check that part out.
Should've done that the first time :-)

//Magnus

Index: template/common.html
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/template/common.html,v
retrieving revision 1.37
diff -c -r1.37 common.html
*** template/common.html	12 Mar 2007 16:00:46 -0000	1.37
--- template/common.html	19 Mar 2007 09:00:18 -0000
***************
*** 18,23 ****
--- 18,26 ----
      <script type="text/javascript" src="{master_server}/external/tinymce/tiny_mce.js"></script>
      <script type="text/javascript" src="/layout/js/tinymce.js"></script>
  <!-- END include_tinymce_scripts -->
+ <!-- BEGIN extra_header_data -->
+ {extra_header_data}
+ <!-- END extra_header_data -->
      <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script><script type="text/javascript">_uacct = "UA-1345454-1";urchinTracker();</script>
    </head>
    <body>
Index: template/download.html
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/template/download.html,v
retrieving revision 1.10
diff -c -r1.10 download.html
*** template/download.html	18 Mar 2007 17:55:59 -0000	1.10
--- template/download.html	19 Mar 2007 09:00:18 -0000
***************
*** 16,28 ****
  <p><a href="ftp://ftp.postgresql.org/">func_lang("Download PostgreSQL from the primary site")</a></p>
  <!-- END no_mirrors_block -->
  
  <!-- BEGIN near_mirrors_block -->
  <p><b>func_lang("We think these mirrors are near you:")</b></p>
  <table border="0" width="100%">
      <!-- BEGIN near_mirror_row_loop -->
      <tr>
          <!-- BEGIN near_mirror_cell_loop -->
!         <td style="text-align: center; width: 20%; white-space: nowrap;"><img src="http://www.postgresql.org/layout/images/flags/{img}" alt="{country}" width="32" height="21" style="border: 1px" /><br/>{country}<br/><!-- BEGIN mirror_http_link --><a href="{master_server}/redir?{httpurl}">http</a> | <!-- END mirror_http_link --><a href="{master_server}/redir?{url}">ftp</a><br />&nbsp;</td>
          <!-- END near_mirror_cell_loop -->
          <!-- BEGIN near_mirror_cell_empty -->
          <td>&nbsp;</td>
--- 16,37 ----
  <p><a href="ftp://ftp.postgresql.org/">func_lang("Download PostgreSQL from the primary site")</a></p>
  <!-- END no_mirrors_block -->
  
+ <!-- BEGIN last_mirror_block -->
+ <p><b>func_lang("You have used this mirror before:")</b></p>
+ <p>
+ <b><a href="{master_server}/redir?{url}">{urlh}</a></b>
+ </p>
+ <p>Your download will start automatically from this mirror in 5 seconds unless you select
+ another mirror in the list below.</p>
+ <!-- END last_mirror_block -->
+ 
  <!-- BEGIN near_mirrors_block -->
  <p><b>func_lang("We think these mirrors are near you:")</b></p>
  <table border="0" width="100%">
      <!-- BEGIN near_mirror_row_loop -->
      <tr>
          <!-- BEGIN near_mirror_cell_loop -->
!         <td style="text-align: center; width: 20%; white-space: nowrap;"><img src="http://www.postgresql.org/layout/images/flags/{img}" alt="{country}" width="32" height="21" style="border: 1px" /><br/>{country}<br/><!-- BEGIN mirror_http_link --><a href="{master_server}/redir?setmir={mirid}&typ=h&url={httpurl}">http</a> | <!-- END mirror_http_link --><a href="{master_server}/redir?setmir={mirid}&typ=f&url={url}">ftp</a><br />&nbsp;</td>
          <!-- END near_mirror_cell_loop -->
          <!-- BEGIN near_mirror_cell_empty -->
          <td>&nbsp;</td>
***************
*** 38,44 ****
      <!-- BEGIN std_mirror_row_loop -->
      <tr>
          <!-- BEGIN std_mirror_cell_loop -->
!         <td style="text-align: center; width: 20%; white-space: nowrap;"><img src="http://www.postgresql.org/layout/images/flags/{img}" alt="{country}" width="32" height="21" style="border: 1px" /><br/>{country}<br/><!-- BEGIN mirror_http_link_std --><a href="{master_server}/redir?{httpurl}">http</a> | <!-- END mirror_http_link_std --><a href="{master_server}/redir?{url}">ftp</a><br />&nbsp;</td>
          <!-- END std_mirror_cell_loop -->
          <!-- BEGIN std_mirror_cell_empty -->
          <td>&nbsp;</td>
--- 47,53 ----
      <!-- BEGIN std_mirror_row_loop -->
      <tr>
          <!-- BEGIN std_mirror_cell_loop -->
!         <td style="text-align: center; width: 20%; white-space: nowrap;"><img src="http://www.postgresql.org/layout/images/flags/{img}" alt="{country}" width="32" height="21" style="border: 1px" /><br/>{country}<br/><!-- BEGIN mirror_http_link_std --><a href="{master_server}/redir?setmir={mirid}&typ=h&url={httpurl}">http</a> | <!-- END mirror_http_link_std --><a href="{master_server}/redir?setmir={mirid}&typ=f&url={url}">ftp</a><br />&nbsp;</td>
          <!-- END std_mirror_cell_loop -->
          <!-- BEGIN std_mirror_cell_empty -->
          <td>&nbsp;</td>
Index: system/redir.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/redir.php,v
retrieving revision 1.5
diff -c -r1.5 redir.php
*** system/redir.php	12 Mar 2007 14:51:43 -0000	1.5
--- system/redir.php	19 Mar 2007 09:00:18 -0000
***************
*** 2,8 ****
     require_once './global/settings.php';
  
     // Get the URL and hostname
!    $url = urldecode($_SERVER['QUERY_STRING']);
     $bits = parse_url($url);
     $scheme = $bits['scheme'];
     $host = $bits['host'];
--- 2,18 ----
     require_once './global/settings.php';
  
     // Get the URL and hostname
!    if (isset($_GET['url'])) {
!       $url = $_GET['url'];
!       if (isset($_GET['setmir']) && isset($_GET['typ'])) {
!          if ($_GET['typ'] == 'h' || $_GET['typ'] == 'f') {
!             setcookie('dlmirror', intval($_GET['setmir']), time()+60*60*24*300);
!             setcookie('dlmirrortype', $_GET['typ'], time()+60*60*24*300);
!          }
!       }
!    }
!    else 
!       $url = urldecode($_SERVER['QUERY_STRING']);
     $bits = parse_url($url);
     $scheme = $bits['scheme'];
     $host = $bits['host'];
Index: system/page/mirrors.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/page/mirrors.php,v
retrieving revision 1.13
diff -c -r1.13 mirrors.php
*** system/page/mirrors.php	18 Mar 2007 17:55:59 -0000	1.13
--- system/page/mirrors.php	19 Mar 2007 09:00:18 -0000
***************
*** 11,16 ****
--- 11,22 ----
  
      function Render() {
          $file = isset($_GET['file'])?$_GET['file']:'';
+         if (isset($_COOKIE['dlmirror']) && isset($_COOKIE['dlmirrortype'])) {
+             $lastmirrid = intval($_COOKIE['dlmirror']);
+             $lastmirrtype = $_COOKIE['dlmirrortype'];
+         }
+         else
+             $lastmirrid = -1;
  
          $this->tpl->touchBlock('ftp_mirror_greeting');
  
***************
*** 18,24 ****
  
          $this->tpl->setVariable('file', htmlentities($file));
  
!         $rs = $this->pg_query("SELECT CASE WHEN mirror_index = 0 THEN ''::text ELSE mirror_index::text END || '.' || country_code || '.postgresql.org' AS hostname, host_port AS port, host_path AS path, country_name AS country, country_code, alternate_protocol FROM mirrors WHERE mirror_type='ftp' AND mirror_active AND NOT mirror_private AND mirror_dns AND mirror_last_rsync > (now() - '48 hrs'::interval) ORDER BY country_name, alternate_protocol DESC, mirror_index");
          if (pg_num_rows($rs) == 0)
              throw new Exception('No mirrors were found');
  
--- 24,30 ----
  
          $this->tpl->setVariable('file', htmlentities($file));
  
!         $rs = $this->pg_query("SELECT CASE WHEN mirror_index = 0 THEN ''::text ELSE mirror_index::text END || '.' || country_code || '.postgresql.org' AS hostname, host_port AS port, host_path AS path, country_name AS country, country_code, alternate_protocol, id FROM mirrors WHERE mirror_type='ftp' AND mirror_active AND NOT mirror_private AND mirror_dns AND mirror_last_rsync > (now() - '48 hrs'::interval) ORDER BY country_name, alternate_protocol DESC, mirror_index");
          if (pg_num_rows($rs) == 0)
              throw new Exception('No mirrors were found');
  
***************
*** 35,41 ****
              $this->tpl->setVariable(array(
                  'url'     => urlencode('ftp://ftp' . $mirror['hostname'] . (0 < intval($mirror['port'])? ':' . $mirror['port']: '') . $mirror['path'] . $mirror['file']),
                  'img'     => str_replace(' ', '', $mirror['country']) . '.gif',
!                 'country' => ucwords($mirror['country'])
              ));
              if ($mirror['alternate_protocol'] == 't')
                  $this->tpl->setVariable('httpurl', 'http://ftp' . $mirror['hostname'] . $mirror['path'] . $mirror['file']);
--- 41,48 ----
              $this->tpl->setVariable(array(
                  'url'     => urlencode('ftp://ftp' . $mirror['hostname'] . (0 < intval($mirror['port'])? ':' . $mirror['port']: '') . $mirror['path'] . $mirror['file']),
                  'img'     => str_replace(' ', '', $mirror['country']) . '.gif',
!                 'country' => ucwords($mirror['country']),
!                 'mirid'  => $mirror['id']
              ));
              if ($mirror['alternate_protocol'] == 't')
                  $this->tpl->setVariable('httpurl', 'http://ftp' . $mirror['hostname'] . $mirror['path'] . $mirror['file']);
***************
*** 52,57 ****
--- 59,86 ----
                      $this->tpl->parse('std_mirror_row_loop');
                  }
              }
+             if ($lastmirrid == $mirror['id']) {
+                 // used this mirror the last time
+                 if ($lastmirrtype == 'f')
+                     $host = 'ftp://ftp' . $mirror['hostname'];
+                 elseif ($lastmirrtype == 'h') {
+                     if ($mirror['alternate_protocol'] == 't')
+                         $host = 'http://ftp' . $mirror['hostname'];
+                     else
+                         continue; // requested http, but http no longer available
+                 }
+                 else
+                     continue; // Unknown type, so don't show it at all
+ 
+                 $url = $host . (0 < intval($mirror['port'])? ':' . $mirror['port']: '') . $mirror['path'] . $mirror['file'];
+                 $this->tpl->setVariable(array(
+                     'url' => urlencode($url),
+                     'urlh' => htmlentities($host)
+                 ));
+                 $this->tpl->parse('last_mirror_block');
+ 
+                 $this->tpl->setVariable('extra_header_data', '<meta http-equiv="refresh" content="5;' . $url . '" />');
+             }
          }
  
          // Add some empty cells if needed

---

From: Dave Page <[email-masked]>
Date: Mon, 19 Mar 2007 09:22:12 +0000

> you had never picked a mirror.

OK, that's good, and I can't see any of the previous issues, so
objection withdrawn.

> Should've done that the first time :-)

Woulda helped :-)

Just one thing - I'm not sure I like the way the flags look with the two
lines of text below them now - can you do a mockup with the country name
above, and the links below please?

/D

---

From: Magnus Hagander <[email-masked]>
Date: Mon, 19 Mar 2007 16:16:05 +0100

> above, and the links below please?

Kinda like that?

Or should we consider removing the text completely? It's there as an alt
tag on the image for text browsers already, which will also cause a
popup tooltip in IE. IIRC, we can set the title attribute to give such a
tooltip in other browsers..

//Magnus

---

From: Dave Page <[email-masked]>
Date: Mon, 19 Mar 2007 15:30:35 +0000

> tooltip in other browsers..

Yeah, I think that would be better.

Regards, Dave

---

From: Magnus Hagander <[email-masked]>
Date: Mon, 19 Mar 2007 20:49:21 +0100

> Yeah, I think that would be better.

Applied. Feel free to rip it apart :-)

//Magnus