Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ v3 (feature): add configuration support to c.SendFile() #3017

Merged
merged 16 commits into from
Jun 30, 2024

Conversation

efectn
Copy link
Member

@efectn efectn commented May 29, 2024

Description

This PR refactors SendFile functionality to make it work with different routes and different configurations.

Fixes #2945

Changes introduced

  • Documentation Update: Detail the updates made to the documentation and links to the changed files.
  • Changelog/What's New: Include a summary of the additions for the upcoming release notes.
  • Migration Guide: If necessary, provide a guide or steps for users to migrate their existing code to accommodate these changes.
  • Examples: Provide examples demonstrating the new features or changes in action.

Type of change

  • New feature (non-breaking change which adds functionality)
  • Enhancement (improvement to existing features and functionality)

Commit formatting

Please use emojis in commit messages for an easy way to identify the purpose or intention of a commit. Check out the emoji cheatsheet here: CONTRIBUTING.md

@efectn efectn requested a review from a team as a code owner May 29, 2024 20:14
@efectn efectn requested review from gaby, sixcolors and ReneWerner87 and removed request for a team May 29, 2024 20:14
Copy link
Contributor

coderabbitai bot commented May 29, 2024

Walkthrough

The update introduces a comprehensive overhaul to the SendFile functionality across multiple files, incorporating new configurations for file serving, including compression, caching, byte-range requests, and more. Major changes include adding a SendFile struct for enhanced configuration, updating the SendFile function signature, and altering routing to accommodate these changes. Extensive tests and documentation updates support the new functionality.

Changes

File Change Summary
ctx.go Introduced a SendFile struct with multiple configuration options and modified SendFile function to accept these configurations. Added methods like compareConfig and enhanced file serving logic including compression, cache control, and byte-range.
ctx_test.go Added global variable embedFile for embedding files and introduced new test functions for various SendFile options like compression, download, and cache control. Covered scenarios like file not found and different configuration usage.
docs/api/ctx.md Documented the new SendFile struct, updated SendFile function signature, and provided examples showcasing different configurations for sending files. Added examples for multiple configurations within a single route.
docs/whats_new.md Added note on the new SendFile configurations using a config parameter.
router.go Expanded Route struct to include fields related to the new file handling capabilities, such as sendFileFS, sendFileHandler, and sendFileCacheControlValue.
app.go Modified App struct to include sendfiles and sendfilesMutex fields and initialized sendfiles in the New function.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant WebServer
    participant SendFile
    Client->>WebServer: Request File
    WebServer->>SendFile: Call SendFile with Configuration
    SendFile-->WebServer: Serve File with Applied Config (Compression, Cache, etc.)
    WebServer-->>Client: Return File Response
Loading

Assessment against linked issues

Objective Addressed Explanation
Enable disabling cache for ctx.SendFile() (#2945)

Poem

In the server's dance of byte and file,
New options galore to make you smile.
With configs set just so precise,
Compression, caching now concise.
Embedded files and tests galore,
Our code now handles even more.
Hopping onwards, fast and free,
CodeRabbit's here with glee! 🌟


Tip

Early access features: enabled

We are currently testing the following features in early access:

  • OpenAI gpt-4o model for code reviews and chat: OpenAI claims that this model is better at understanding and generating code than the previous models. We seek your feedback over the next few weeks before making it generally available.

Note:

  • You can enable or disable early access features from the CodeRabbit UI or by updating the CodeRabbit configuration file.
  • Please join our Discord Community to provide feedback and report issues.
  • OSS projects are always opted into early access features.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

codecov bot commented May 29, 2024

Codecov Report

Attention: Patch coverage is 87.09677% with 8 lines in your changes missing coverage. Please review.

Project coverage is 83.02%. Comparing base (83731ce) to head (0750870).

Files Patch % Lines
ctx.go 86.88% 4 Missing and 4 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3017      +/-   ##
==========================================
- Coverage   83.06%   83.02%   -0.04%     
==========================================
  Files         115      115              
  Lines        8260     8308      +48     
==========================================
+ Hits         6861     6898      +37     
- Misses       1071     1077       +6     
- Partials      328      333       +5     
Flag Coverage Δ
unittests 83.02% <87.09%> (-0.04%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Outside diff range and nitpick comments (1)
ctx.go (1)

Line range hint 1221-1221: Avoid passing the Route struct by value.

- func (c *DefaultCtx) getLocationFromRoute(route Route, params Map) (string, error) {
+ func (c *DefaultCtx) getLocationFromRoute(route *Route, params Map) (string, error) {

The Route struct contains a sync.Once field, which includes a sync.Mutex. Passing it by value can lead to copying of the mutex, which is not safe. The function signature should be changed to pass a pointer to the Route struct instead.

Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between ed9d7cf and 6f4c253.
Files selected for processing (4)
  • ctx.go (3 hunks)
  • ctx_interface.go (1 hunks)
  • ctx_test.go (3 hunks)
  • router.go (2 hunks)
Additional Context Used
GitHub Check Runs (1)
lint failure (10)

ctx.go: [failure] 1221-1221:
copylocks: getLocationFromRoute passes lock by value: github.com/gofiber/fiber/v3.Route contains sync.Once contains sync.Mutex (govet)


ctx_test.go: [failure] 3042-3042:
empty-lines: extra empty line at the end of a block (revive)


ctx_test.go: [failure] 3045-3045:
unnecessary trailing newline (whitespace)

Additional comments not posted (7)
router.go (1)

65-68: Ensure proper initialization of new fields in Route struct.

Verification successful

The new fields in the Route struct (sendFileOnce, sendFileFS, sendFileHandler, and sendFileCacheControlValue) are properly initialized and used in ctx.go.

  • sendFileOnce is used to ensure the initialization happens only once.
  • sendFileFS is initialized with a new fasthttp.FS instance.
  • sendFileHandler is set using sendFileFS.NewRequestHandler().
  • sendFileCacheControlValue is assigned a cache control value.

These initializations and usages confirm that the new fields are correctly integrated into the codebase.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that new fields in `Route` struct are properly initialized.

# Test: Search for initialization of new fields. Expect: Initialization logic in relevant methods.
rg --type go $'sendFileOnce|sendFileFS|sendFileHandler|sendFileCacheControlValue'

Length of output: 751

ctx_interface.go (1)

311-311: Update all implementations of Ctx interface to reflect the new SendFile method signature.

ctx.go (2)

1402-1435: Introduce the SendFile struct to configure file sending options.

The new SendFile struct provides a flexible way to configure file sending options such as file system access, compression, byte range requests, direct downloads, cache duration, and cache control headers. This is a well-structured addition that enhances the functionality of file handling in the Fiber framework.


Line range hint 1440-1551: Refactor the SendFile method to utilize the new SendFile struct for configuration.

The refactoring of the SendFile method to accept a configuration struct is a significant improvement. It allows for more granular control over file sending behavior, aligning with the PR's objectives to enhance flexibility and usability.

ctx_test.go (3)

14-14: The addition of the embed package aligns with the new functionality to support embedded file systems. Good inclusion.


2974-3104: The new test functions comprehensively cover the updated SendFile functionality, including scenarios for downloading, setting max age, compression, and using an embedded file system. Great job on ensuring thorough testing.


3187-3219: The Test_SendFile_withRoutes function effectively tests the SendFile method across different routes and configurations, ensuring that the new functionality works as expected. Well done.

ctx_test.go Outdated Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 6f4c253 and 954ab45.

Files selected for processing (3)
  • ctx.go (3 hunks)
  • ctx_test.go (3 hunks)
  • router.go (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • ctx.go
  • ctx_test.go
  • router.go

@ReneWerner87 ReneWerner87 modified the milestone: v3 May 31, 2024
Copy link
Member

@ReneWerner87 ReneWerner87 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is still a bit to clarify

ctx.go Outdated Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Outside diff range and nitpick comments (3)
app.go (1)

Line range hint 911-911: Avoid dynamic error messages in Test method.

Using dynamic error messages can complicate error handling and tracking. Consider defining a static error or wrapping it appropriately.

-	return nil, fmt.Errorf("test: timeout error after %s", to)
+	var timeoutErr = errors.New("test: timeout error")
+	return nil, fmt.Errorf("%w after %s", timeoutErr, to)
ctx.go (2)

Line range hint 1477-1606: Enhanced SendFile Method

The refactored SendFile method now supports configurable behavior, which is a significant improvement. However, there are a few areas that could be optimized:

  1. Error Handling: When determining the absolute path, the error handling could be more robust. Consider logging the error or providing more context in the error message.
  2. Header Manipulation: Setting the Accept-Encoding header to "gzip" is hardcoded (line 1545), which might not be desirable in all scenarios. This could be made configurable or at least documented to inform the user about this behavior.
- return fmt.Errorf("failed to determine abs file path: %w", err)
+ return fmt.Errorf("SendFile error - failed to determine absolute file path for '%s': %w", file, err)

- c.fasthttp.Request.Header.Set(HeaderAcceptEncoding, "gzip")
+ if cfg.AllowGzip {
+     c.fasthttp.Request.Header.Set(HeaderAcceptEncoding, "gzip")
+ }

Consider adding a configuration option for gzip compression and improving the error message for better clarity.


Line range hint 631-631: Static Analysis Hint: Error Handling Improvement

The static analysis tool has flagged the creation of a new error directly in the Port method as a potential issue. It's recommended to define errors as static variables or use wrapped static errors for better error handling and performance.

- panic(errors.New("failed to type-assert to *net.TCPAddr"))
+ var ErrTypeAssertionFailed = errors.New("failed to type-assert to *net.TCPAddr")
+ panic(ErrTypeAssertionFailed)

Refactor to use a static error variable, which can be more efficiently handled and is more in line with Go best practices.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 954ab45 and 366dd56.

Files selected for processing (3)
  • app.go (2 hunks)
  • ctx.go (3 hunks)
  • ctx_test.go (3 hunks)
Additional context used
golangci-lint
app.go

911-911: do not define dynamic errors, use wrapped static errors instead: "fmt.Errorf("test: timeout error after %s", to)" (err113)

ctx.go

631-631: do not define dynamic errors, use wrapped static errors instead: "errors.New("failed to type-assert to *net.TCPAddr")" (err113)

ctx_test.go

3168-3168: unnecessary conversion (unconvert)


3185-3185: unnecessary conversion (unconvert)


3194-3194: unnecessary conversion (unconvert)


4526-4526: Error return value of fmt.Fprintf is not checked (errcheck)


4530-4530: Error return value of fmt.Fprintf is not checked (errcheck)

Additional comments not posted (8)
app.go (1)

446-446: Initialization of sendfiles field in New function.

The sendfiles field is properly initialized in the New function, ensuring that the app can handle file sending operations as configured. This change aligns with the PR's objective to enhance file handling capabilities.

ctx.go (1)

1402-1435: New Struct SendFile Introduced

The new SendFile struct provides configurable options for file handling, such as filesystem access, compression, byte range support, direct downloads, cache duration, and cache control. This is a robust enhancement aligning with the PR's objectives to add more flexibility to file handling.

However, consider adding more detailed comments for each field to explain their usage and impact more clearly, especially for fields like FS and CacheDuration where the implications of default values or specific settings might not be immediately obvious to all users.

ctx_test.go (6)

14-14: Import of embed package added for file embedding.

The addition of the embed package is aligned with the new feature to support embedded file systems in the SendFile functionality. This is a necessary change to enable the embedding of files directly into the binary, which can be useful for packaging applications that need to distribute files that are accessed frequently.


2974-3001: Review of Test_Ctx_SendFile_Download: Comprehensive testing of the SendFile download feature.

This test ensures that the SendFile method behaves as expected when the Download flag is set. It checks the body content, content disposition header, and status code. The test is well-structured, using parallel execution and proper cleanup with deferred calls. It's good to see comprehensive assertions that validate not just the error states but also the correct set-up of HTTP headers and response status.

However, consider adding a brief comment describing each block of assertions for clarity.


3003-3032: Review of Test_Ctx_SendFile_MaxAge: Properly tests cache control behavior.

This test function effectively checks the MaxAge configuration of the SendFile method. It's crucial for ensuring that cache control headers are set appropriately, which is particularly important for content delivery optimizations. The structure and assertions are similar to the previous test, maintaining consistency. Again, adding some comments to describe the purpose of each major block would enhance readability and maintainability.


3034-3070: Review of Test_Ctx_SendFile_Compressed: Validates the compression functionality.

The test checks if the SendFile method properly handles file compression when the Compress flag is true. It uses gzip to decompress the response and verify the content. This is an essential test for performance optimization in web applications, ensuring that the compression mechanism is functional.

Consider adding error handling for the gzip reader creation (gzip.NewReader) to catch and assert potential failures in creating the reader.


3072-3102: Review of Test_Ctx_SendFile_EmbedFS: Testing embedded file system support.

This test verifies the functionality of serving files from an embedded file system using the SendFile method. The use of the embed package allows for a neat integration of static files into the application binary. The test is structured to check the response status and body content against expected values, which is crucial for validating the embedded resource serving.

It's well-implemented, but adding some inline comments explaining the test setup and expectations would be beneficial for future maintainability.


3268-3300: Testing of route-specific file sending configurations.

This test function checks the SendFile functionality across different routes with specific configurations like download and file system settings. It's a good approach to verify that the route configurations are respected and behave as expected under different conditions.

The test is well-structured and covers essential assertions. Adding some comments to explain each route's specific test case would enhance clarity.

app.go Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
ctx_test.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (2)
ctx.go (2)

Line range hint 631-631: Use Wrapped Static Errors Instead of Dynamic Errors

The error creation here should utilize static errors as recommended by best practices. This change helps with error consistency and potentially improves performance by not generating an error string each time the code path is executed.

- panic(errors.New("failed to type-assert to *net.TCPAddr"))
+ var ErrTypeAssertionFailed = errors.New("failed to type-assert to *net.TCPAddr")
+ panic(ErrTypeAssertionFailed)

Line range hint 1476-1604: Complex Function SendFile Review

The SendFile function has been significantly refactored to support the new SendFile struct configurations. Here are some observations and suggestions:

  • Error Handling and Path Validation: The function correctly handles potential errors such as file path resolution and checks for absolute paths, which enhances robustness.
  • Configuration Application: The function effectively checks and applies configurations like byte range support and compression dynamically based on the provided SendFile struct, which aligns with the PR's objectives.
  • Cache Control and Compression Settings: These settings are now configurable, which provides flexibility in how files are served based on application requirements.

However, there are areas that could be improved for clarity and efficiency:

  1. Configuration Default Values: The default configuration application (lines 1485-1487) could be moved to a separate method or constructor for SendFile to clean up the main function logic.
  2. File Handler Cache Logic: The logic to check for existing file handlers based on configuration (lines 1491-1497) could be encapsulated in a separate method to improve modularity.

Overall, the changes are in line with the objectives of enhancing file serving capabilities, but refactoring for better clarity and separation of concerns is recommended.

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 366dd56 and e4b4b0f.

Files selected for processing (2)
  • ctx.go (3 hunks)
  • ctx_test.go (3 hunks)
Additional context used
golangci-lint
ctx.go

631-631: do not define dynamic errors, use wrapped static errors instead: "errors.New("failed to type-assert to *net.TCPAddr")" (err113)

ctx_test.go

3168-3168: unnecessary conversion (unconvert)


3185-3185: unnecessary conversion (unconvert)


3194-3194: unnecessary conversion (unconvert)


4526-4526: Error return value of fmt.Fprintf is not checked (errcheck)


4530-4530: Error return value of fmt.Fprintf is not checked (errcheck)

Additional comments not posted (7)
ctx.go (1)

1402-1435: New Struct Definition: SendFile

The SendFile struct has been introduced to handle configuration options for file serving. This is a positive change as it enables detailed configuration such as compression, byte range requests, and cache control settings, which aligns with the PR objectives to enhance SendFile functionality.

  • The use of fs.FS interface allows flexibility in the underlying file system used, which is a good practice.
  • The default values and JSON tags are correctly set, ensuring that the struct can be easily used in configurations parsed from JSON.

Overall, this struct addition is well-implemented and serves the purpose of making file serving more configurable.

ctx_test.go (6)

14-14: Import of embed package for testing embedded file systems.

This addition supports the new tests for embedded file systems, aligning with the PR objectives to enhance file serving capabilities.


2974-3001: Review of test function Test_Ctx_SendFile_Download.

This test checks the download functionality by ensuring the correct headers and response body are set. The use of require.NoError and require.Equal ensures that the test will fail fast on errors, which is a good practice. The test structure is clear and follows good testing practices.


3003-3032: Review of test function Test_Ctx_SendFile_MaxAge.

This test validates the max-age configuration for caching. It is well-structured and uses assertions effectively to ensure that the response headers and status codes are as expected.


3034-3070: Review of test function Test_Ctx_SendFile_Compressed.

The test function for file compression is comprehensive, checking both the Content-Encoding header and the actual content of the response. This ensures that the compression functionality works as intended.


3072-3102: Review of test function Test_Ctx_SendFile_EmbedFS.

This test function effectively demonstrates the use of an embedded file system in serving files. The use of embed.FS is consistent with the import added, and the test ensures that the file content is served correctly.


3268-3300: Review of test function Test_SendFile_withRoutes.

This test function checks different routes and configurations for serving files, which is crucial for validating the flexibility of the SendFile method. The test is well-organized and covers multiple scenarios effectively.

ctx.go Outdated Show resolved Hide resolved
ctx_test.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Outside diff range and nitpick comments (1)
ctx.go (1)

[!TIP]
Codebase Verification

Ensure Test Coverage for Default Cache Duration Logic in SendFile

The SendFile function has undergone significant modifications, including the introduction of configurable caching. However, our inspection indicates that the default cache duration logic has not been explicitly tested.

Please add test cases to cover the default cache duration logic in the SendFile function to ensure comprehensive test coverage.

  • Test File: ctx_test.go
  • Relevant Function: SendFile
Analysis chain

Line range hint 1494-1625: Detailed review of the modified SendFile function.

The function now supports a variety of new features such as configurable caching, byte range support, and compression. The implementation handles different configurations robustly. However, consider improving the error messages to be more descriptive, especially in the file path resolution logic.

Additionally, ensure that the default cache duration logic is explicitly tested since it significantly affects the functionality.

Scripts executed

The following scripts were executed for the analysis:


Script:

# Description: Verify test coverage for the default cache duration logic in `SendFile`.
# Test: Search for test cases covering default cache duration. Expect: At least one test case.
rg --type go $'func Test_SendFile_DefaultCacheDuration'

Length of output: 56



Script:

#!/bin/bash
# Search for test cases related to the SendFile function to check for implicit coverage of the default cache duration logic.

# Find all test files in the repository
test_files=$(fd --type f --extension go --glob "*_test.go")

# Search for test cases that call the SendFile function
for file in $test_files; do
    echo "Searching in $file..."
    rg --no-filename 'SendFile' "$file"
done

Length of output: 14708



Script:

#!/bin/bash
# Inspect test cases in ctx_test.go to check for coverage of the default cache duration logic in SendFile.

# Extract the relevant test functions from ctx_test.go
rg --type go --line-number --context 5 'func Test_Ctx_SendFile' ctx_test.go

Length of output: 2978

Tools
GitHub Check: codecov/patch

[warning] 1469-1469: ctx.go#L1469
Added line #L1469 was not covered by tests


[warning] 1473-1473: ctx.go#L1473
Added line #L1473 was not covered by tests


[warning] 1481-1481: ctx.go#L1481
Added line #L1481 was not covered by tests


[warning] 1485-1485: ctx.go#L1485
Added line #L1485 was not covered by tests

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between e4b4b0f and d151a02.

Files selected for processing (4)
  • app.go (2 hunks)
  • ctx.go (3 hunks)
  • ctx_interface_gen.go (1 hunks)
  • ctx_test.go (3 hunks)
Files skipped from review as they are similar to previous changes (1)
  • app.go
Additional context used
GitHub Check: codecov/patch
ctx.go

[warning] 1469-1469: ctx.go#L1469
Added line #L1469 was not covered by tests


[warning] 1473-1473: ctx.go#L1473
Added line #L1473 was not covered by tests


[warning] 1481-1481: ctx.go#L1481
Added line #L1481 was not covered by tests


[warning] 1485-1485: ctx.go#L1485
Added line #L1485 was not covered by tests

golangci-lint
ctx_test.go

3199-3199: unnecessary conversion (unconvert)

GitHub Check: lint
ctx_test.go

[failure] 3199-3199:
unnecessary conversion (unconvert)

Additional comments not posted (11)
ctx.go (2)

14-14: Approved addition of the io/fs import.
This import is essential for the new SendFile struct to handle file system interfaces.


1418-1451: Review of the new SendFile struct.

The struct is well-defined with appropriate JSON tags and comments. However, consider adding examples or more detailed documentation on how to use these fields, especially for fields like FS and CacheDuration, which might not be immediately clear to all users.

ctx_test.go (9)

14-14: Addition of the embed package.

The import of the embed package aligns with the new functionalities introduced, particularly for handling embedded file systems in tests.


2974-3001: Comprehensive test for downloading files.

This test effectively checks the new downloading functionality of SendFile. It validates the response content, headers, and status code, ensuring the feature behaves as expected.


3003-3032: Test for setting max age in cache control.

This test covers the new feature to set the max age for cache control. It correctly checks the cache control header and other response attributes.


3034-3062: Testing compression support.

This test verifies the compression functionality by running subtests for different algorithms (zstd, gzip, br). It properly uses parallel execution and checks the response status and headers.


3063-3102: Test for gzip compression in SendFile.

This test checks the gzip compression feature by reading the compressed response body and comparing it with the expected file content. It ensures that the Content-Encoding header is set correctly.


3104-3134: Test for using embedded file systems.

This test validates the handling of embedded file systems, a new feature introduced in this PR. It correctly fetches the file using the embedded system and verifies the response.


3141-3151: Test for file not found scenario.

This test ensures that the system correctly handles cases where the requested file does not exist, returning the appropriate status code and error message.


3153-3206: Test for multiple file handling scenarios.

This test covers multiple scenarios for file handling, including different configurations and query parameters. It checks for the correct response content and headers.

Tools
golangci-lint

3199-3199: unnecessary conversion (unconvert)

GitHub Check: lint

[failure] 3199-3199:
unnecessary conversion (unconvert)


3274-3306: Tests for different route configurations.

These tests verify the new route-based configurations for SendFile, ensuring that each route handles file serving correctly with respect to the specified settings.

@@ -273,7 +273,7 @@ type Ctx interface {
// SendFile transfers the file from the given path.
// The file is not compressed by default, enable this by passing a 'true' argument
// Sets the Content-Type response HTTP header field based on the filenames extension.
SendFile(file string, compress ...bool) error
SendFile(file string, config ...SendFile) error
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tip

Codebase Verification

Documentation for SendFile method is outdated and does not reflect the new signature.

The current documentation still shows the old method signature with a boolean parameter. Please update the documentation to include the new method signature and provide examples of how to use the new SendFile configurations effectively.

  • docs/api/ctx.md: Update the method signature and examples to reflect the new variadic SendFile parameter.
Analysis chain

Updated SendFile method signature to support configurations.

The method now accepts a variadic SendFile parameter, which allows for flexible configuration of file serving parameters. This is a significant improvement in terms of functionality. However, ensure that the documentation is updated to reflect these changes and guide users on how to use the new configurations effectively.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that the documentation includes the new method signature and usage examples.

# Test: Search for the method documentation. Expect: Documentation should include the new signature and examples.
rg --type markdown --glob '*.{md,markdown}' 'SendFile'

Length of output: 903

ctx_test.go Outdated Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
ctx.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (2)
docs/whats_new.md (1)

[!TIP]
Codebase Verification

Correct the term "ExpressJs" to "Express.js" for consistency.

The term "ExpressJs" appears multiple times in the docs/whats_new.md file. Please update all instances to "Express.js" to maintain consistency and correctness.

  • docs/whats_new.md: Lines containing "ExpressJs"
Analysis chain

Line range hint 49-222: Markdown Formatting and Grammar Suggestions

Please consider the following improvements to enhance the document's readability and correctness:

  • Use consistent list markers (prefer dashes over asterisks).
  • Correct the spelling of "Express.js" across the document.
  • Address minor grammatical issues such as missing commas and prepositions.
- Its a draft, not finished yet.
+ It's a draft, not finished yet.

- app.Config properties moved to listen config
+ app.Config properties moved to the listen config

- ExpressJs like
+ Express.js-like

- We've made some changes to the CORS middleware to improve its functionality and flexibility.
+ We've improved the functionality and flexibility of the CORS middleware.
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the use of "Express.js" in the documentation.
rg --type md --glob '*.md' 'ExpressJs'

Length of output: 361

Tools
Markdownlint

219-219: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


220-220: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


221-221: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


222-222: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)

docs/api/ctx.md (1)

Line range hint 1738-1787: Enhanced Example for SendFile Method

The examples provided for the SendFile method are comprehensive and demonstrate the flexibility of the new configuration options. However, adding a brief explanation before each case in the switch statement could enhance understanding, especially for new users of the framework.

  switch c.Query("config") {
    // Serve the file from the current directory without any compression.
    case "filesystem":
      return c.SendFile("style.css", Send
    // Serve the file with compression enabled.
    case "filesystem-compress":
      return c.SendFile("style.css", SendFile{
    // Serve the file with only compression, using the default file system.
    case "compress":
      return c.SendFile("style.css", SendFile{
    // Serve the file with default settings.
    default:
      return c.SendFile("style.css")
  }
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between d151a02 and fa20ed8.

Files selected for processing (5)
  • app.go (2 hunks)
  • ctx.go (4 hunks)
  • ctx_test.go (3 hunks)
  • docs/api/ctx.md (2 hunks)
  • docs/whats_new.md (1 hunks)
Files skipped from review as they are similar to previous changes (2)
  • app.go
  • ctx_test.go
Additional context used
LanguageTool
docs/whats_new.md

[grammar] ~51-~51: It looks like there is a word missing here. Did you mean “listen to config”?
Context: ...ic.md) * app.Config properties moved to listen config * DisableStartupMessage * EnablePre...

(LISTEN_TO_ME)


[style] ~55-~55: This adverb was used twice in the sentence. Consider removing one of them or replacing them with a synonym.
Context: ...nablePrintRoutes * ListenerNetwork -> previously Network ### new methods * RegisterCus...

(ADVERB_REPETITION_PREMIUM)


[uncategorized] ~66-~66: Possible missing preposition found.
Context: ...ods * Mount -> Use app.Use() instead * ListenTLS -> Use app.Listen() with tls.Config * L...

(AI_HYDRA_LEO_MISSING_OF)


[uncategorized] ~174-~174: Possible missing comma found.
Context: ...details> To enable the routing changes above we had to slightly adjust the signature...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~192-~192: The official spelling of this programming framework is “Express.js”.
Context: ... ::: ### new methods * AutoFormat -> ExpressJs like * Host -> ExpressJs like * Port ->...

(NODE_JS)


[uncategorized] ~193-~193: The official spelling of this programming framework is “Express.js”.
Context: ... AutoFormat -> ExpressJs like * Host -> ExpressJs like * Port -> ExpressJs like * IsProxy...

(NODE_JS)


[uncategorized] ~194-~194: The official spelling of this programming framework is “Express.js”.
Context: ...like * Host -> ExpressJs like * Port -> ExpressJs like * IsProxyTrusted * Reset * Schema ...

(NODE_JS)


[uncategorized] ~197-~197: The official spelling of this programming framework is “Express.js”.
Context: ...ke * IsProxyTrusted * Reset * Schema -> ExpressJs like * SendStream -> ExpressJs like * S...

(NODE_JS)


[uncategorized] ~198-~198: The official spelling of this programming framework is “Express.js”.
Context: ...chema -> ExpressJs like * SendStream -> ExpressJs like * SendString -> ExpressJs like * S...

(NODE_JS)


[uncategorized] ~199-~199: The official spelling of this programming framework is “Express.js”.
Context: ...tream -> ExpressJs like * SendString -> ExpressJs like * String -> ExpressJs like * ViewB...

(NODE_JS)


[uncategorized] ~200-~200: The official spelling of this programming framework is “Express.js”.
Context: ...endString -> ExpressJs like * String -> ExpressJs like * ViewBind -> instead of Bind ###...

(NODE_JS)


[grammar] ~254-~254: Do not use the singular ‘a’ before the plural noun ‘conditions’.
Context: ...ache management, allowing you to define a custom conditions for invalidating cache entries. ### CO...

(VB_A_JJ_NNS)


[style] ~258-~258: Consider rephrasing this to strengthen your wording.
Context: ...idating cache entries. ### CORS We've made some changes to the CORS middleware to improve its f...

(MAKE_CHANGES)


[uncategorized] ~266-~266: Loose punctuation mark.
Context: ...updated fields: - Config.AllowOrigins: Now accepts a slice of strings, each re...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~267-~267: Loose punctuation mark.
Context: ... allowed origin. - Config.AllowMethods: Now accepts a slice of strings, each re...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~268-~268: Loose punctuation mark.
Context: ... allowed method. - Config.AllowHeaders: Now accepts a slice of strings, each re...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~269-~269: Loose punctuation mark.
Context: ...allowed header. - Config.ExposeHeaders: Now accepts a slice of strings, each re...

(UNLIKELY_OPENING_PUNCTUATION)

docs/api/ctx.md

[uncategorized] ~223-~223: Possible missing comma found.
Context: ...urns a pointer to the Bind struct which contains all the methods to bind ...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~225-~225: Possible missing comma found.
Context: ...he request/response data. For detailed information check the Bind documentati...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~257-~257: Possible missing article found.
Context: ...// []byte("user=john") }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~281-~281: Possible missing article found.
Context: ...// []byte("user=john") }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[style] ~341-~341: Consider a shorter alternative to avoid wordiness.
Context: ... information from a ClientHello message in order to guide application logic in the GetCerti...

(IN_ORDER_TO_PREMIUM)


[typographical] ~364-~364: Consider adding a comma here.
Context: ...text() *fasthttp.RequestCtx ``` :::info Please read the [Fasthttp Documentation](https...

(PLEASE_COMMA)


[uncategorized] ~423-~423: Possible missing article found.
Context: ...oe") // "doe" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~541-~541: Possible missing article found.
Context: ... if not exist // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~549-~549: Use a comma before “and” if it connects two independent clauses (unless they are closely connected and short).
Context: ...icate that the client cache is now stale and the full response should be sent. When...

(COMMA_COMPOUND_SENTENCE_2)


[uncategorized] ~581-~581: Possible missing article found.
Context: ...n") // "john" // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~596-~596: Possible missing article found.
Context: ...ers() map[string][]string ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~624-~624: Possible missing article found.
Context: ...n") // "john" // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~639-~639: Possible missing article found.
Context: ...ers() map[string][]string ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~692-~692: Possible missing article found.
Context: ..."google.com" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~717-~717: Possible missing article found.
Context: ..."google.com" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1129-~1129: Possible missing article found.
Context: ...q=something" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1182-~1182: Possible missing article found.
Context: ...first wildcard segment }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[grammar] ~1275-~1275: Did you mean “are” or “were”?
Context: ..." // ... }) ``` ## Queries Queries is a function that returns an object conta...

(SENT_START_NNS_IS)


[uncategorized] ~1362-~1362: Possible missing article found.
Context: ...") // "nike" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1430-~1430: Possible missing comma found.
Context: ...s the Redirect reference. For detailed information check the Redirect doc...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~1449-~1449: Did you mean: “By default,”?
Context: ... data and sends a text/html response. By default Render uses the default [**Go Templat...

(BY_DEFAULT_COMMA)


[style] ~1449-~1449: To make your writing clearer, consider a more direct alternative.
Context: ...want to use another View engine, please take a look at our [Template middleware](h...

(TAKE_A_LOOK)


[grammar] ~1457-~1457: Please check the verb form.
Context: ....string) error ``` ## Request Request return the [*fasthttp.Request](https://godoc....

(SHE_LIVE)


[style] ~1457-~1457: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...Request Request return the [*fasthttp.Request](https://godoc.org/github.com/valyala/f...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[grammar] ~1472-~1472: Please check the verb form.
Context: ...te("GET") }) ``` ## Response Response return the [*fasthttp.Response](https://godoc...

(SHE_LIVE)


[style] ~1472-~1472: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...sponse Response return the [*fasthttp.Response](https://godoc.org/github.com/valyala/f...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~1494-~1494: This phrase is redundant. Consider using “outside”.
Context: ...x *fasthttp.RequestCtx) ``` It is used outside of the Fiber Handlers to reset the context...

(OUTSIDE_OF)


[uncategorized] ~1498-~1498: There should be no space here.
Context: ...y be helpful after overriding the path, i. e. an internal redirect. Note that handler...

(EG_SPACE)


[uncategorized] ~1585-~1585: Possible missing article found.
Context: ...n err } }) ``` ## SaveFileToStorage Method is used to save any multipart file ...

(AI_HYDRA_LEO_MISSING_THE)


[typographical] ~1623-~1623: Consider adding a comma here.
Context: ...http or https for TLS requests. :::info Please use [Config.EnableTrustedProxyCheck](...

(PLEASE_COMMA)


[uncategorized] ~1753-~1753: Possible missing comma found.
Context: ...fo If the file contains an url specific character you have to escape it before passing th...

(AI_HYDRA_LEO_MISSING_COMMA)

Markdownlint
docs/whats_new.md

49-49: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


50-50: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


51-51: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


52-52: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


53-53: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


54-54: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


55-55: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


59-59: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


60-60: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


61-61: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


65-65: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


66-66: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


67-67: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


68-68: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


69-69: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


73-73: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


74-74: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


75-75: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


192-192: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


193-193: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


194-194: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


195-195: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


196-196: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


197-197: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


198-198: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


199-199: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


200-200: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


201-201: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


205-205: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


206-206: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


207-207: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


208-208: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


209-209: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


210-210: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


211-211: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


212-212: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


213-213: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


214-214: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


215-215: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


219-219: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


220-220: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


221-221: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


222-222: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


230-230: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


283-283: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


189-189: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


243-243: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


304-304: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


260-260: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


263-263: Expected: 1; Actual: 0; Below
Headings should be surrounded by blank lines

(MD022, blanks-around-headings)


143-143: null
Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


171-171: null
Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)


23-23: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)


261-261: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)

docs/api/ctx.md

983-983: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1005-1005: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1189-1189: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1190-1190: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1368-1368: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1369-1369: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1392-1392: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1393-1393: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1394-1394: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1285-1285: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1286-1286: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1287-1287: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1288-1288: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1289-1289: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1297-1297: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1298-1298: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1299-1299: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1307-1307: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1308-1308: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1309-1309: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1310-1310: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1318-1318: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1319-1319: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1320-1320: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1328-1328: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1329-1329: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1330-1330: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1331-1331: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1332-1332: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1333-1333: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1732-1732: Column: 1
Hard tabs

(MD010, no-hard-tabs)


168-168: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1188-1188: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1216-1216: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1446-1446: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1209-1209: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)


1398-1398: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)

GitHub Check: codecov/patch
ctx.go

[warning] 129-129: ctx.go#L129
Added line #L129 was not covered by tests


[warning] 133-133: ctx.go#L133
Added line #L133 was not covered by tests


[warning] 141-141: ctx.go#L141
Added line #L141 was not covered by tests


[warning] 145-145: ctx.go#L145
Added line #L145 was not covered by tests

Additional comments not posted (2)
docs/whats_new.md (2)

222-222: Documentation of SendFile Enhancements

The explanation of the new SendFile functionality aligns well with the PR's objectives and the code changes. It's clear and provides the necessary details about the new configuration options.

Tools
Markdownlint

222-222: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


Line range hint 143-171: Router Interface Changes Documentation

The documentation clearly outlines the changes to the router interface, including the method signature changes and the new routing options. The use of diffs and examples helps in understanding the changes effectively.

Tools
Markdownlint

219-219: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


220-220: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


221-221: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)


222-222: Expected: dash; Actual: asterisk
Unordered list style

(MD004, ul-style)

ctx.go Show resolved Hide resolved
docs/api/ctx.md Outdated Show resolved Hide resolved
@efectn efectn force-pushed the sendfile-refactor branch from 85637f6 to b3673a0 Compare June 27, 2024 12:51
@efectn efectn requested review from ReneWerner87 and gaby June 27, 2024 12:53
ctx_test.go Outdated Show resolved Hide resolved
docs/api/ctx.md Outdated Show resolved Hide resolved
app.go Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between fa20ed8 and 4743fde.

Files selected for processing (2)
  • app.go (2 hunks)
  • docs/api/ctx.md (2 hunks)
Additional context used
LanguageTool
docs/api/ctx.md

[uncategorized] ~223-~223: Possible missing comma found.
Context: ...urns a pointer to the Bind struct which contains all the methods to bind ...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~225-~225: Possible missing comma found.
Context: ...he request/response data. For detailed information check the Bind documentati...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~257-~257: Possible missing article found.
Context: ...// []byte("user=john") }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~281-~281: Possible missing article found.
Context: ...// []byte("user=john") }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[style] ~341-~341: Consider a shorter alternative to avoid wordiness.
Context: ... information from a ClientHello message in order to guide application logic in the GetCerti...

(IN_ORDER_TO_PREMIUM)


[typographical] ~364-~364: Consider adding a comma here.
Context: ...text() *fasthttp.RequestCtx ``` :::info Please read the [Fasthttp Documentation](https...

(PLEASE_COMMA)


[uncategorized] ~423-~423: Possible missing article found.
Context: ...oe") // "doe" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~541-~541: Possible missing article found.
Context: ... if not exist // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~549-~549: Use a comma before “and” if it connects two independent clauses (unless they are closely connected and short).
Context: ...icate that the client cache is now stale and the full response should be sent. When...

(COMMA_COMPOUND_SENTENCE_2)


[uncategorized] ~581-~581: Possible missing article found.
Context: ...n") // "john" // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~596-~596: Possible missing article found.
Context: ...ers() map[string][]string ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~624-~624: Possible missing article found.
Context: ...n") // "john" // .. }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~639-~639: Possible missing article found.
Context: ...ers() map[string][]string ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~692-~692: Possible missing article found.
Context: ..."google.com" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~717-~717: Possible missing article found.
Context: ..."google.com" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1129-~1129: Possible missing article found.
Context: ...q=something" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1182-~1182: Possible missing article found.
Context: ...first wildcard segment }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[grammar] ~1275-~1275: Did you mean “are” or “were”?
Context: ..." // ... }) ``` ## Queries Queries is a function that returns an object conta...

(SENT_START_NNS_IS)


[uncategorized] ~1362-~1362: Possible missing article found.
Context: ...") // "nike" // ... }) ``` :::info Returned value is only valid within the handler....

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1430-~1430: Possible missing comma found.
Context: ...s the Redirect reference. For detailed information check the Redirect doc...

(AI_HYDRA_LEO_MISSING_COMMA)


[uncategorized] ~1449-~1449: Did you mean: “By default,”?
Context: ... data and sends a text/html response. By default Render uses the default [**Go Templat...

(BY_DEFAULT_COMMA)


[style] ~1449-~1449: To make your writing clearer, consider a more direct alternative.
Context: ...want to use another View engine, please take a look at our [Template middleware](h...

(TAKE_A_LOOK)


[grammar] ~1457-~1457: Please check the verb form.
Context: ....string) error ``` ## Request Request return the [*fasthttp.Request](https://godoc....

(SHE_LIVE)


[style] ~1457-~1457: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...Request Request return the [*fasthttp.Request](https://godoc.org/github.com/valyala/f...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[grammar] ~1472-~1472: Please check the verb form.
Context: ...te("GET") }) ``` ## Response Response return the [*fasthttp.Response](https://godoc...

(SHE_LIVE)


[style] ~1472-~1472: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...sponse Response return the [*fasthttp.Response](https://godoc.org/github.com/valyala/f...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~1494-~1494: This phrase is redundant. Consider using “outside”.
Context: ...x *fasthttp.RequestCtx) ``` It is used outside of the Fiber Handlers to reset the context...

(OUTSIDE_OF)


[uncategorized] ~1498-~1498: There should be no space here.
Context: ...y be helpful after overriding the path, i. e. an internal redirect. Note that handler...

(EG_SPACE)


[uncategorized] ~1552-~1552: Possible missing article found.
Context: ... return err } } ``` ## SaveFile Method is used to save any multipart file ...

(AI_HYDRA_LEO_MISSING_THE)


[uncategorized] ~1585-~1585: Possible missing article found.
Context: ...n err } }) ``` ## SaveFileToStorage Method is used to save any multipart file ...

(AI_HYDRA_LEO_MISSING_THE)


[typographical] ~1623-~1623: Consider adding a comma here.
Context: ...http or https for TLS requests. :::info Please use [Config.EnableTrustedProxyCheck](...

(PLEASE_COMMA)


[uncategorized] ~1749-~1749: Possible missing comma found.
Context: ...fo If the file contains an url specific character you have to escape it before passing th...

(AI_HYDRA_LEO_MISSING_COMMA)

Markdownlint
docs/api/ctx.md

983-983: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1005-1005: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1189-1189: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1190-1190: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1368-1368: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1369-1369: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1392-1392: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1393-1393: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1394-1394: Expected: 0 or 2; Actual: 1
Trailing spaces

(MD009, no-trailing-spaces)


1285-1285: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1286-1286: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1287-1287: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1288-1288: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1289-1289: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1297-1297: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1298-1298: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1299-1299: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1307-1307: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1308-1308: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1309-1309: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1310-1310: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1318-1318: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1319-1319: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1320-1320: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1328-1328: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1329-1329: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1330-1330: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1331-1331: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1332-1332: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1333-1333: Column: 1
Hard tabs

(MD010, no-hard-tabs)


1728-1728: Column: 1
Hard tabs

(MD010, no-hard-tabs)


168-168: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1188-1188: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1216-1216: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1446-1446: Expected: 1; Actual: 2
Multiple consecutive blank lines

(MD012, no-multiple-blanks)


1209-1209: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)


1398-1398: null
Lists should be surrounded by blank lines

(MD032, blanks-around-lists)

Additional comments not posted (2)
app.go (1)

128-129: Comment for sendfilesMutex field still needed.

The sendfilesMutex is used to synchronize access to the sendfiles configurations. It's important to explain its usage through a comment for clarity and maintainability.

+	// sendfilesMutex is a mutex used to synchronize access to the sendfiles configurations.
	sendfilesMutex sync.RWMutex

Likely invalid or redundant comment.

docs/api/ctx.md (1)

1694-1730: Documentation of the SendFile struct looks comprehensive and clear.

The struct is well-documented with clear comments on each field, explaining their purpose and default values. This should provide good guidance for users on how to use the new configuration options effectively.

Tools
Markdownlint

1728-1728: Column: 1
Hard tabs

(MD010, no-hard-tabs)

Comment on lines +126 to +127
// sendfiles stores configurations for handling ctx.SendFile operations
sendfiles []*sendFileStore
Copy link
Contributor

@coderabbitai coderabbitai bot Jun 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Documentation for sendfiles field still needed.

The sendfiles field lacks documentation. Proper documentation is crucial for maintainability and understanding the purpose of the field, especially for public or exported fields.

+	// sendfiles stores configurations for handling ctx.SendFile operations.
	sendfiles []*sendFileStore
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// sendfiles stores configurations for handling ctx.SendFile operations
sendfiles []*sendFileStore
// sendfiles stores configurations for handling ctx.SendFile operations.
sendfiles []*sendFileStore

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's available above the ctx.SendFile method

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After reviewing the provided content of app.go, it appears that there isn't a direct reference to the sendfiles field in the vicinity of the ctx.SendFile method. It's possible there might be some confusion or miscommunication regarding the location of the documentation. Could you please double-check or clarify where the documentation for the sendfiles field is located? If it's in a different part of the file or in another file, I can assist in locating and reviewing it.

docs/api/ctx.md Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 4743fde and be7f0b1.

Files selected for processing (1)
  • ctx_test.go (4 hunks)
Additional context used
golangci-lint
ctx_test.go

3065-3065: Test_Ctx_SendFile_Compress_CheckCompressed's subtests should call t.Parallel

(tparallel)

GitHub Check: lint
ctx_test.go

[failure] 3065-3065:
Test_Ctx_SendFile_Compress_CheckCompressed's subtests should call t.Parallel (tparallel)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between be7f0b1 and b5bcd0c.

Files selected for processing (1)
  • ctx_test.go (4 hunks)
Additional context used
golangci-lint
ctx_test.go

3065-3065: Test_Ctx_SendFile_Compress_CheckCompressed should use t.Cleanup instead of defer

(tparallel)

GitHub Check: lint
ctx_test.go

[failure] 3065-3065:
Test_Ctx_SendFile_Compress_CheckCompressed should use t.Cleanup instead of defer (tparallel)

ctx_test.go Show resolved Hide resolved
if len(compress) == 0 || !compress[0] {

// Delete the Accept-Encoding header if compression is disabled
if !cfg.Compress {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know this is very old line of code, but why are we removing the header?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldnt fasthttp itself be checling the header and not serving compressed content if Compress is disabled in fasthttp.FS ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure but fasthttp also seems to add it to servceuncompressed strAcceptEncodinghttps://github.com/valyala/fasthttp/blob/c7576cc10cabfc9c993317a2d3f8355497bea156/fs.go#L55

Copy link
Member

@gaby gaby left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall LGTM, just the tests are too verbose. We should use the fasthttp AppendBytes functions for compressing data during these, that will reduce boilerplate on our side.

ctx_test.go Outdated Show resolved Hide resolved
ctx_test.go Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between b5bcd0c and 129b89d.

Files selected for processing (1)
  • ctx_test.go (3 hunks)
Files skipped from review as they are similar to previous changes (1)
  • ctx_test.go

Copy link
Member

@gaby gaby left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ReneWerner87 ReneWerner87 merged commit 21ede59 into main Jun 30, 2024
15 checks passed
@gaby gaby deleted the sendfile-refactor branch June 30, 2024 19:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

📝 [Proposal]: Allow disabling cache for ctx.SendFile()
3 participants