Encode username when using it in a URL
authorGraham Jones <grahamjones139@gmail.com>
Sun, 28 Aug 2011 21:18:25 +0000 (22:18 +0100)
committerTom Hughes <tom@compton.nu>
Fri, 9 Sep 2011 23:23:39 +0000 (00:23 +0100)
src/Makefile
src/interpolate.c
src/urlcode.c [new file with mode: 0644]
src/urlcode.h [new file with mode: 0644]

index 1917612..c20b3fa 100644 (file)
@@ -34,7 +34,7 @@ CFLAGS += -I$(shell pg_config --includedir)
 LDFLAGS += -L$(shell pg_config --libdir) -lpq
 endif
 
-MAINOBJS := main.o gpx.o mercator.o image.o log.o db.o filename.o interpolate.o quadtile.o cache.o
+MAINOBJS := main.o gpx.o mercator.o image.o log.o db.o filename.o interpolate.o quadtile.o cache.o urlcode.o
 
 ALLOBJS := $(DB).o $(MAINOBJS)
 
index 3937af7..5ca165f 100644 (file)
@@ -3,6 +3,7 @@
  * GPX file importer, email interpolation
  *
  * Copyright Daniel Silverstone <dsilvers@digital-scurf.org>
+ * Updated to encode URLs by Graham JOnes <grahamjones139@gmail.com> August 2011.
  *
  * Written for the OpenStreetMap project.
  *
 #include <errno.h>
 
 #include "interpolate.h"
+#include "urlcode.h"
 
 static void
 do_interpolate(DBJob *job, FILE *input, FILE *output)
 {
   int c;
+  char *usrEncStr;
   
   while ((c = fgetc(input)) != EOF) {
     if (c != '%') {
@@ -87,7 +90,9 @@ do_interpolate(DBJob *job, FILE *input, FILE *output)
       }
       break;
     case 'u':
-      fprintf(output, "http://www.openstreetmap.org/user/%s/traces/%"PRId64, job->name, job->gpx_id);
+      usrEncStr = url_encode(job->name);
+      fprintf(output, "http://www.openstreetmap.org/user/%s/traces/%"PRId64, usrEncStr, job->gpx_id);
+      free(usrEncStr);
       break;
     default:
       fputs("\n\n[Unknown % escape: ", output);
diff --git a/src/urlcode.c b/src/urlcode.c
new file mode 100644 (file)
index 0000000..826a6ab
--- /dev/null
@@ -0,0 +1,63 @@
+/* URL Encoding code taken from http://www.geekhideout.com/urlcode.shtml
+ * Minor change to prevent it encoding space as '+' and use '%20' instead.
+ * Probably worth making this user selectable in the future - I think you need
+ * to use %20 in URLs themselves, but '+' is ok in query strings.
+ * I think this version will work for query strings though becuse %20 is valid.
+ * 
+ * Converted to simple library by adding urlcode.h by Graham Jones, 2011.
+ *
+ * This code is Public Domain (confirmed that the original author published it
+ * without licence restrictions).
+ */
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Converts a hex character to its integer value */
+char from_hex(char ch) {
+  return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
+}
+
+/* Converts an integer value to its hex character*/
+char to_hex(char code) {
+  static char hex[] = "0123456789abcdef";
+  return hex[code & 15];
+}
+
+/* Returns a url-encoded version of str */
+/* IMPORTANT: be sure to free() the returned string after use */
+char *url_encode(char *str) {
+  char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
+  while (*pstr) {
+    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 
+      *pbuf++ = *pstr;
+    /*else if (*pstr == ' ') 
+     *pbuf++ = '+';*/
+    else 
+      *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
+    pstr++;
+  }
+  *pbuf = '\0';
+  return buf;
+}
+
+/* Returns a url-decoded version of str */
+/* IMPORTANT: be sure to free() the returned string after use */
+char *url_decode(char *str) {
+  char *pstr = str, *buf = malloc(strlen(str) + 1), *pbuf = buf;
+  while (*pstr) {
+    if (*pstr == '%') {
+      if (pstr[1] && pstr[2]) {
+        *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
+        pstr += 2;
+      }
+    } else if (*pstr == '+') { 
+      *pbuf++ = ' ';
+    } else {
+      *pbuf++ = *pstr;
+    }
+    pstr++;
+  }
+  *pbuf = '\0';
+  return buf;
+}
diff --git a/src/urlcode.h b/src/urlcode.h
new file mode 100644 (file)
index 0000000..5de170d
--- /dev/null
@@ -0,0 +1,17 @@
+/* 
+ * urlcode.h
+ * Header file for functions to encode and decode URLs in urlcode.c
+ *
+ * Graham Jones, August 2011.
+ *
+ */
+#ifndef URLCODE_H
+#define URLCODE_H
+
+char from_hex(char ch);
+char tohex(char code);
+char *url_encode(char *str);
+char *url_decode(char *str);
+
+
+#endif /* URLCODE_H */