├── .gitattributes ├── .github ├── renovate.json └── workflows │ ├── ci-build.yml │ ├── lock.yml │ └── release.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Images └── main.png ├── LICENSE ├── README.md ├── src ├── Directory.build.props ├── Directory.build.targets ├── Fusillade.Tests │ ├── API │ │ ├── ApiApprovalTests.FusilladeTests.DotNet6_0.verified.txt │ │ ├── ApiApprovalTests.FusilladeTests.DotNet7_0.verified.txt │ │ ├── ApiApprovalTests.FusilladeTests.DotNet8_0.verified.txt │ │ ├── ApiApprovalTests.FusilladeTests.Net4_7.verified.txt │ │ ├── ApiApprovalTests.cs │ │ └── ApiExtensions.cs │ ├── Fusillade.Tests.csproj │ ├── Http │ │ ├── BaseHttpSchedulerSharedTests.cs │ │ ├── HttpSchedulerCachingTests.cs │ │ ├── HttpSchedulerSharedTests.cs │ │ ├── TestHttpMessageHandler.cs │ │ └── fixtures │ │ │ └── ResponseWithETag │ ├── IntegrationTestHelper.cs │ └── NetCacheTests.cs ├── Fusillade.sln ├── Fusillade │ ├── ConcatenateMixin.cs │ ├── Fusillade.csproj │ ├── IRequestCache.cs │ ├── InflightRequest.cs │ ├── LimitingHttpMessageHandler.cs │ ├── NetCache.cs │ ├── OfflineHttpMessageHandler.cs │ ├── Priority.cs │ └── RateLimitedHttpMessageHandler.cs ├── analyzers.ruleset └── stylecop.json └── version.json /.gitattributes: -------------------------------------------------------------------------------- 1 | # Catch all for anything we forgot. Add rules if you get CRLF to LF warnings. 2 | * text=auto 3 | 4 | # Text files that should be normalized to LF in odb. 5 | *.cs text eol=lf diff=csharp 6 | *.xaml text 7 | *.config text 8 | *.c text 9 | *.h text 10 | *.cpp text 11 | *.hpp text 12 | 13 | *.sln text 14 | *.csproj text 15 | *.vcxproj text 16 | 17 | *.md text 18 | *.tt text 19 | *.sh text 20 | *.ps1 text 21 | *.cmd text 22 | *.bat text 23 | *.markdown text 24 | *.msbuild text 25 | 26 | 27 | # Binary files that should not be normalized or diffed 28 | *.png binary 29 | *.jpg binary 30 | *.gif binary 31 | *.ico binary 32 | *.rc binary 33 | 34 | *.pfx binary 35 | *.snk binary 36 | *.dll binary 37 | *.exe binary 38 | *.lib binary 39 | *.exp binary 40 | *.pdb binary 41 | *.sdf binary 42 | *.7z binary 43 | 44 | # Generated file should just use CRLF, it's fiiine 45 | SolutionInfo.cs text eol=crlf diff=csharp 46 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["local>reactiveui/.github:renovate"] 4 | } -------------------------------------------------------------------------------- /.github/workflows/ci-build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | env: 10 | productNamespacePrefix: "Fusillade" 11 | 12 | jobs: 13 | build: 14 | uses: reactiveui/actions-common/.github/workflows/workflow-common-setup-and-build.yml@main 15 | with: 16 | configuration: Release 17 | productNamespacePrefix: "Fusilade" 18 | installWorkflows: false 19 | -------------------------------------------------------------------------------- /.github/workflows/lock.yml: -------------------------------------------------------------------------------- 1 | name: 'Lock Threads' 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | workflow_dispatch: 7 | 8 | permissions: 9 | issues: write 10 | pull-requests: write 11 | 12 | concurrency: 13 | group: lock 14 | 15 | jobs: 16 | action: 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: dessant/lock-threads@v5 20 | with: 21 | github-token: ${{ github.token }} 22 | issue-inactive-days: '14' 23 | pr-inactive-days: '14' 24 | issue-comment: > 25 | This issue has been automatically locked since there 26 | has not been any recent activity after it was closed. 27 | Please open a new issue for related bugs. 28 | pr-comment: > 29 | This pull request has been automatically locked since there 30 | has not been any recent activity after it was closed. 31 | Please open a new issue for related bugs. -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | 7 | jobs: 8 | release: 9 | uses: reactiveui/actions-common/.github/workflows/workflow-common-release.yml@main 10 | with: 11 | configuration: Release 12 | productNamespacePrefix: "Fusillade" 13 | installWorkflows: false 14 | secrets: 15 | SIGN_CLIENT_USER_ID: ${{ secrets.SIGN_CLIENT_USER_ID }} 16 | SIGN_CLIENT_SECRET: ${{ secrets.SIGN_CLIENT_SECRET }} 17 | SIGN_CLIENT_CONFIG: ${{ secrets.SIGN_CLIENT_CONFIG }} 18 | NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | *.lock.json 45 | artifacts/ 46 | *.nuget.props 47 | *.nuget.targets 48 | 49 | *_i.c 50 | *_p.c 51 | *_i.h 52 | *.ilk 53 | *.meta 54 | *.obj 55 | *.pch 56 | *.pdb 57 | *.pgc 58 | *.pgd 59 | *.rsp 60 | *.sbr 61 | *.tlb 62 | *.tli 63 | *.tlh 64 | *.tmp 65 | *.tmp_proj 66 | *.log 67 | *.vspscc 68 | *.vssscc 69 | .builds 70 | *.pidb 71 | *.svclog 72 | *.scc 73 | 74 | # Chutzpah Test files 75 | _Chutzpah* 76 | 77 | # Visual C++ cache files 78 | ipch/ 79 | *.aps 80 | *.ncb 81 | *.opendb 82 | *.opensdf 83 | *.sdf 84 | *.cachefile 85 | 86 | # Visual Studio profiler 87 | *.psess 88 | *.vsp 89 | *.vspx 90 | *.sap 91 | 92 | # TFS 2012 Local Workspace 93 | $tf/ 94 | 95 | # Guidance Automation Toolkit 96 | *.gpState 97 | 98 | # ReSharper is a .NET coding add-in 99 | _ReSharper*/ 100 | *.[Rr]e[Ss]harper 101 | *.DotSettings.user 102 | 103 | # JustCode is a .NET coding add-in 104 | .JustCode 105 | 106 | # TeamCity is a build add-in 107 | _TeamCity* 108 | 109 | # DotCover is a Code Coverage Tool 110 | *.dotCover 111 | 112 | # NCrunch 113 | _NCrunch_* 114 | .*crunch*.local.xml 115 | nCrunchTemp_* 116 | 117 | # MightyMoose 118 | *.mm.* 119 | AutoTest.Net/ 120 | 121 | # Web workbench (sass) 122 | .sass-cache/ 123 | 124 | # Installshield output folder 125 | [Ee]xpress/ 126 | 127 | # DocProject is a documentation generator add-in 128 | DocProject/buildhelp/ 129 | DocProject/Help/*.HxT 130 | DocProject/Help/*.HxC 131 | DocProject/Help/*.hhc 132 | DocProject/Help/*.hhk 133 | DocProject/Help/*.hhp 134 | DocProject/Help/Html2 135 | DocProject/Help/html 136 | 137 | # Click-Once directory 138 | publish/ 139 | 140 | # Publish Web Output 141 | *.[Pp]ublish.xml 142 | *.azurePubxml 143 | # TODO: Comment the next line if you want to checkin your web deploy settings 144 | # but database connection strings (with potential passwords) will be unencrypted 145 | *.pubxml 146 | *.publishproj 147 | 148 | # NuGet Packages 149 | *.nupkg 150 | # The packages folder can be ignored because of Package Restore 151 | **/packages/* 152 | # except build/, which is used as an MSBuild target. 153 | !**/packages/build/ 154 | # Uncomment if necessary however generally it will be regenerated when needed 155 | #!**/packages/repositories.config 156 | 157 | # Windows Azure Build Output 158 | csx/ 159 | *.build.csdef 160 | 161 | # Windows Azure Emulator 162 | ecf/ 163 | rcf/ 164 | 165 | # Windows Store app package directory 166 | AppPackages/ 167 | BundleArtifacts/ 168 | 169 | # Visual Studio cache files 170 | # files ending in .cache can be ignored 171 | *.[Cc]ache 172 | # but keep track of directories ending in .cache 173 | !*.[Cc]ache/ 174 | 175 | # Others 176 | ClientBin/ 177 | ~$* 178 | *~ 179 | *.dbmdl 180 | *.dbproj.schemaview 181 | *.pfx 182 | *.publishsettings 183 | node_modules/ 184 | orleans.codegen.cs 185 | 186 | # RIA/Silverlight projects 187 | Generated_Code/ 188 | 189 | # Backup & report files from converting an old project file 190 | # to a newer Visual Studio version. Backup files are not needed, 191 | # because we have git ;-) 192 | _UpgradeReport_Files/ 193 | Backup*/ 194 | UpgradeLog*.XML 195 | UpgradeLog*.htm 196 | 197 | # SQL Server files 198 | *.mdf 199 | *.ldf 200 | 201 | # Business Intelligence projects 202 | *.rdl.data 203 | *.bim.layout 204 | *.bim_*.settings 205 | 206 | # Microsoft Fakes 207 | FakesAssemblies/ 208 | 209 | # GhostDoc plugin setting file 210 | *.GhostDoc.xml 211 | 212 | # Node.js Tools for Visual Studio 213 | .ntvs_analysis.dat 214 | 215 | # Visual Studio 6 build log 216 | *.plg 217 | 218 | # Visual Studio 6 workspace options file 219 | *.opt 220 | 221 | # Visual Studio LightSwitch build output 222 | **/*.HTMLClient/GeneratedArtifacts 223 | **/*.DesktopClient/GeneratedArtifacts 224 | **/*.DesktopClient/ModelManifest.xml 225 | **/*.Server/GeneratedArtifacts 226 | **/*.Server/ModelManifest.xml 227 | _Pvt_Extensions 228 | 229 | # Paket dependency manager 230 | .paket/paket.exe 231 | 232 | # FAKE - F# Make 233 | .fake/ 234 | 235 | # Tools 236 | tools/ 237 | 238 | # ReactiveUI 239 | artifacts/ 240 | src/CommonAssemblyInfo.cs 241 | src/ReactiveUI.Events/Events_*.cs 242 | src/Fusillade.Tests/API/ApiApprovalTests.*.received.txt 243 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Code of Conduct 2 | 3 | As contributors and maintainers of this project, and in the interest of 4 | fostering an open and welcoming community, we pledge to respect all people who 5 | contribute through reporting issues, posting feature requests, updating 6 | documentation, submitting pull requests or patches, and other activities. 7 | 8 | We are committed to making participation in this project a harassment-free 9 | experience for everyone, regardless of level of experience, gender, gender 10 | identity and expression, sexual orientation, disability, personal appearance, 11 | body size, race, ethnicity, age, religion, or nationality. 12 | 13 | Examples of unacceptable behavior by participants include: 14 | 15 | * The use of sexualized language or imagery 16 | * Personal attacks 17 | * Trolling or insulting/derogatory comments 18 | * Public or private harassment 19 | * Publishing other's private information, such as physical or electronic 20 | addresses, without explicit permission 21 | * Other unethical or unprofessional conduct 22 | 23 | Project maintainers have the right and responsibility to remove, edit, or 24 | reject comments, commits, code, wiki edits, issues, and other contributions 25 | that are not aligned to this Code of Conduct, or to ban temporarily or 26 | permanently any contributor for other behaviors that they deem inappropriate, 27 | threatening, offensive, or harmful. 28 | 29 | By adopting this Code of Conduct, project maintainers commit themselves to 30 | fairly and consistently applying these principles to every aspect of managing 31 | this project. Project maintainers who do not follow or enforce the Code of 32 | Conduct may be permanently removed from the project team. 33 | 34 | This Code of Conduct applies both within project spaces and in public spaces 35 | when an individual is representing the project or its community. 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 38 | reported by contacting a project maintainer at anais@anaisbetts.org. All 39 | complaints will be reviewed and investigated and will result in a response that 40 | is deemed necessary and appropriate to the circumstances. Maintainers are 41 | obligated to maintain confidentiality with regard to the reporter of an 42 | incident. 43 | 44 | 45 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 46 | version 1.3.0, available at 47 | [http://contributor-covenant.org/version/1/3/0/][version] 48 | 49 | [homepage]: http://contributor-covenant.org 50 | [version]: http://contributor-covenant.org/version/1/3/0/ 51 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Fusillade 2 | 3 | We'd love for you to contribute to our source code and to make Fusillade even better than it is 4 | today! Here are the guidelines we'd like you to follow: 5 | 6 | - [Code of Conduct](#coc) 7 | - [Question or Problem?](#question) 8 | - [Issues and Bugs](#issue) 9 | - [Feature Requests](#feature) 10 | - [Submission Guidelines](#submit) 11 | - [Coding Rules](#rules) 12 | - [Commit Message Guidelines](#commit) 13 | 14 | ## Code of Conduct 15 | 16 | Help us keep the project open and inclusive. Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md). 17 | 18 | ## Got a Question or Problem? 19 | 20 | 21 | ## Found an Issue? 22 | 23 | If you find a bug in the source code or a mistake in the documentation, you can help us by 24 | submitting an issue to our [GitHub Repository](https://github.com/reactiveui/Fusillade). Even better you can submit a Pull Request 25 | with a fix. 26 | 27 | **Please see the [Submission Guidelines](#submit) below.** 28 | 29 | ## Want a Feature? 30 | 31 | You can request a new feature by submitting an issue to our [GitHub Repository](https://github.com/paulcbetts/Fusillade). If you 32 | would like to implement a new feature then consider what kind of change it is: 33 | 34 | prevent duplication of work, and help you to craft the change so that it is successfully accepted 35 | into the project. 36 | * **Small Changes** can be crafted and submitted to the [GitHub Repository](https://github.com/reactiveui/Fusillade) as a Pull 37 | Request. 38 | 39 | ## Submission Guidelines 40 | 41 | ### Submitting an Issue 42 | 43 | If your issue appears to be a bug, and hasn't been reported, open a new issue. Help us to maximize 44 | the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. 45 | 46 | Providing the following information will increase the chances of your issue being dealt with 47 | quickly: 48 | 49 | * **Overview of the Issue** - if an error is being thrown a stack trace helps 50 | * **Motivation for or Use Case** - explain why this is a bug for you 51 | * **Fusillade Version(s)** - is it a regression? 52 | * **Operating System** - is this a problem with all browsers or only specific ones? 53 | * **Reproduce the Error** - provide a example or an unambiguous set of steps. 54 | * **Related Issues** - has a similar issue been reported before? 55 | * **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be 56 | causing the problem (line of code or commit) 57 | 58 | **If you get help, help others. Good karma rulez!** 59 | 60 | ### Submitting a Pull Request 61 | Before you submit your pull request consider the following guidelines: 62 | 63 | * Search [GitHub](https://github.com/reactiveui/Fusillade/pulls) for an open or closed Pull Request 64 | that relates to your submission. You don't want to duplicate effort. 65 | * Make your changes in a new git branch: 66 | 67 | ```shell 68 | git checkout -b my-fix-branch master 69 | ``` 70 | 71 | * Create your patch, **including appropriate test cases**. 72 | * Follow our [Coding Rules](#rules). 73 | * Run the test suite, as described below. 74 | * Commit your changes using a descriptive commit message that follows our 75 | [commit message conventions](#commit). 76 | 77 | ```shell 78 | git commit -a 79 | ``` 80 | Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files. 81 | 82 | * Build your changes locally to ensure all the tests pass: 83 | 84 | ```shell 85 | build.cmd 86 | ``` 87 | 88 | * Push your branch to GitHub: 89 | 90 | ```shell 91 | git push origin my-fix-branch 92 | ``` 93 | 94 | In GitHub, send a pull request to `Fusillade:master`. 95 | 96 | If we suggest changes, then: 97 | 98 | * Make the required updates. 99 | * Re-run the test suite to ensure tests are still passing. 100 | * Commit your changes to your branch (e.g. `my-fix-branch`). 101 | * Push the changes to your GitHub repository (this will update your Pull Request). 102 | 103 | If the PR gets too outdated we may ask you to rebase and force push to update the PR: 104 | 105 | ```shell 106 | git rebase master -i 107 | git push origin my-fix-branch -f 108 | ``` 109 | 110 | _WARNING: Squashing or reverting commits and force-pushing thereafter may remove GitHub comments 111 | on code that were previously made by you or others in your commits. Avoid any form of rebasing 112 | unless necessary._ 113 | 114 | That's it! Thank you for your contribution! 115 | 116 | #### After your pull request is merged 117 | 118 | After your pull request is merged, you can safely delete your branch and pull the changes 119 | from the main (upstream) repository: 120 | 121 | * Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: 122 | 123 | ```shell 124 | git push origin --delete my-fix-branch 125 | ``` 126 | 127 | * Check out the master branch: 128 | 129 | ```shell 130 | git checkout master -f 131 | ``` 132 | 133 | * Delete the local branch: 134 | 135 | ```shell 136 | git branch -D my-fix-branch 137 | ``` 138 | 139 | * Update your master with the latest upstream version: 140 | 141 | ```shell 142 | git pull --ff upstream master 143 | ``` 144 | 145 | ## Coding Rules 146 | 147 | To ensure consistency throughout the source code, keep these rules in mind as you are working: 148 | 149 | * All features or bug fixes **must be tested** by one or more unit tests. 150 | * All public API methods **must be documented** with XML documentation. 151 | 152 | ## Git Commit Guidelines 153 | 154 | Each commit message consists of a **header**, a **body** and a **footer**. The header has a special 155 | format that includes a **type** and a **subject**: 156 | 157 | ``` 158 | : 159 | 160 | 161 |