mirror of
https://github.com/c-cube/tiny_httpd.git
synced 2025-12-07 11:45:36 -05:00
refactor: improve code of percent encode/decode
This commit is contained in:
parent
6852912fbb
commit
9eae697ded
1 changed files with 10 additions and 44 deletions
|
|
@ -3,31 +3,16 @@ let percent_encode ?(skip=fun _->false) s =
|
||||||
String.iter
|
String.iter
|
||||||
(function
|
(function
|
||||||
| c when skip c -> Buffer.add_char buf c
|
| c when skip c -> Buffer.add_char buf c
|
||||||
| ' ' -> Buffer.add_string buf "%20"
|
| (' ' | '!' | '"' | '#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+'
|
||||||
| '!' -> Buffer.add_string buf "%21"
|
| ',' | '/' | ':' | ';' | '=' | '?' | '@' | '[' | ']' | '~')
|
||||||
| '"' -> Buffer.add_string buf "%22"
|
as c ->
|
||||||
| '#' -> Buffer.add_string buf "%23"
|
Printf.bprintf buf "%%%x" (Char.code c)
|
||||||
| '$' -> Buffer.add_string buf "%24"
|
|
||||||
| '%' -> Buffer.add_string buf "%25"
|
|
||||||
| '&' -> Buffer.add_string buf "%26"
|
|
||||||
| '\'' -> Buffer.add_string buf "%27"
|
|
||||||
| '(' -> Buffer.add_string buf "%28"
|
|
||||||
| ')' -> Buffer.add_string buf "%29"
|
|
||||||
| '*' -> Buffer.add_string buf "%2A"
|
|
||||||
| '+' -> Buffer.add_string buf "%2B"
|
|
||||||
| ',' -> Buffer.add_string buf "%2C"
|
|
||||||
| '/' -> Buffer.add_string buf "%2F"
|
|
||||||
| ':' -> Buffer.add_string buf "%3A"
|
|
||||||
| ';' -> Buffer.add_string buf "%3B"
|
|
||||||
| '=' -> Buffer.add_string buf "%3D"
|
|
||||||
| '?' -> Buffer.add_string buf "%3F"
|
|
||||||
| '@' -> Buffer.add_string buf "%40"
|
|
||||||
| '[' -> Buffer.add_string buf "%5B"
|
|
||||||
| ']' -> Buffer.add_string buf "%5D"
|
|
||||||
| c -> Buffer.add_char buf c)
|
| c -> Buffer.add_char buf c)
|
||||||
s;
|
s;
|
||||||
Buffer.contents buf
|
Buffer.contents buf
|
||||||
|
|
||||||
|
let hex_int (s:string) : int = Scanf.sscanf s "%x" (fun x->x)
|
||||||
|
|
||||||
let percent_decode (s:string) : _ option =
|
let percent_decode (s:string) : _ option =
|
||||||
let buf = Buffer.create (String.length s) in
|
let buf = Buffer.create (String.length s) in
|
||||||
let i = ref 0 in
|
let i = ref 0 in
|
||||||
|
|
@ -36,34 +21,15 @@ let percent_decode (s:string) : _ option =
|
||||||
match String.get s !i with
|
match String.get s !i with
|
||||||
| '%' ->
|
| '%' ->
|
||||||
if !i+2 < String.length s then (
|
if !i+2 < String.length s then (
|
||||||
begin match String.sub s (!i+1) 2 with
|
begin match hex_int @@ String.sub s (!i+1) 2 with
|
||||||
| "20" -> Buffer.add_char buf ' '
|
| n -> Buffer.add_char buf (Char.chr n)
|
||||||
| "21" -> Buffer.add_char buf '!'
|
| exception _ -> raise Exit
|
||||||
| "22" -> Buffer.add_char buf '"'
|
|
||||||
| "23" -> Buffer.add_char buf '#'
|
|
||||||
| "24" -> Buffer.add_char buf '$'
|
|
||||||
| "25" -> Buffer.add_char buf '%'
|
|
||||||
| "26" -> Buffer.add_char buf '&'
|
|
||||||
| "27" -> Buffer.add_char buf '\''
|
|
||||||
| "28" -> Buffer.add_char buf '('
|
|
||||||
| "29" -> Buffer.add_char buf ')'
|
|
||||||
| "2A" -> Buffer.add_char buf '*'
|
|
||||||
| "2B" -> Buffer.add_char buf '+'
|
|
||||||
| "2C" -> Buffer.add_char buf ','
|
|
||||||
| "2F" -> Buffer.add_char buf '/'
|
|
||||||
| "3A" -> Buffer.add_char buf ':'
|
|
||||||
| "3B" -> Buffer.add_char buf ';'
|
|
||||||
| "3D" -> Buffer.add_char buf '='
|
|
||||||
| "3F" -> Buffer.add_char buf '?'
|
|
||||||
| "40" -> Buffer.add_char buf '@'
|
|
||||||
| "5B" -> Buffer.add_char buf '['
|
|
||||||
| "5D" -> Buffer.add_char buf ']'
|
|
||||||
| _ -> raise Exit
|
|
||||||
end;
|
end;
|
||||||
i := !i + 3;
|
i := !i + 3;
|
||||||
) else (
|
) else (
|
||||||
raise Exit (* truncated *)
|
raise Exit (* truncated *)
|
||||||
)
|
)
|
||||||
|
| '+' -> Buffer.add_char buf ' '; incr i (* for query strings *)
|
||||||
| c -> Buffer.add_char buf c; incr i
|
| c -> Buffer.add_char buf c; incr i
|
||||||
done;
|
done;
|
||||||
Some (Buffer.contents buf)
|
Some (Buffer.contents buf)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue