itsi-scheduler 0.2.16 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +1 -1
  3. data/ext/itsi_acme/Cargo.toml +1 -1
  4. data/ext/itsi_scheduler/Cargo.toml +1 -1
  5. data/ext/itsi_server/Cargo.toml +3 -1
  6. data/ext/itsi_server/src/lib.rs +6 -1
  7. data/ext/itsi_server/src/ruby_types/itsi_body_proxy/mod.rs +2 -0
  8. data/ext/itsi_server/src/ruby_types/itsi_grpc_call.rs +4 -4
  9. data/ext/itsi_server/src/ruby_types/itsi_grpc_response_stream/mod.rs +14 -13
  10. data/ext/itsi_server/src/ruby_types/itsi_http_request.rs +64 -33
  11. data/ext/itsi_server/src/ruby_types/itsi_http_response.rs +151 -152
  12. data/ext/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +422 -110
  13. data/ext/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +62 -15
  14. data/ext/itsi_server/src/ruby_types/itsi_server.rs +1 -1
  15. data/ext/itsi_server/src/server/binds/listener.rs +45 -7
  16. data/ext/itsi_server/src/server/frame_stream.rs +142 -0
  17. data/ext/itsi_server/src/server/http_message_types.rs +142 -9
  18. data/ext/itsi_server/src/server/io_stream.rs +28 -5
  19. data/ext/itsi_server/src/server/lifecycle_event.rs +1 -1
  20. data/ext/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +2 -3
  21. data/ext/itsi_server/src/server/middleware_stack/middlewares/compression.rs +8 -10
  22. data/ext/itsi_server/src/server/middleware_stack/middlewares/cors.rs +2 -3
  23. data/ext/itsi_server/src/server/middleware_stack/middlewares/csp.rs +3 -3
  24. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +54 -56
  25. data/ext/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +5 -7
  26. data/ext/itsi_server/src/server/middleware_stack/middlewares/etag.rs +5 -5
  27. data/ext/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +7 -10
  28. data/ext/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +2 -3
  29. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +1 -2
  30. data/ext/itsi_server/src/server/middleware_stack/middlewares/static_response.rs +4 -6
  31. data/ext/itsi_server/src/server/mod.rs +1 -0
  32. data/ext/itsi_server/src/server/process_worker.rs +3 -4
  33. data/ext/itsi_server/src/server/serve_strategy/acceptor.rs +16 -12
  34. data/ext/itsi_server/src/server/serve_strategy/cluster_mode.rs +83 -31
  35. data/ext/itsi_server/src/server/serve_strategy/single_mode.rs +166 -142
  36. data/ext/itsi_server/src/server/signal.rs +37 -9
  37. data/ext/itsi_server/src/server/thread_worker.rs +84 -69
  38. data/ext/itsi_server/src/services/itsi_http_service.rs +43 -43
  39. data/ext/itsi_server/src/services/static_file_server.rs +28 -47
  40. data/lib/itsi/scheduler/version.rb +1 -1
  41. metadata +2 -1
@@ -2,7 +2,7 @@ use crate::{
2
2
  default_responses::NOT_FOUND_RESPONSE,
3
3
  prelude::*,
4
4
  server::{
5
- http_message_types::{HttpRequest, HttpResponse, RequestExt, ResponseFormat},
5
+ http_message_types::{HttpBody, HttpRequest, HttpResponse, RequestExt, ResponseFormat},
6
6
  middleware_stack::ErrorResponse,
7
7
  redirect_type::RedirectType,
8
8
  },
@@ -16,7 +16,6 @@ use http::{
16
16
  },
17
17
  HeaderName, HeaderValue, Response, StatusCode,
18
18
  };
19
- use http_body_util::{combinators::BoxBody, Full};
20
19
  use itsi_error::Result;
21
20
  use parking_lot::{Mutex, RwLock};
22
21
  use percent_encoding::percent_decode_str;
@@ -28,7 +27,6 @@ use std::{
28
27
  borrow::Cow,
29
28
  cmp::Ordering,
30
29
  collections::HashMap,
31
- convert::Infallible,
32
30
  fs::Metadata,
33
31
  ops::Deref,
34
32
  path::{Path, PathBuf},
@@ -324,7 +322,7 @@ impl StaticFileServer {
324
322
  }) => Response::builder()
325
323
  .status(StatusCode::MOVED_PERMANENTLY)
326
324
  .header(header::LOCATION, redirect_to)
327
- .body(BoxBody::new(Full::new(Bytes::new())))
325
+ .body(HttpBody::empty())
328
326
  .unwrap(),
329
327
  Err(not_found_behavior) => match not_found_behavior {
330
328
  NotFoundBehavior::Error(error_response) => {
@@ -340,7 +338,7 @@ impl StaticFileServer {
340
338
  NotFoundBehavior::Redirect(redirect) => Response::builder()
341
339
  .status(redirect.r#type.status_code())
342
340
  .header(header::LOCATION, redirect.to)
343
- .body(BoxBody::new(Full::new(Bytes::new())))
341
+ .body(HttpBody::empty())
344
342
  .unwrap(),
345
343
  },
346
344
  })
@@ -407,7 +405,7 @@ impl StaticFileServer {
407
405
 
408
406
  Response::builder()
409
407
  .status(StatusCode::NOT_FOUND)
410
- .body(BoxBody::new(Full::new(Bytes::new())))
408
+ .body(HttpBody::empty())
411
409
  .unwrap()
412
410
  }
413
411
 
@@ -648,15 +646,8 @@ impl StaticFileServer {
648
646
  Err(nf)
649
647
  }
650
648
 
651
- async fn stream_file_range(
652
- &self,
653
- path: PathBuf,
654
- start: u64,
655
- end: u64,
656
- ) -> Option<BoxBody<Bytes, Infallible>> {
649
+ async fn stream_file_range(&self, path: PathBuf, start: u64, end: u64) -> Option<HttpBody> {
657
650
  use futures::TryStreamExt;
658
- use http_body_util::StreamBody;
659
- use hyper::body::Frame;
660
651
  use tokio::io::AsyncSeekExt;
661
652
  use tokio_util::io::ReaderStream;
662
653
 
@@ -687,32 +678,25 @@ impl StaticFileServer {
687
678
  let range_length = end - start + 1;
688
679
  let limited_reader = tokio::io::AsyncReadExt::take(file, range_length);
689
680
  let path_clone = path.clone();
690
- let stream = ReaderStream::with_capacity(limited_reader, 64 * 1024)
691
- .map_ok(Frame::data)
692
- .map_err(move |e| {
693
- warn!("Error streaming file {}: {}", path_clone.display(), e);
694
- unreachable!("We handle IO errors above")
695
- });
696
-
697
- Some(BoxBody::new(StreamBody::new(stream)))
681
+ let stream = ReaderStream::with_capacity(limited_reader, 64 * 1024).map_err(move |e| {
682
+ warn!("Error streaming file {}: {}", path_clone.display(), e);
683
+ unreachable!("We handle IO errors above")
684
+ });
685
+ Some(HttpBody::stream(stream))
698
686
  }
699
687
 
700
- async fn stream_file(&self, path: PathBuf) -> Option<BoxBody<Bytes, Infallible>> {
688
+ async fn stream_file(&self, path: PathBuf) -> Option<HttpBody> {
701
689
  use futures::TryStreamExt;
702
- use http_body_util::StreamBody;
703
- use hyper::body::Frame;
704
690
  use tokio_util::io::ReaderStream;
705
691
 
706
692
  match File::open(&path).await {
707
693
  Ok(file) => {
708
694
  let path_clone = path.clone();
709
- let stream = ReaderStream::with_capacity(file, 64 * 1024)
710
- .map_ok(Frame::data)
711
- .map_err(move |e| {
712
- warn!("Error streaming file {}: {}", path_clone.display(), e);
713
- unreachable!("We handle IO errors above")
714
- });
715
- Some(BoxBody::new(StreamBody::new(stream)))
695
+ let stream = ReaderStream::with_capacity(file, 64 * 1024).map_err(move |e| {
696
+ warn!("Error streaming file {}: {}", path_clone.display(), e);
697
+ unreachable!("We handle IO errors above")
698
+ });
699
+ Some(HttpBody::stream(stream))
716
700
  }
717
701
  Err(e) => {
718
702
  warn!(
@@ -749,7 +733,7 @@ impl StaticFileServer {
749
733
  return Response::builder()
750
734
  .status(StatusCode::RANGE_NOT_SATISFIABLE)
751
735
  .header("Content-Range", format!("bytes */{}", content_length))
752
- .body(BoxBody::new(Full::new(Bytes::new())))
736
+ .body(HttpBody::empty())
753
737
  .unwrap();
754
738
  }
755
739
 
@@ -795,7 +779,7 @@ impl StaticFileServer {
795
779
  builder = builder.header("Content-Range", range);
796
780
  }
797
781
 
798
- return builder.body(BoxBody::new(Full::new(Bytes::new()))).unwrap();
782
+ return builder.body(HttpBody::empty()).unwrap();
799
783
  }
800
784
 
801
785
  // For GET requests, prepare the actual content
@@ -829,10 +813,7 @@ impl StaticFileServer {
829
813
  }
830
814
  }
831
815
 
832
- fn serve_cached_content(
833
- &self,
834
- serve_cache_args: ServeCacheArgs,
835
- ) -> http::Response<BoxBody<Bytes, Infallible>> {
816
+ fn serve_cached_content(&self, serve_cache_args: ServeCacheArgs) -> HttpResponse {
836
817
  let ServeCacheArgs(
837
818
  cache_entry,
838
819
  start,
@@ -855,7 +836,7 @@ impl StaticFileServer {
855
836
  return Response::builder()
856
837
  .status(StatusCode::RANGE_NOT_SATISFIABLE)
857
838
  .header("Content-Range", format!("bytes */{}", content_length))
858
- .body(BoxBody::new(Full::new(Bytes::new())))
839
+ .body(HttpBody::empty())
859
840
  .unwrap();
860
841
  }
861
842
 
@@ -904,7 +885,7 @@ impl StaticFileServer {
904
885
  builder = builder.header("Content-Range", range);
905
886
  }
906
887
 
907
- return builder.body(BoxBody::new(Full::new(Bytes::new()))).unwrap();
888
+ return builder.body(HttpBody::empty()).unwrap();
908
889
  }
909
890
 
910
891
  if is_range_request {
@@ -920,7 +901,7 @@ impl StaticFileServer {
920
901
  cache_entry.last_modified_http_date.clone(),
921
902
  content_range,
922
903
  &self.headers,
923
- BoxBody::new(Full::new(range_bytes)),
904
+ HttpBody::full(range_bytes),
924
905
  )
925
906
  } else {
926
907
  // Return the full content
@@ -987,15 +968,15 @@ fn format_http_date_header(time: SystemTime) -> HeaderValue {
987
968
  .unwrap()
988
969
  }
989
970
 
990
- fn build_ok_body(bytes: Arc<Bytes>) -> BoxBody<Bytes, Infallible> {
991
- BoxBody::new(Full::new(bytes.as_ref().clone()))
971
+ fn build_ok_body(bytes: Arc<Bytes>) -> HttpBody {
972
+ HttpBody::full(bytes.as_ref().clone())
992
973
  }
993
974
 
994
975
  // Helper function to handle not modified responses
995
- fn build_not_modified_response() -> http::Response<BoxBody<Bytes, Infallible>> {
976
+ fn build_not_modified_response() -> HttpResponse {
996
977
  Response::builder()
997
978
  .status(StatusCode::NOT_MODIFIED)
998
- .body(BoxBody::new(Full::new(Bytes::new())))
979
+ .body(HttpBody::empty())
999
980
  .unwrap()
1000
981
  }
1001
982
 
@@ -1009,8 +990,8 @@ fn build_file_response(
1009
990
  last_modified_http_date: HeaderValue,
1010
991
  range_header: Option<String>,
1011
992
  headers: &Option<HashMap<String, String>>,
1012
- body: BoxBody<Bytes, Infallible>,
1013
- ) -> http::Response<BoxBody<Bytes, Infallible>> {
993
+ body: HttpBody,
994
+ ) -> HttpResponse {
1014
995
  let mut response = Response::new(body);
1015
996
 
1016
997
  *response.status_mut() = status;
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Itsi
4
4
  class Scheduler
5
- VERSION = "0.2.16"
5
+ VERSION = "0.2.18"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itsi-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.16
4
+ version: 0.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter Coppieters
@@ -120,6 +120,7 @@ files:
120
120
  - ext/itsi_server/src/server/binds/tls.rs
121
121
  - ext/itsi_server/src/server/binds/tls/locked_dir_cache.rs
122
122
  - ext/itsi_server/src/server/byte_frame.rs
123
+ - ext/itsi_server/src/server/frame_stream.rs
123
124
  - ext/itsi_server/src/server/http_message_types.rs
124
125
  - ext/itsi_server/src/server/io_stream.rs
125
126
  - ext/itsi_server/src/server/lifecycle_event.rs