+/**
+ * Unescapes a URL encoded string in-place. The string
+ * must be NULL terminated.
+ * (e.g this%2d+string --> this- string)
+ * @param buf The buffer to decode. Will be modified in-place.
+ * @return The same buffer.
+ */
+char *FCGI_URLDecode(char *buf)
+{
+ char *head = buf, *tail = buf;
+ char val, hex[3] = {0};
+
+ while (*tail) {
+ if (*tail == '%') { //%hh hex to char
+ tail++;
+ if (isxdigit(*tail) && isxdigit(*(tail+1))) {
+ hex[0] = *tail++;
+ hex[1] = *tail++;
+ val = (char)strtol(hex, NULL, 16);
+ //Control codes --> Space character
+ *head++ = (val < 0x20) ? 0x20 : val;
+ } else { //Not valid format; keep original
+ head++;
+ }
+ } else if (*tail == '+') { //Plus to space
+ tail++;
+ *head++ = ' ';
+ } else { //Anything else
+ *head++ = *tail++;
+ }
+ }
+ *head = 0; //NULL-terminate at new end point
+
+ return buf;
+}
+