nginx-0.0.3-2004-05-20-21:33:52 import
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 92b4b53..fd115cc 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -63,6 +63,46 @@
 
     if (value < 0) {
         return NGX_ERROR;
+
+    } else {
+        return value;
+    }
+}
+
+
+ngx_int_t ngx_hextoi(u_char *line, size_t n)
+{
+    u_char     ch;
+    ngx_int_t  value;
+
+    if (n == 0) {
+        return NGX_ERROR;
+    }
+
+    for (value = 0; n--; line++) {
+        ch = *line;
+
+        if (ch >= '0' && ch <= '9') {
+            value = value * 16 + (ch - '0');
+            continue;
+        }
+
+        if (ch >= 'A' && ch <= 'F') {
+            value = value * 16 + (*line - 'A');
+            continue;
+        }
+
+        if (ch >= 'a' && ch <= 'f') {
+            value = value * 16 + (*line - 'a');
+            continue;
+        }
+
+        return NGX_ERROR;
+    }
+
+    if (value < 0) {
+        return NGX_ERROR;
+
     } else {
         return value;
     }
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index 09de18e..d087e3e 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -65,7 +65,9 @@
 
 u_char *ngx_cpystrn(u_char *dst, u_char *src, size_t n);
 ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n);
+
 ngx_int_t ngx_atoi(u_char *line, size_t n);
+ngx_int_t ngx_hextoi(u_char *line, size_t n);
 
 void ngx_md5_text(u_char *text, u_char *md5);