diff -r d351d05877dc request.ml --- a/request.ml Sun Aug 30 09:42:49 2009 +0200 +++ b/request.ml Wed Nov 03 23:16:23 2010 +0100 @@ -39,6 +39,7 @@ type request = { kind: request_kind; exact: bool; machine_readable: bool; clean: bool; + limit: int; } let default_request = { kind = Index; @@ -48,6 +49,7 @@ let default_request = { kind = Index; exact = false; machine_readable = false; clean = true; + limit = 0; } let comma_rxp = Str.regexp "," @@ -68,6 +70,7 @@ let rec request_of_oplist ?(request=defa | ("op","vindex") -> {request with kind = VIndex }; | ("op","get") -> {request with kind = Get}; | ("op","hget") -> {request with kind = HGet}; + | ("limit",c) -> {request with limit = (int_of_string c)}; | ("search",s) -> {request with search = List.rev (Utils.extract_words (String.lowercase s)) diff -r d351d05877dc wserver.ml --- a/wserver.ml Sun Aug 30 09:42:49 2009 +0200 +++ b/wserver.ml Wed Nov 03 23:16:23 2010 +0100 @@ -236,9 +236,12 @@ let request_to_string_short request = -let send_result cout ?(error_code = 200) ?(content_type = "text/html; charset=UTF-8") body = +let send_result cout ?(error_code = 200) ?(content_type = "text/html; charset=UTF-8") ?(count = -1) body = fprintf cout "HTTP/1.0 %03d OK\r\n" error_code; fprintf cout "Server: sks_www/%s\r\n" version; + fprintf cout "Content-length: %u\r\n" (String.length body + 2); + if count >= 0 then + fprintf cout "X-HKP-Results-Count: %d\r\n" count; fprintf cout "Content-type: %s\r\n\r\n" content_type; fprintf cout "%s\r\n" body; flush cout @@ -250,9 +253,9 @@ let accept_connection f ~recover_timeout let request = parse_request cin in let output_chan = Channel.new_buffer_outc 0 in try - let content_type = f addr request output_chan#upcast in + let (content_type, count) = f addr request output_chan#upcast in let output = output_chan#contents in - send_result cout ~content_type output + send_result cout ~content_type ~count output with | Eventloop.SigAlarm -> ignore (Unix.alarm recover_timeout); diff -r d351d05877dc dbserver.ml --- a/dbserver.ml Sun Aug 30 09:42:49 2009 +0200 +++ b/dbserver.ml Wed Nov 03 23:16:23 2010 +0100 @@ -205,20 +205,35 @@ struct (******************************************************************) + let truncate count keys = + let rec trunc_c result orig num = + match orig with + | [] -> result + | h::tail -> + if (num = 0) + then result + else (trunc_c (result @ [h]) tail (num-1)) + in + if count > 0 + then trunc_c [] keys count + else keys let handle_get_request request = match request.kind with | Stats -> plerror 4 "/pks/lookup: DB Stats request"; - ("text/html; charset=UTF-8", !last_stat_page) + ("text/html; charset=UTF-8", -1, !last_stat_page) | Get -> plerror 4 "/pks/lookup: Get request (%s)" (String.concat " " request.search); let keys = lookup_keys request.search in let keys = clean_keys request keys in + let count = List.length keys in + let keys = truncate request.limit keys in let keystr = Key.to_string_multiple keys in let aakeys = Armor.encode_pubkey_string keystr in ("text/html; charset=UTF-8", + count, HtmlTemplates.page ~title:(sprintf "Public Key Server -- Get ``%s ''" (String.concat ~sep:" " request.search)) @@ -243,6 +258,7 @@ struct let keystr = Key.to_string key in let aakeys = Armor.encode_pubkey_string keystr in ("text/html; charset=UTF-8", + 1, HtmlTemplates.page ~title:(sprintf "Public Key Server -- Get ``%s ''" hash_str) ~body:(sprintf "\r\n
\r\n%s\r\n
\r\n" aakeys) @@ -253,10 +269,13 @@ struct plerror 4 "/pks/lookup: Index request: (%s)" (String.concat " " request.search); let keys = lookup_keys request.search in + let count = List.length keys in + let keys = truncate request.limit keys in let hashes = List.map ~f:KeyHash.hash keys in let keys = clean_keys request keys in if request.machine_readable then ("text/plain", + count, MRindex.keys_to_index keys) else begin @@ -275,6 +294,7 @@ struct (Index.keyinfo_header request :: output) in ("text/html; charset=UTF-8", + count, HtmlTemplates.page ~body:pre ~title:(sprintf "Search results for '%s'" (String.concat ~sep:" " request.search)) @@ -384,9 +404,9 @@ struct let (base,oplist) = string_to_oplist request in if base = "/pks/lookup" then ( let request = request_of_oplist oplist in - let (mimetype,body) = handle_get_request request in + let (mimetype,count,body) = handle_get_request request in cout#write_string body; - mimetype + (mimetype, count) ) else ( if (base = "/index.html" || base = "/index.htm" || base = "/" || base = "") @@ -394,7 +414,7 @@ struct let fname = convert_web_fname "index.html" in let text = read_file fname in cout#write_string text; - "text/html; charset=UTF-8" + ("text/html; charset=UTF-8", -1) else (try let extension = get_extension base in @@ -408,7 +428,7 @@ struct let base = base (1,0) in let data = read_file ~binary:true (convert_web_fname base) in cout#write_string data; - mimetype + (mimetype, -1) with Not_found -> raise (Wserver.Page_not_found base) ) @@ -457,7 +477,7 @@ struct cout#write_string (sprintf "%d keys added succesfully.
" !ctr) ); cout#write_string ""; - "text/html; charset=UTF-8" + ("text/html; charset=UTF-8", List.length keys) | "/pks/hashquery" -> plerror 4 "Handling /pks/hashquery"; let sin = new Channel.string_in_channel body 0 in @@ -468,12 +488,13 @@ struct perror "%d keys found" (List.length keystrings); CMarshal.marshal_list ~f:CMarshal.marshal_string cout keystrings; - "pgp/keys" (* This is a bogus content-type *) + ("pgp/keys" (* This is a bogus content-type *), + List.length keystrings) | _ -> cout#write_string (HtmlTemplates.page ~title:"Unexpected POST request" ~body:""); - "text/html; charset=UTF-8" + ("text/html; charset=UTF-8", -1) (** Prepare handler for use with eventloop by transforming system