*)
let remove_dot_segments path =
let slash = Str.regexp "/" in
- let has_leading_slash p =
- String.length p > 0 && p.[0] = '/' in
+ let path_len = String.length path in
+ let has_leading_slash = path_len > 0 && path.[0] = '/' in
+ let has_trailing_slash = path_len > 0 && path.[path_len - 1] = '/' in
let rec remove in_segs out_segs =
match in_segs, out_segs with
| "." :: in_rest, _ ->
List.rev out_segs in
let out_segs = remove (Str.split slash path) [] in
let out = String.concat "/" out_segs in
- if has_leading_slash path then "/" ^ out else out
+ let out = if has_leading_slash then "/" ^ out else out in
+ if has_trailing_slash then out ^ "/" else out
(* Regular expression for authority = [userinfo "@"] host [":" port] *)
let auth_re = "\\(\\([^@]*\\)@\\)?\\([^:]*\\)\\(:\\([0-9]*\\)\\)?"