rage-iodine 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e0cf25032c21b2f527b8692bfead0da142cecc0bc625eea36da5a45046978ef
4
- data.tar.gz: 512d45f660c336e8b33dd237fce1eec816828039a4139b71c505b318ecf37ef6
3
+ metadata.gz: a1cf5cbcae299e1e28aaca04e99ea7ab9204a4d98fbf9434b27620f7588c22bc
4
+ data.tar.gz: 634a243fc8abdff8bfa59e21cf4e2a95a356e309569d17e85568cd5c2803d38f
5
5
  SHA512:
6
- metadata.gz: 82b018d7b9d1b7a3ce6facec12f22e27b1a3699a093571240ccaa95f98985cbf89a88a68821354eb5f5c3deb268f177c990afd2d396c6d776902dbafbcff96c9
7
- data.tar.gz: 60a58204b498adc19204793c6366168732718393fa8d3cdd49788bc94ae2d6c2a972d912ed51a22b16e24e48850fe05d11cdfb6c5d0839340b7533719267cc3d
6
+ metadata.gz: e25730fe3ce0166e0e7ad4e260a1a1d15787cc264c906fce21a6a960614c3d5d033cbb597bb54cb36a97c316f8f64c5bd079e2c4d3f4cf5b6f0de1d890d92f27
7
+ data.tar.gz: fa94545855b466b9a16f00dbb267161b0cad66c546d973aa589bd74500868381c349e6d8df5d18c983fa3ecb4fd69fa5f21e57dbedc0f69c833c809c1eb4dc8f
data/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@ Please notice that this change log contains changes for upcoming releases as wel
6
6
 
7
7
  ## Changes:
8
8
 
9
+ #### Change log v.3.3.0 (2024-08-18)
10
+
11
+ **Update**: Improvements and fixes for the static file service.
12
+
9
13
  #### Change log v.3.2.0 (2024-07-15)
10
14
 
11
15
  **Update**: Explicitly undefine the alloc function on IodineObjectStorage.
data/ext/iodine/http.c CHANGED
@@ -460,23 +460,16 @@ no_gzip_support:
460
460
  !(S_ISREG(file_data.st_mode) || S_ISLNK(file_data.st_mode)))
461
461
  return -1;
462
462
  found_file:
463
- /* set last-modified */
464
- {
465
- FIOBJ tmp = fiobj_str_buf(32);
466
- fiobj_str_resize(
467
- tmp, http_time2str(fiobj_obj2cstr(tmp).data, file_data.st_mtime));
468
- http_set_header(h, HTTP_HEADER_LAST_MODIFIED, tmp);
469
- }
470
463
  /* set cache-control */
471
464
  http_set_header(h, HTTP_HEADER_CACHE_CONTROL, fiobj_dup(HTTP_HVALUE_MAX_AGE));
465
+ /* set last-modified */
466
+ FIOBJ last_modified_str = fiobj_str_buf(32);
467
+ fiobj_str_resize(
468
+ last_modified_str, http_time2str(fiobj_obj2cstr(last_modified_str).data, file_data.st_mtime));
469
+ http_set_header(h, HTTP_HEADER_LAST_MODIFIED, last_modified_str);
472
470
  /* set & test etag */
473
- uint64_t etag = (uint64_t)file_data.st_size;
474
- etag ^= (uint64_t)file_data.st_mtime;
475
- etag = fiobj_hash_string(&etag, sizeof(uint64_t));
476
- FIOBJ etag_str = fiobj_str_buf(32);
477
- fiobj_str_resize(etag_str,
478
- fio_base64_encode(fiobj_obj2cstr(etag_str).data,
479
- (void *)&etag, sizeof(uint64_t)));
471
+ FIOBJ etag_str = fiobj_str_buf(1);
472
+ fiobj_str_printf(etag_str, "%lx-%llx", file_data.st_mtime, file_data.st_size);
480
473
  /* set */
481
474
  http_set_header(h, HTTP_HEADER_ETAG, etag_str);
482
475
  /* test */
@@ -499,7 +492,7 @@ found_file:
499
492
  if (!ifrange_hash)
500
493
  ifrange_hash = fiobj_hash_string("if-range", 8);
501
494
  FIOBJ tmp = fiobj_hash_get2(h->headers, ifrange_hash);
502
- if (tmp && fiobj_iseq(tmp, etag_str)) {
495
+ if (tmp && !(fiobj_iseq(tmp, etag_str) || fiobj_iseq(tmp, last_modified_str))) {
503
496
  fiobj_hash_delete2(h->headers, range_hash);
504
497
  } else {
505
498
  tmp = fiobj_hash_get2(h->headers, range_hash);
@@ -513,26 +506,30 @@ found_file:
513
506
  char *pos = range.data + 6;
514
507
  int64_t start_at = 0, end_at = 0;
515
508
  start_at = fio_atol(&pos);
516
- if (start_at >= file_data.st_size)
517
- goto open_file;
518
509
  if (start_at >= 0) {
519
510
  pos++;
520
511
  end_at = fio_atol(&pos);
521
- if (end_at <= 0)
522
- goto open_file;
523
512
  }
524
513
  /* we ignore multimple ranges, only responding with the first range. */
525
- if (start_at < 0) {
526
- if (0 - start_at < file_data.st_size) {
527
- offset = file_data.st_size - start_at;
528
- length = 0 - start_at;
529
- }
530
- } else if (end_at) {
514
+ if (end_at) {
515
+ /* "Range bytes=100-200": bytes between `start_at` and `end_at` are requested */
516
+ if (start_at < 0 || end_at <= start_at || end_at >= length)
517
+ goto invalid_range;
518
+
531
519
  offset = start_at;
532
520
  length = end_at - start_at + 1;
533
- if (length + start_at > file_data.st_size || length <= 0)
534
- length = length - start_at;
521
+ } else if (start_at < 0) {
522
+ /* "Range bytes=-100": the last `start_at` bytes are requested */
523
+ if (0 - start_at >= length)
524
+ goto invalid_range;
525
+
526
+ offset = file_data.st_size + start_at;
527
+ length = 0 - start_at;
535
528
  } else {
529
+ /* "Range bytes=100-": all bytes starting at `start_at` are requested */
530
+ if (start_at >= length)
531
+ goto invalid_range;
532
+
536
533
  offset = start_at;
537
534
  length = length - start_at;
538
535
  }
@@ -612,6 +609,14 @@ open_file:
612
609
  }
613
610
  http_sendfile(h, file, length, offset);
614
611
  return 0;
612
+ invalid_range:
613
+ {
614
+ FIOBJ crange = fiobj_str_buf(1);
615
+ fiobj_str_printf(crange, "bytes */%lu", (unsigned long)file_data.st_size);
616
+ http_set_header(h, HTTP_HEADER_CONTENT_RANGE, crange);
617
+ http_send_error(h, 416);
618
+ return 0;
619
+ }
615
620
  }
616
621
 
617
622
  /**
@@ -1,3 +1,3 @@
1
1
  module Iodine
2
- VERSION = '3.2.0'.freeze
2
+ VERSION = '3.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rage-iodine
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boaz Segev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-15 00:00:00.000000000 Z
11
+ date: 2024-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -274,7 +274,7 @@ requirements:
274
274
  - Ruby >= 2.5.0 recommended.
275
275
  - TLS requires OpenSSL >= 1.1.0.
276
276
  - Or Windows with Ruby >= 3.0.0 build with MingW and MingW as compiler.
277
- rubygems_version: 3.5.9
277
+ rubygems_version: 3.4.10
278
278
  signing_key:
279
279
  specification_version: 4
280
280
  summary: iodine - a fast HTTP / Websocket Server with Pub/Sub support, optimized for