-rw-r--r-- | lib/util.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/util.cc b/lib/util.cc index ac70938..69d37b5 100644 --- a/lib/util.cc +++ b/lib/util.cc | |||
@@ -173,21 +173,29 @@ namespace opkele { | |||
173 | * - if there's no path component, add '/' | 173 | * - if there's no path component, add '/' |
174 | */ | 174 | */ |
175 | string rfc_3986_normalize_uri(const string& uri) { | 175 | string rfc_3986_normalize_uri(const string& uri) { |
176 | static const char *whitespace = " \t\r\n"; | ||
176 | string rv; | 177 | string rv; |
177 | string::size_type colon = uri.find(':'); | 178 | string::size_type ns = uri.find_first_not_of(whitespace); |
179 | if(ns==string::npos) | ||
180 | throw bad_input(OPKELE_CP_ "Can't normalize empty URI"); | ||
181 | string::size_type colon = uri.find(':',ns); | ||
178 | if(colon==string::npos) | 182 | if(colon==string::npos) |
179 | throw bad_input(OPKELE_CP_ "No scheme specified in URI"); | 183 | throw bad_input(OPKELE_CP_ "No scheme specified in URI"); |
180 | transform( | 184 | transform( |
181 | uri.begin(), uri.begin()+colon+1, | 185 | uri.begin()+ns, uri.begin()+colon+1, |
182 | back_inserter(rv), ::tolower ); | 186 | back_inserter(rv), ::tolower ); |
183 | bool s; | 187 | bool s; |
184 | if(rv=="http:") | 188 | if(rv=="http:") |
185 | s = false; | 189 | s = false; |
186 | else if(rv=="https:") | 190 | else if(rv=="https:") |
187 | s = true; | 191 | s = true; |
192 | #ifndef NDEBUG | ||
193 | else if(rv=="file:") | ||
194 | s = false; | ||
195 | #endif /* XXX: or try to make tests work some other way */ | ||
188 | else | 196 | else |
189 | throw not_implemented(OPKELE_CP_ "Only http(s) URIs can be normalized here"); | 197 | throw not_implemented(OPKELE_CP_ "Only http(s) URIs can be normalized here"); |
190 | string::size_type ul = uri.length(); | 198 | string::size_type ul = uri.find_last_not_of(whitespace)+1; |
191 | if(ul <= (colon+3)) | 199 | if(ul <= (colon+3)) |
192 | throw bad_input(OPKELE_CP_ "Unexpected end of URI being normalized encountered"); | 200 | throw bad_input(OPKELE_CP_ "Unexpected end of URI being normalized encountered"); |
193 | if(uri[colon+1]!='/' || uri[colon+2]!='/') | 201 | if(uri[colon+1]!='/' || uri[colon+2]!='/') |
@@ -196,7 +204,7 @@ namespace opkele { | |||
196 | string::size_type interesting = uri.find_first_of(":/#?",colon+3); | 204 | string::size_type interesting = uri.find_first_of(":/#?",colon+3); |
197 | if(interesting==string::npos) { | 205 | if(interesting==string::npos) { |
198 | transform( | 206 | transform( |
199 | uri.begin()+colon+3,uri.end(), | 207 | uri.begin()+colon+3,uri.begin()+ul, |
200 | back_inserter(rv), ::tolower ); | 208 | back_inserter(rv), ::tolower ); |
201 | rv += '/'; return rv; | 209 | rv += '/'; return rv; |
202 | } | 210 | } |