objective categorical abstract machine language personal data server

Differentiate pegasus logging from dream logging

futur.blue 37774d81 9544dc54

verified
+13 -13
pegasus/lib/api/account_/migrate/migrate.ml
··· 91 91 | Ok () -> 92 92 (true, None) 93 93 | Error e -> 94 - Dream.warning (fun log -> 94 + Log.warn (fun log -> 95 95 log "migration %s: failed to deactivate old account: %s" did e ) ; 96 96 (false, Some e) 97 97 in ··· 131 131 | Some session -> ( 132 132 match%lwt Remote.request_plc_signature old_client with 133 133 | Error e -> 134 - Dream.warning (fun log -> 134 + Log.warn (fun log -> 135 135 log "migration %s: failed to request PLC signature: %s" did e ) ; 136 136 let%lwt () = 137 137 State.set ctx.req ··· 396 396 | Ok () -> 397 397 (true, None) 398 398 | Error err -> 399 - Dream.warning (fun log -> 399 + Log.warn (fun log -> 400 400 log "migration %s: failed to deactivate old account: %s" did err ) ; 401 401 (false, Some err) 402 402 in ··· 442 442 let%lwt () = 443 443 match%lwt Ops.check_account_status ~did with 444 444 | Ok status -> 445 - Dream.info (fun log -> 445 + Log.info (fun log -> 446 446 log 447 447 "migration %s: repo imported, indexed_records=%d, \ 448 448 expected_blobs=%d" 449 449 did status.indexed_records status.expected_blobs ) ; 450 450 Lwt.return_unit 451 451 | Error e -> 452 - Dream.warning (fun log -> 452 + Log.warn (fun log -> 453 453 log "migration %s: failed to check account status: %s" did e ) ; 454 454 Lwt.return_unit 455 455 in 456 456 match%lwt Ops.list_missing_blobs ~did ~limit:50 () with 457 457 | Error e -> 458 - Dream.warning (fun log -> 458 + Log.warn (fun log -> 459 459 log "migration %s: failed to list missing blobs: %s" did e ) ; 460 460 transition_to_plc_token_step ctx ~old_client ~old_pds ~did ~handle 461 461 ~email ~blobs_imported:0 ~blobs_failed:0 ··· 514 514 Ops.list_missing_blobs ~did:state.did ~limit:50 ?cursor () 515 515 with 516 516 | Error e -> 517 - Dream.warning (fun log -> 517 + Log.warn (fun log -> 518 518 log "migration %s: failed to list missing blobs: %s" state.did e ) ; 519 519 transition_to_plc_token_step ctx ~old_client ~old_pds:state.old_pds 520 520 ~did:state.did ~handle:state.handle ~email:state.email ··· 581 581 | Ok _ -> 582 582 Lwt.return [] 583 583 | Error e -> 584 - Dream.warning (fun log -> 584 + Log.warn (fun log -> 585 585 log "migration %s: failed to get old PDS credentials: %s" 586 586 state.did e ) ; 587 587 Lwt.return [] ··· 632 632 let%lwt () = 633 633 match%lwt Ops.check_account_status ~did:state.did with 634 634 | Ok status -> 635 - Dream.info (fun log -> 635 + Log.info (fun log -> 636 636 log 637 637 "migration %s: activating account, \ 638 638 imported_blobs=%d/%d" ··· 640 640 status.expected_blobs ) ; 641 641 Lwt.return_unit 642 642 | Error e -> 643 - Dream.warning (fun log -> 643 + Log.warn (fun log -> 644 644 log 645 645 "migration %s: failed to check status before \ 646 646 activation: %s" ··· 659 659 | Ok () -> 660 660 (true, None) 661 661 | Error e -> 662 - Dream.warning (fun log -> 662 + Log.warn (fun log -> 663 663 log 664 664 "migration %s: failed to deactivate old \ 665 665 account: %s" ··· 861 861 | Ok () -> 862 862 (true, None) 863 863 | Error e -> 864 - Dream.warning (fun log -> 864 + Log.warn (fun log -> 865 865 log 866 866 "migration %s: failed to deactivate old account: %s" 867 867 did e ) ; ··· 895 895 | Ok () -> ( 896 896 match%lwt Ops.list_missing_blobs ~did ~limit:50 () with 897 897 | Error e -> 898 - Dream.warning (fun log -> 898 + Log.warn (fun log -> 899 899 log "migration %s: failed to list missing blobs: %s" 900 900 did e ) ; 901 901 transition_to_plc_token_step ctx ~old_client:client
+1 -1
pegasus/lib/api/account_/migrate/ops.ml
··· 117 117 (fun cid_str -> 118 118 match%lwt Remote.fetch_blob ~did ~cid:cid_str client with 119 119 | Error e -> 120 - Dream.warning (fun log -> 120 + Log.warn (fun log -> 121 121 log "migration %s: failed to fetch blob %s: %s" did cid_str e ) ; 122 122 Lwt.return_error cid_str 123 123 | Ok (data, mimetype) -> (
+2 -2
pegasus/lib/api/account_/migrate/remote.ml
··· 185 185 Lwt.return_ok res.preferences 186 186 with 187 187 | Hermes.Xrpc_error {status; error; _} -> 188 - Dream.warning (fun log -> 188 + Log.warn (fun log -> 189 189 log "migration: failed to fetch preferences: %d %s" status error ) ; 190 190 Lwt.return_ok [] 191 191 | exn -> 192 - Dream.warning (fun log -> 192 + Log.warn (fun log -> 193 193 log "migration: exception fetching preferences: %s" 194 194 (Printexc.to_string exn) ) ; 195 195 Lwt.return_ok []
+1 -1
pegasus/lib/api/identity/resolveHandle.ml
··· 18 18 | Error e -> ( 19 19 try%lwt Xrpc.service_proxy ctx 20 20 with _ -> 21 - Dream.error (fun log -> log "%s" e) ; 21 + Log.err (fun log -> log "%s" e) ; 22 22 Errors.internal_error ~msg:"could not resolve handle" () ) ) )
+1 -1
pegasus/lib/api/identity/updateHandle.ml
··· 105 105 Dream.empty `OK 106 106 | Error e -> 107 107 let msg = update_handle_error_to_string e in 108 - Dream.error (fun log -> log ~request:req "%s" msg) ; 108 + Log.err (fun log -> log "%s" msg) ; 109 109 Errors.invalid_request ~name:"InvalidHandle" msg )
+1 -1
pegasus/lib/api/oauth_/par.ml
··· 8 8 let%lwt client = 9 9 try%lwt Client.fetch_client_metadata req.client_id 10 10 with e -> 11 - Errors.log_exn ~req:ctx.req e ; 11 + Errors.log_exn e ; 12 12 Errors.invalid_request "failed to fetch client metadata" 13 13 in 14 14 if req.response_type <> "code" then
+1 -1
pegasus/lib/api/proxy/appBskyFeedGetFeed.ml
··· 49 49 | None -> 50 50 Errors.invalid_request "missing proxy header" ) 51 51 with e -> 52 - Dream.error (fun log -> 52 + Log.err (fun log -> 53 53 log "failed to fetch feed generator record: %s" 54 54 (Printexc.to_string e) ) ; 55 55 Errors.internal_error ~msg:"failed to fetch feed generator record"
-1
pegasus/lib/api/server/requestPasswordReset.ml
··· 33 33 | Some actor -> 34 34 Lwt.return_some actor 35 35 | None -> 36 - Dream.log "password reset requested for unknown email: %s" email ; 37 36 Lwt.return_none ) 38 37 in 39 38 match actor_opt with
+1 -2
pegasus/lib/api/server/resetPassword.ml
··· 26 26 (fun {req; db; _} -> 27 27 let%lwt {token; password} = Xrpc.parse_body req input_of_yojson in 28 28 match%lwt reset_password ~token ~password db with 29 - | Ok did -> 30 - Dream.log "password reset completed for %s" did ; 29 + | Ok _ -> 31 30 Dream.empty `OK 32 31 | Error InvalidToken -> 33 32 Errors.invalid_request ~name:"InvalidToken" "invalid or expired token"
+6 -6
pegasus/lib/auth.ml
··· 27 27 let now_s = int_of_float (Unix.gettimeofday ()) in 28 28 match Jwt.symmetric_jwt_of_yojson payload with 29 29 | Error e -> 30 - Dream.debug (fun log -> log "bearer jwt decode error: %s" e) ; 30 + Log.debug (fun log -> log "bearer jwt decode error: %s" e) ; 31 31 Lwt.return_error "invalid token format" 32 32 | Ok jwt -> 33 33 if jwt.aud <> Env.did then Lwt.return_error "invalid aud" ··· 259 259 | Error "use_dpop_nonce" -> 260 260 Lwt.return_error @@ Errors.use_dpop_nonce () 261 261 | Error e -> 262 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 262 + Log.debug (fun log -> log "dpop error: %s" e) ; 263 263 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 264 264 | Ok proof -> 265 265 Lwt.return_ok (DPoP {proof}) ··· 268 268 fun {req; db} -> 269 269 match parse_dpop req with 270 270 | Error e -> 271 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 271 + Log.debug (fun log -> log "dpop error: %s" e) ; 272 272 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 273 273 | Ok token -> ( 274 274 match ··· 280 280 | Error "use_dpop_nonce" -> 281 281 Lwt.return_error @@ Errors.use_dpop_nonce () 282 282 | Error e -> 283 - Dream.debug (fun log -> log ~request:req "dpop error: %s" e) ; 283 + Log.debug (fun log -> log "dpop error: %s" e) ; 284 284 Lwt.return_error @@ Errors.invalid_request ("dpop error: " ^ e) 285 285 | Ok proof -> ( 286 286 match Jwt.verify_jwt token ~pubkey:Env.jwt_pubkey with 287 287 | Error e -> 288 - Dream.debug (fun log -> log ~request:req "invalid jwt: %s" e) ; 288 + Log.debug (fun log -> log "invalid jwt: %s" e) ; 289 289 Lwt.return_error @@ Errors.auth_required e 290 290 | Ok (_header, claims) -> ( 291 291 let open Yojson.Safe.Util in ··· 400 400 | Ok _ -> 401 401 check_actor_status did db 402 402 | Error e -> 403 - Dream.debug (fun log -> log "service jwt verification failed: %s" e) ; 403 + Log.debug (fun log -> log "service jwt verification failed: %s" e) ; 404 404 Lwt.return_error 405 405 @@ Errors.invalid_request ~name:"InvalidToken" 406 406 "jwt signature does not match jwt issuer"
+1 -1
pegasus/lib/blob_store.ml
··· 68 68 | Ok () -> 69 69 Lwt.return_unit 70 70 | Error e -> 71 - Dream.error (fun log -> 71 + Log.err (fun log -> 72 72 log "S3 delete failed for %s: %s" key (Util.s3_error_to_string e) ) ; 73 73 Lwt.return_unit ) 74 74 | None ->
+1 -1
pegasus/lib/env.ml
··· 56 56 match getenv_opt "PDS_DPOP_NONCE_SECRET" ~default:"" with 57 57 | "" -> 58 58 let secret = Mirage_crypto_rng_unix.getrandom 32 in 59 - Dream.warning (fun log -> 59 + Log.warn (fun log -> 60 60 log "PDS_DPOP_NONCE_SECRET not set; using PDS_DPOP_NONCE_SECRET=%s" 61 61 ( Base64.(encode ~alphabet:uri_safe_alphabet ~pad:false) secret 62 62 |> Result.get_ok ) ) ;
+7 -9
pegasus/lib/errors.ml
··· 53 53 in 54 54 match exn with 55 55 | InvalidRequestError (error, message) -> 56 - Dream.debug (fun log -> log "invalid request: %s - %s" error message) ; 56 + Log.debug (fun log -> log "invalid request: %s - %s" error message) ; 57 57 format_response error message `Bad_Request 58 58 | InternalServerError (error, message) -> 59 - Dream.debug (fun log -> 60 - log "internal server error: %s - %s" error message ) ; 59 + Log.debug (fun log -> log "internal server error: %s - %s" error message) ; 61 60 format_response error message `Internal_Server_Error 62 61 | AuthError (error, message) -> 63 - Dream.debug (fun log -> log "auth error: %s - %s" error message) ; 62 + Log.debug (fun log -> log "auth error: %s - %s" error message) ; 64 63 format_response error message `Unauthorized 65 64 | NotFoundError (error, message) -> 66 - Dream.debug (fun log -> log "not found error: %s - %s" error message) ; 65 + Log.debug (fun log -> log "not found error: %s - %s" error message) ; 67 66 format_response error message `Not_Found 68 67 | UseDpopNonceError -> 69 - Dream.debug (fun log -> log "use_dpop_nonce error") ; 68 + Log.debug (fun log -> log "use_dpop_nonce error") ; 70 69 Dream.json ~status:`Bad_Request 71 70 ~headers: 72 71 [ ("WWW-Authenticate", {|DPoP error="use_dpop_nonce"|}) 73 72 ; ("Access-Control-Expose-Headers", "DPoP-Nonce, WWW-Authenticate") ] 74 73 {|{ "error": "use_dpop_nonce" }|} 75 74 | e -> 76 - Dream.warning (fun log -> 75 + Log.warn (fun log -> 77 76 log "unexpected internal error: %s" (Printexc.to_string e) ) ; 78 77 format_response "InternalServerError" "Internal server error" 79 78 `Internal_Server_Error 80 79 81 - let log_exn ?req exn = 82 - Dream.error (fun log -> log ?request:req "%s" (Printexc.to_string exn)) 80 + let log_exn = Log.log_exn
+1 -1
pegasus/lib/jwt.ml
··· 159 159 let did = Option.value did ~default:iss_did in 160 160 match%lwt Id_resolver.Did.resolve did with 161 161 | Error e -> 162 - Dream.debug (fun log -> 162 + Log.debug (fun log -> 163 163 log "failed to resolve did %s: %s" did e ) ; 164 164 Lwt.return_error 165 165 @@ InternalError "could not resolve jwt issuer did"
+11
pegasus/lib/log.ml
··· 1 + let default_src = Logs.Src.create "pegasus" 2 + 3 + let debug ?(src = default_src) = Logs.debug ~src 4 + 5 + let err ?(src = default_src) = Logs.err ~src 6 + 7 + let warn ?(src = default_src) = Logs.warn ~src 8 + 9 + let info ?(src = default_src) = Logs.info ~src 10 + 11 + let log_exn exn = err (fun log -> log "%s" (Printexc.to_string exn))
+1 -1
pegasus/lib/oauth/dpop.ml
··· 159 159 else 160 160 match header |> member "jwk" |> ec_jwk_of_yojson with 161 161 | Error e -> 162 - Dream.debug (fun log -> log "error parsing jwk: %s" e) ; 162 + Log.debug (fun log -> log "error parsing jwk: %s" e) ; 163 163 Errors.internal_error () 164 164 | Ok jwk -> ( 165 165 if
+11 -12
pegasus/lib/s3/backup.ml
··· 14 14 in 15 15 match result with 16 16 | Ok _ -> 17 - Dream.info (fun log -> log "S3 backup uploaded: %s" key) ; 17 + Log.info (fun log -> log "S3 backup uploaded: %s" key) ; 18 18 Lwt.return_unit 19 19 | Error e -> 20 - Dream.error (fun log -> 20 + Log.err (fun log -> 21 21 log "S3 backup upload failed for %s: %s" key 22 22 (Util.s3_error_to_string e) ) ; 23 23 Lwt.return_unit ··· 27 27 if Sys.file_exists db_path then ( 28 28 let timestamp = timestamp_string () in 29 29 let key = Printf.sprintf "backups/pegasus-%s.db" timestamp in 30 - Dream.info (fun log -> log "starting main database backup") ; 30 + Log.info (fun log -> log "starting main database backup") ; 31 31 upload_to_s3 ~config ~file_path:db_path ~key ) 32 32 else ( 33 - Dream.warning (fun log -> log "main database not found: %s" db_path) ; 33 + Log.warn (fun log -> log "main database not found: %s" db_path) ; 34 34 Lwt.return_unit ) 35 35 36 36 let backup_user_db ~config ~did : unit Lwt.t = ··· 43 43 else Lwt.return_unit 44 44 45 45 let backup_all_user_dbs ~config ~ds : unit Lwt.t = 46 - Dream.info (fun log -> log "starting backup of user databases") ; 46 + Log.info (fun log -> log "starting backup of user databases") ; 47 47 let rec backup_batch cursor count = 48 48 let%lwt actors = Data_store.list_actors ~cursor ~limit:100 ds in 49 49 match actors with 50 50 | [] -> 51 - Dream.info (fun log -> log "backed up %d user databases" count) ; 51 + Log.info (fun log -> log "backed up %d user databases" count) ; 52 52 Lwt.return_unit 53 53 | actors -> 54 54 let%lwt () = ··· 65 65 let do_backup () : unit Lwt.t = 66 66 match Env.s3_config with 67 67 | Some config when config.backups_enabled -> 68 - Dream.info (fun log -> log "starting S3 backup") ; 68 + Log.info (fun log -> log "starting S3 backup") ; 69 69 let%lwt ds = Data_store.connect () in 70 70 let%lwt () = backup_main_db ~config in 71 71 let%lwt () = backup_all_user_dbs ~config ~ds in 72 - Dream.info (fun log -> log "S3 backup completed") ; 72 + Log.info (fun log -> log "S3 backup completed") ; 73 73 Lwt.return_unit 74 74 | _ -> 75 75 Lwt.return_unit ··· 77 77 let queue_backups () : unit Lwt.t = 78 78 match Env.s3_config with 79 79 | Some config when config.backups_enabled -> 80 - Dream.info (fun log -> log "starting hourly S3 backups") ; 80 + Log.info (fun log -> log "starting hourly S3 backups") ; 81 81 let%lwt () = 82 82 Lwt.catch 83 83 (fun () -> do_backup ()) 84 84 (fun e -> 85 - Dream.error (fun log -> 86 - log "backup failed: %s" (Printexc.to_string e) ) ; 85 + Log.err (fun log -> log "backup failed: %s" (Printexc.to_string e)) ; 87 86 Lwt.return_unit ) 88 87 in 89 88 let rec loop () = ··· 92 91 Lwt.catch 93 92 (fun () -> do_backup ()) 94 93 (fun e -> 95 - Dream.error (fun log -> 94 + Log.err (fun log -> 96 95 log "backup failed: %s" (Printexc.to_string e) ) ; 97 96 Lwt.return_unit ) 98 97 in
+8 -8
pegasus/lib/s3/blob_migration.ml
··· 1 1 let migrate_user ~did : (int * int) Lwt.t = 2 2 match Env.s3_config with 3 3 | Some config when config.blobs_enabled -> 4 - Dream.info (fun log -> log "migrating blobs for user %s" did) ; 4 + Log.info (fun log -> log "migrating blobs for user %s" did) ; 5 5 let%lwt user_db = User_store.connect did in 6 6 let migrated = ref 0 in 7 7 let errors = ref 0 in ··· 38 38 Sys.remove local_path ; incr migrated ; Lwt.return_unit 39 39 ) 40 40 else ( 41 - Dream.warning (fun log -> 41 + Log.warn (fun log -> 42 42 log "local blob file not found: %s" local_path ) ; 43 43 Lwt.return_unit ) ) 44 44 (fun e -> 45 - Dream.error (fun log -> 45 + Log.err (fun log -> 46 46 log "blob migration error for %s: %s" 47 47 (Cid.to_string cid) (Printexc.to_string e) ) ; 48 48 incr errors ; ··· 53 53 migrate_batch (Cid.to_string last_cid) 54 54 in 55 55 let%lwt () = migrate_batch "" in 56 - Dream.info (fun log -> 56 + Log.info (fun log -> 57 57 log "blob migration complete for %s: %d migrated, %d errors" did 58 58 !migrated !errors ) ; 59 59 Lwt.return (!migrated, !errors) 60 60 | _ -> 61 - Dream.error (fun log -> log "S3 blob storage not enabled") ; 61 + Log.err (fun log -> log "S3 blob storage not enabled") ; 62 62 Lwt.return (0, 0) 63 63 64 64 let migrate_all () : unit Lwt.t = 65 65 match Env.s3_config with 66 66 | Some config when config.blobs_enabled -> 67 - Dream.info (fun log -> log "migrating all blobs to S3") ; 67 + Log.info (fun log -> log "migrating all blobs to S3") ; 68 68 let%lwt ds = Data_store.connect () in 69 69 let total_migrated = ref 0 in 70 70 let total_errors = ref 0 in ··· 87 87 migrate_batch last.did 88 88 in 89 89 let%lwt () = migrate_batch "" in 90 - Dream.info (fun log -> 90 + Log.info (fun log -> 91 91 log "blob migration complete: %d total migrated, %d total errors" 92 92 !total_migrated !total_errors ) ; 93 93 Lwt.return_unit 94 94 | _ -> 95 - Dream.error (fun log -> log "S3 blob storage not enabled") ; 95 + Log.err (fun log -> log "S3 blob storage not enabled") ; 96 96 Lwt.return_unit
+1 -1
pegasus/lib/sequencer.ml
··· 498 498 Lexicons.([%xrpc post "com.atproto.sync.requestCrawl"]) 499 499 ~hostname:Env.hostname client ) 500 500 (fun exn -> 501 - Dream.warning (fun log -> 501 + Log.warn (fun log -> 502 502 log "failed to requestCrawl %s: %s" service 503 503 (Printexc.to_string exn) ) ) ) 504 504 Env.crawlers
+2 -2
pegasus/lib/util.ml
··· 561 561 recipients 562 562 |> Option.get 563 563 in 564 - Dream.log "email to %s: %s" to_addr text 564 + Log.info (fun log -> log "email to %s: %s" to_addr text) 565 565 in 566 566 match (Env.smtp_config, Env.smtp_sender) with 567 567 | Some config, Some sender -> ( ··· 571 571 | Ok message -> ( 572 572 try%lwt Letters.send ~config ~sender ~recipients ~message 573 573 with e -> 574 - Errors.log_exn e ; 574 + Log.log_exn e ; 575 575 Lwt.return (log_email ()) ) ) 576 576 | _ -> 577 577 Lwt.return (log_email ())
+8 -8
pegasus/lib/xrpc.ml
··· 112 112 apply_rate_limits ~nsid rate_limits ctx ; 113 113 try%lwt hdlr ctx 114 114 with e -> 115 - if not (is_xrpc_error e) then log_exn ~req:init.req e ; 115 + if not (is_xrpc_error e) then log_exn e ; 116 116 exn_to_response e 117 117 with Rate_limiter.Rate_limit_exceeded status -> 118 118 rate_limit_response status ) ··· 124 124 | Rate_limiter.Rate_limit_exceeded status -> 125 125 rate_limit_response status 126 126 | e -> 127 - if not (is_xrpc_error e) then log_exn ~req:init.req e ; 127 + if not (is_xrpc_error e) then log_exn e ; 128 128 exn_to_response e 129 129 with Redirect r -> Dream.redirect init.req r 130 130 ··· 141 141 in 142 142 match query_json |> of_yojson with 143 143 | Error e -> 144 - Dream.debug (fun log -> log "error parsing query: %s" e) ; 144 + Log.debug (fun log -> log "error parsing query: %s" e) ; 145 145 Errors.internal_error () 146 146 | Ok query -> 147 147 query ··· 173 173 | _ -> 174 174 Lwt.return (`Assoc []) ) 175 175 in 176 + Log.debug (fun l -> l "body: %s" (Yojson.Safe.to_string body_assoc)) ; 176 177 match of_yojson body_assoc with 177 178 | Error e -> 178 - Dream.debug (fun log -> log "error parsing body: %s" e) ; 179 + Log.debug (fun log -> log "error parsing body: %s" e) ; 179 180 Errors.internal_error () 180 181 | Ok body -> 181 182 Lwt.return body ··· 267 268 Body.to_stream body |> Lwt_stream.iter_s (Dream.write stream) ) 268 269 | e -> 269 270 let%lwt () = Body.drain_body body in 270 - Dream.error (fun log -> 271 + Log.err (fun log -> 271 272 log "error when proxying to %s: %s" (Uri.to_string uri) 272 273 (Http.Status.to_string e) ) ; 273 274 Errors.internal_error ~msg:"failed to proxy request" () ) ··· 289 290 Body.to_stream body |> Lwt_stream.iter_s (Dream.write stream) ) 290 291 | e -> 291 292 let%lwt () = Body.drain_body body in 292 - Dream.error (fun log -> 293 + Log.err (fun log -> 293 294 log "error when proxying to %s: %s" (Uri.to_string uri) 294 295 (Http.Status.to_string e) ) ; 295 296 Errors.internal_error ~msg:"failed to proxy request" () ) 296 297 | _ -> 297 298 Errors.invalid_request "unsupported method" ) 298 299 | Error e -> 299 - Dream.error (fun log -> 300 - log ~request:ctx.req "error when resolving destination service: %s" e ) ; 300 + Log.err (fun log -> log "error when resolving destination service: %s" e) ; 301 301 Errors.internal_error ~msg:"failed to resolve destination service" () 302 302 303 303 let service_proxy_handler db req =