Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
util.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
(*{{{ * Copyright (C) 2015 Trevor Smith <trevorsummerssmith@gmail.com> * Copyright (C) 2018 Anders Fugmann <anders@fugmann.net> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * }}}*) open StdLabels (* @see https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); } *) let encode_string s = (* Percent encode the path as s3 wants it. Uri doesn't encode $, or the other sep characters in a path. If upstream allows that we can nix this function *) let n = String.length s in let buf = Buffer.create (n * 3) in for i = 0 to (n-1) do let c = String.get s i in match c with | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '_' | '-' | '~' | '.' | '/' -> Buffer.add_char buf c | '%' -> (* Sigh. Annoying we're expecting already escaped strings so ignore the escapes *) begin let is_hex = function | 'a' .. 'f' | 'A' .. 'F' | '0' .. '9' -> true | _ -> false in if (i + 2) < n then if is_hex(String.get s (i+1)) && is_hex(String.get s (i+2)) then Buffer.add_char buf c else Buffer.add_string buf "%25" end | _ -> Buffer.add_string buf (Printf.sprintf "%%%X" (Char.code c)) done; Buffer.contents buf