@@ -223,7 +223,7 @@ pub(crate) async fn start_server(
223223
224224async fn meta_handler ( State ( state) : State < ServerState > , headers : HeaderMap ) -> Response {
225225 if let Err ( response) = authenticate_bearer ( & state, & headers) {
226- return response;
226+ return * response;
227227 }
228228 Json ( serde_json:: json!( {
229229 "serverVersion" : state. version,
@@ -241,7 +241,7 @@ async fn rpc_handler(
241241) -> Response {
242242 let connection = match authenticate_connection ( & state, & headers) {
243243 Ok ( connection) => connection,
244- Err ( response) => return response,
244+ Err ( response) => return * response,
245245 } ;
246246 let id = request. id ;
247247 match dispatch_rpc (
@@ -270,7 +270,7 @@ async fn upload_handler(
270270 mut multipart : Multipart ,
271271) -> Response {
272272 if let Err ( response) = authenticate_connection ( & state, & headers) {
273- return response;
273+ return * response;
274274 }
275275 let request_id = Uuid :: new_v4 ( ) . to_string ( ) ;
276276 let mut filename = None ;
@@ -336,7 +336,7 @@ async fn websocket_handler(
336336 websocket : WebSocketUpgrade ,
337337) -> Response {
338338 if let Err ( response) = validate_host_and_origin ( & state, & headers) {
339- return response;
339+ return * response;
340340 }
341341 let Some ( protocol) = websocket_bearer_protocol ( & headers) else {
342342 return rpc_http_error (
@@ -409,7 +409,7 @@ async fn static_handler(
409409 uri : Uri ,
410410) -> Response {
411411 if let Err ( response) = validate_host ( & state, & headers) {
412- return response;
412+ return * response;
413413 }
414414 if uri. path ( ) . starts_with ( "/_kimi/" ) {
415415 return StatusCode :: NOT_FOUND . into_response ( ) ;
@@ -464,52 +464,52 @@ fn normalized_asset_path(path: &str) -> Option<String> {
464464fn authenticate_connection (
465465 state : & ServerState ,
466466 headers : & HeaderMap ,
467- ) -> Result < Arc < RpcConnection > , Response > {
467+ ) -> Result < Arc < RpcConnection > , Box < Response > > {
468468 authenticate_bearer ( state, headers) ?;
469469 let Some ( connection_id) = headers
470470 . get ( "x-kimi-connection-id" )
471471 . and_then ( |value| value. to_str ( ) . ok ( ) )
472472 else {
473- return Err ( rpc_http_error (
473+ return Err ( Box :: new ( rpc_http_error (
474474 StatusCode :: CONFLICT ,
475475 "" ,
476476 "connection.required" ,
477477 "an active WebSocket connection is required" ,
478- ) ) ;
478+ ) ) ) ;
479479 } ;
480480 state
481481 . connections
482482 . lock ( )
483483 . ok ( )
484484 . and_then ( |connections| connections. get ( connection_id) . cloned ( ) )
485485 . ok_or_else ( || {
486- rpc_http_error (
486+ Box :: new ( rpc_http_error (
487487 StatusCode :: CONFLICT ,
488488 "" ,
489489 "connection.stale" ,
490490 "the WebSocket connection is no longer active" ,
491- )
491+ ) )
492492 } )
493493}
494494
495- fn authenticate_bearer ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Response > {
495+ fn authenticate_bearer ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Box < Response > > {
496496 validate_host_and_origin ( state, headers) ?;
497497 let credential = headers
498498 . get ( header:: AUTHORIZATION )
499499 . and_then ( |value| value. to_str ( ) . ok ( ) )
500500 . and_then ( |value| value. strip_prefix ( "Bearer " ) ) ;
501501 if !credential. is_some_and ( |value| token_matches ( & state. token , value) ) {
502- return Err ( rpc_http_error (
502+ return Err ( Box :: new ( rpc_http_error (
503503 StatusCode :: UNAUTHORIZED ,
504504 "" ,
505505 "auth.invalid" ,
506506 "a valid bearer credential is required" ,
507- ) ) ;
507+ ) ) ) ;
508508 }
509509 Ok ( ( ) )
510510}
511511
512- fn validate_host_and_origin ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Response > {
512+ fn validate_host_and_origin ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Box < Response > > {
513513 validate_host ( state, headers) ?;
514514 let host = headers
515515 . get ( header:: HOST )
@@ -518,31 +518,30 @@ fn validate_host_and_origin(state: &ServerState, headers: &HeaderMap) -> Result<
518518 if let Some ( origin) = headers
519519 . get ( header:: ORIGIN )
520520 . and_then ( |value| value. to_str ( ) . ok ( ) )
521+ && !origin_allowed ( state. listen_scope , state. port , host, origin)
521522 {
522- if !origin_allowed ( state. listen_scope , state. port , host, origin) {
523- return Err ( rpc_http_error (
524- StatusCode :: FORBIDDEN ,
525- "" ,
526- "origin.rejected" ,
527- "request origin is not allowed" ,
528- ) ) ;
529- }
523+ return Err ( Box :: new ( rpc_http_error (
524+ StatusCode :: FORBIDDEN ,
525+ "" ,
526+ "origin.rejected" ,
527+ "request origin is not allowed" ,
528+ ) ) ) ;
530529 }
531530 Ok ( ( ) )
532531}
533532
534- fn validate_host ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Response > {
533+ fn validate_host ( state : & ServerState , headers : & HeaderMap ) -> Result < ( ) , Box < Response > > {
535534 let host = headers
536535 . get ( header:: HOST )
537536 . and_then ( |value| value. to_str ( ) . ok ( ) )
538537 . unwrap_or_default ( ) ;
539538 if !host_allowed ( state. listen_scope , state. port , host) {
540- return Err ( rpc_http_error (
539+ return Err ( Box :: new ( rpc_http_error (
541540 StatusCode :: BAD_REQUEST ,
542541 "" ,
543542 "host.rejected" ,
544543 "request host is not allowed" ,
545- ) ) ;
544+ ) ) ) ;
546545 }
547546 Ok ( ( ) )
548547}
0 commit comments