nginx-0.1.38-RELEASE import

    *) Feature: the "limit_rate" directive is supported in in proxy and
       FastCGI mode.

    *) Feature: the "X-Accel-Limit-Rate" response header line is supported
       in proxy and FastCGI mode.

    *) Feature: the "break" directive.

    *) Feature: the "log_not_found" directive.

    *) Bugfix: the response status code was not changed when request was
       redirected by the ""X-Accel-Redirect" header line.

    *) Bugfix: the variables set by the "set" directive could not be used
       in SSI.

    *) Bugfix: the segmentation fault may occurred if the SSI page has more
       than one remote subrequest.

    *) Bugfix: nginx treated the backend response as invalid if the status
       line in the header was transferred in two packets; the bug had
       appeared in 0.1.29.

    *) Feature: the "ssi_types" directive.

    *) Feature: the "autoindex_exact_size" directive.

    *) Bugfix: the ngx_http_autoindex_module did not support the long file
       names in UTF-8.

    *) Feature: the IMAP/POP3 proxy.
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index e21a9fc..575e60e 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -753,20 +753,62 @@
             continue;
         }
 
-        if (c < 0xC0) {
-            /* invalid utf */
-            return utf->len;
+        if (c >= 0xc0) {
+            for (c <<= 1; c & 0x80; c <<= 1) {
+                i++;
+            }
+
+            continue;
         }
 
-        for (c <<= 1; c & 0x80; c <<= 1) {
-            i++;
-        }
+        /* invalid utf */
+
+        return utf->len;
     }
 
     return len;
 }
 
 
+u_char *
+ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n)
+{
+    u_char  c;
+
+    if (n == 0) {
+        return dst;
+    }
+
+    for ( /* void */ ; --n; dst++, src++) {
+
+        c = *src;
+        *dst = c;
+
+        if (c < 0x80) {
+            if (*dst != '\0') {
+                continue;
+            }
+
+            return dst;
+        }
+
+        if (c >= 0xc0) {
+            for (c <<= 1; c & 0x80; c <<= 1) {
+               *++dst = *++src;
+            }
+
+            continue;
+        }
+
+        /* invalid utf */
+    }
+
+    *dst = '\0';
+
+    return dst;
+}
+
+
 uintptr_t
 ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
 {