[Pkg-ocaml-maint-commits] [approx] 03/08: only cache "not found" for true 404 responses (closes: #655986)
Eric Cooper
ecc at cmu.edu
Sat Jun 21 22:27:51 UTC 2014
This is an automated email from the git hooks/post-receive script.
ecc-guest pushed a commit to branch master
in repository approx.
commit fbef8e07a70b0d81633e3949815814af8802d845
Author: Eric Cooper <ecc at cmu.edu>
Date: Sun Jun 15 13:57:56 2014 -0400
only cache "not found" for true 404 responses (closes: #655986)
use curl(1) exit status to distinguish File_not_found (404 response)
from Download_error (currently all other failures)
---
approx.ml | 17 +++++++++++++----
url.ml | 27 ++++++++++++++++++++++++---
url.mli | 5 ++++-
util.ml | 14 +-------------
util.mli | 12 ++++++------
5 files changed, 48 insertions(+), 27 deletions(-)
diff --git a/approx.ml b/approx.ml
index 983e74f..7115994 100644
--- a/approx.ml
+++ b/approx.ml
@@ -1,5 +1,5 @@
(* approx: proxy server for Debian archive files
- Copyright (C) 2013 Eric C. Cooper <ecc at cmu.edu>
+ Copyright (C) 2014 Eric C. Cooper <ecc at cmu.edu>
Released under the GNU General Public License *)
open Printf
@@ -209,6 +209,7 @@ type download_status =
| Not_modified
| Redirect of string
| File_not_found
+ | Download_error
let string_of_download_status = function
| Delivered -> "delivered"
@@ -216,6 +217,7 @@ let string_of_download_status = function
| Not_modified -> "not modified"
| Redirect url -> "redirected to " ^ url
| File_not_found -> "not found"
+ | Download_error -> "download error"
type response_state =
{ name : string;
@@ -350,7 +352,7 @@ let download_http resp url name ims cgi =
end else
loop (redirects + 1)
| 404 -> File_not_found
- | n -> error_message "Unexpected status code: %d" n; File_not_found
+ | n -> error_message "Unexpected status code: %d" n; Download_error
in
loop 0
@@ -383,8 +385,10 @@ let download_url url name ims cgi =
(fun () -> remove_hint name)
with e ->
remove_cache resp.cache;
- if e <> Failure url then info_message "%s" (string_of_exception e);
- File_not_found
+ match e with
+ | Url.File_not_found -> File_not_found
+ | Url.Download_error -> Download_error
+ | e -> info_message "%s" (string_of_exception e); Download_error
(* Handle any processing triggered by downloading a given file *)
@@ -471,6 +475,11 @@ let serve_remote url name ims mod_time cgi =
cache_nak name;
respond `Not_found
end
+ | Download_error ->
+ if not (is_cached_nak name) && offline && Sys.file_exists name then
+ copy_if_newer ()
+ else
+ respond `Not_found
let remote_service url name ims mod_time =
object
diff --git a/url.ml b/url.ml
index 193c08b..c2d2da6 100644
--- a/url.ml
+++ b/url.ml
@@ -1,5 +1,5 @@
(* approx: proxy server for Debian archive files
- Copyright (C) 2012 Eric C. Cooper <ecc at cmu.edu>
+ Copyright (C) 2014 Eric C. Cooper <ecc at cmu.edu>
Released under the GNU General Public License *)
open Config
@@ -80,10 +80,31 @@ let iter_headers proc chan =
in
loop ()
+exception File_not_found
+exception Download_error
+
+let process_status = function
+ | Unix.WEXITED n -> Printf.sprintf "exited with status %d" n
+ | Unix.WSIGNALED _ -> "killed"
+ | Unix.WSTOPPED _ -> "stopped"
+
+(* Spawn a curl command and apply a function to its output. *)
+
+let with_curl_process cmd =
+ let close chan =
+ match Unix.close_process_in chan with
+ | Unix.WEXITED 0 -> ()
+ | Unix.WEXITED 22 -> raise File_not_found (* see curl(1) *)
+ | e ->
+ error_message "Command [%s] %s" cmd (process_status e);
+ raise Download_error
+ in
+ with_resource close Unix.open_process_in cmd
+
let head url callback =
let cmd = head_command url in
debug_message "Command: %s" cmd;
- with_process cmd ~error: url (iter_headers callback)
+ with_curl_process cmd (iter_headers callback)
let download_command headers header_callback =
let hdr_opts = List.map (fun h -> "--header " ^ quoted_string h) headers in
@@ -109,7 +130,7 @@ let seq f g x = (f x; g x)
let download url ?(headers=[]) ?header_callback callback =
let cmd = download_command headers header_callback url in
debug_message "Command: %s" cmd;
- with_process cmd ~error: url
+ with_curl_process cmd
(match header_callback with
| Some proc -> seq (iter_headers proc) (iter_body callback)
| None -> iter_body callback)
diff --git a/url.mli b/url.mli
index 0fe7bfc..420866a 100644
--- a/url.mli
+++ b/url.mli
@@ -1,5 +1,5 @@
(* approx: proxy server for Debian archive files
- Copyright (C) 2011 Eric C. Cooper <ecc at cmu.edu>
+ Copyright (C) 2014 Eric C. Cooper <ecc at cmu.edu>
Released under the GNU General Public License *)
(* Translate a request URL to the remote repository URL and
@@ -15,6 +15,9 @@ type protocol = HTTP | HTTPS | FTP | FILE
val protocol : string -> protocol
+exception File_not_found (* raised when remote server returns 404 *)
+exception Download_error (* raised when any other failure occurs *)
+
(* Perform HTTP HEAD (or equivalent for FTP and FILE) on the given URL
and apply a callback to each header that is returned *)
diff --git a/util.ml b/util.ml
index f136029..1960686 100644
--- a/util.ml
+++ b/util.ml
@@ -1,5 +1,5 @@
(* approx: proxy server for Debian archive files
- Copyright (C) 2013 Eric C. Cooper <ecc at cmu.edu>
+ Copyright (C) 2014 Eric C. Cooper <ecc at cmu.edu>
Released under the GNU General Public License *)
open Printf
@@ -128,9 +128,6 @@ let unwind_protect body post =
| Unwind e -> raise e (* assume cleanup has been done *)
| e -> post (); raise e
-(* Apply a function to a resource that is acquired and released by
- the given functions *)
-
let with_resource release acquire x f =
let res = acquire x in
unwind_protect
@@ -141,15 +138,6 @@ let with_in_channel openf = with_resource close_in openf
let with_out_channel openf = with_resource close_out openf
-let with_process ?error cmd =
- let close chan =
- if close_process_in chan <> WEXITED 0 then
- failwith (match error with
- | None -> cmd
- | Some msg -> msg)
- in
- with_resource close open_process_in cmd
-
let gensym str =
sprintf "%s.%d.%09.0f"
(without_extension str)
diff --git a/util.mli b/util.mli
index 72225cd..427cc7f 100644
--- a/util.mli
+++ b/util.mli
@@ -1,5 +1,5 @@
(* approx: proxy server for Debian archive files
- Copyright (C) 2013 Eric C. Cooper <ecc at cmu.edu>
+ Copyright (C) 2014 Eric C. Cooper <ecc at cmu.edu>
Released under the GNU General Public License *)
val invalid_string_arg : string -> string -> 'a
@@ -64,6 +64,11 @@ val the : 'a option -> 'a
val unwind_protect : (unit -> 'a) -> (unit -> unit) -> 'a
+(* Apply a function to a resource that is acquired and released by
+ the given functions *)
+
+val with_resource : ('t -> unit) -> ('a -> 't) -> 'a -> ('t -> 'b) -> 'b
+
(* Open an input channel and apply a function to the channel,
using unwind_protect to ensure that the channel gets closed *)
@@ -74,11 +79,6 @@ val with_in_channel : ('a -> in_channel) -> 'a -> (in_channel -> 'b) -> 'b
val with_out_channel : ('a -> out_channel) -> 'a -> (out_channel -> 'b) -> 'b
-(* Spawn a shell command and apply a function to its output,
- using unwind_protect to ensure that the channel gets closed *)
-
-val with_process : ?error:string -> string -> (in_channel -> 'a) -> 'a
-
(* Generate a unique string, suitable for use as a filename *)
val gensym : string -> string
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ocaml-maint/packages/approx.git
More information about the Pkg-ocaml-maint-commits
mailing list