Replace @ with ~ in the shortlink
authorMatt Amos <zerebubuth@gmail.com>
Thu, 24 Nov 2011 22:15:43 +0000 (22:15 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 24 Nov 2011 22:27:16 +0000 (22:27 +0000)
This should help Twitter's horribly broken URL detection algorithm
not screw up shortlinks from OSM.

app/assets/javascripts/site.js
config/routes.rb
lib/short_link.rb
test/unit/short_link_test.rb

index be16dd0599a4058c1ba6c371efcca204e3c9b0ab..9f80bf25d9387a2627f4a623ceabc5c53d2ac4b4 100644 (file)
@@ -204,7 +204,7 @@ function interlace(x, y) {
  * Called to create a short code for the short link.
  */
 function makeShortCode(lat, lon, zoom) {
-    char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@";
+    char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~";
     var x = Math.round((lon + 180.0) * ((1 << 30) / 90.0));
     var y = Math.round((lat +  90.0) * ((1 << 30) / 45.0));
     // JavaScript only has to keep 32 bits of bitwise operators, so this has to be
index cd7261cdf81a68f1759a835e458eae21448a128f..0a617b6a30a8ed4c766c43704dd599b0aa1a52cc 100644 (file)
@@ -123,7 +123,7 @@ OpenStreetMap::Application.routes.draw do
   match '/forgot-password.html' => 'user#lost_password'
 
   # permalink
-  match '/go/:code' => 'site#permalink', :code => /[a-zA-Z0-9_@]+[=-]*/
+  match '/go/:code' => 'site#permalink', :code => /[a-zA-Z0-9_@~]+[=-]*/
 
   # traces
   match '/user/:display_name/traces/tag/:tag/page/:page' => 'trace#list'
index b91d7e569dddc57d12e3b3fe02d11df7aea10e82..045883d57b5c45fb2435aa6e2411ffe1b7d58ce8 100644 (file)
@@ -9,7 +9,7 @@ module ShortLink
   # array of 64 chars to encode 6 bits. this is almost like base64 encoding, but
   # the symbolic chars are different, as base64's + and / aren't very 
   # URL-friendly.
-  ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','@']
+  ARRAY = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a + ['_','~']
 
   ##
   # Given a string encoding a location, returns the [lon, lat, z] tuple of that 
@@ -20,6 +20,11 @@ module ShortLink
     z = 0
     z_offset = 0
 
+    # keep support for old shortlinks which use the @ character, now
+    # replaced by the ~ character because twitter is horribly broken
+    # and we can't have that.
+    str.gsub!("@","~")
+
     str.each_char do |c|
       t = ARRAY.index c
       if t.nil?
index bbae95106cfd0bfd281f08469852a415f155b5a1..cdc6b3cfd800bd17fec6691f9a52a8bc7407c555 100644 (file)
@@ -23,4 +23,19 @@ class ShortLinkTest < ActiveSupport::TestCase
       assert max_distance > distance, "Maximum expected error exceeded: #{max_distance} <= #{distance} for (#{lat}, #{lon}, #{zoom})."
     end
   end
+
+  ##
+  # test that links are backwards-compatible, so any old links with 
+  # the deprecated @ characters in them still work properly.
+  def test_deprecated_at_sign
+    cases = [["~v2juONc--", "@v2juONc--"],
+             ["as3I3GpG~-", "as3I3GpG@-"], 
+             ["D~hV--",     "D@hV--"], 
+             ["CO0O~m8--",  "CO0O@m8--"]]
+
+    cases.each do |new_code, old_code|
+      assert_equal ShortLink.decode(old_code), ShortLink.decode(new_code), 
+        "old (#{old_code}) and new (#{new_code}) should decode to the same location."
+    end
+  end
 end