├── .github └── workflows │ └── publish-kb.yml ├── .gitignore ├── .vscode └── settings.json ├── CODEOWNERS ├── LICENSE ├── README.md ├── _assetsApi ├── api │ └── index.md ├── docfx-tmpl │ └── src │ │ ├── partials │ │ ├── docsearch.tmpl.partial │ │ └── footer.tmpl.partial │ │ └── styles │ │ ├── docfx.js │ │ └── main.css └── filterConfig.yml ├── _config.yml ├── basic-usage ├── capture-https-traffic.md ├── configuration.md ├── import-export-sessions.md ├── register-as-system-proxy.md ├── session-flags.md └── use-custom-root-certificate.md ├── exclude.txt ├── favicon.ico ├── getting-started ├── download-product-files.md ├── first-steps.md ├── images │ ├── binaries-current-structure.png │ ├── binaries-references.png │ ├── binaries-structure.png │ ├── calendar-getting-started-update-packages.png │ ├── download_product_files_1.png │ ├── download_product_files_2.png │ ├── download_product_files_3.png │ ├── downloads │ │ ├── account-downloads-002.png │ │ ├── account-downloads-003.png │ │ └── account-downloads-005.png │ ├── getting-started-add-package-source.png │ ├── getting-started-add-packages-dialog.png │ ├── getting-started-add-packages-menu.png │ ├── getting-started-add-telerk-server.png │ ├── getting-started-configure-sources.png │ ├── getting-started-restore-packages.png │ ├── item-templates-stocks-view-android-5.7inch.png │ ├── legacy-binaries-references.png │ ├── legacy-binaries-structure.png │ ├── logo.png │ ├── nuget-keys-telerik-001.png │ ├── nuget-server │ │ ├── nuget-vs-add-packages.png │ │ ├── nuget-vs-add-source.png │ │ ├── nuget-vs-manage-packages.png │ │ ├── nuget-vs-pm-settings.png │ │ └── nuget-vs-telerik-server.png │ ├── registry-key.png │ ├── telerik-account-zip-download.png │ ├── telerik-ui-for-xamarin.png │ ├── telrik-project-wizard.png │ ├── visual-studio-created-solution.png │ ├── visual-studio-new-project-create.png │ ├── visual-studio-new-project-dialog.png │ ├── visual-studio-new-solution.png │ ├── visual-studio-new-solution_screen2.png │ ├── visual-studio-project-wizard.png │ ├── visual-studio-solution-projects.png │ ├── vs2015_xamarin_install.png │ ├── vs2017_xamarin_workload.png │ ├── vsmac_xamarin.png │ └── xamarin-studio-new-solution.png ├── nuget-sso.md ├── system-requirements.md └── telerik-nuget-server.md ├── images ├── anchor.png ├── api.png ├── arrow.png ├── caution-icon.png ├── close-btn.svg ├── close.png ├── column.png ├── datagrid_localization.png ├── datagrid_resourcemanager.png ├── datagrid_resourcesfile.png ├── external.png ├── file-white.png ├── file.png ├── folder-close.png ├── folder-open.png ├── getting-started.png ├── howdoi.png ├── icon-telerik-badge.png ├── important-icon.png ├── important.png ├── logo.png ├── menu.png ├── minus.png ├── nav-arrow.png ├── note-icon.png ├── note-types │ ├── notetypes-actualappearance.png │ └── notetypes-mddeclaration.PNG ├── open.png ├── plus.png ├── search-24.png ├── search.png ├── tap-logo.png ├── tip-icon.png └── tutorials.png ├── introduction.md ├── knowledge-base ├── modifying-response-with-fiddler-core.md └── persisting-the-root-certificate-in-fiddler-core.md ├── licensing ├── copyright.md ├── license-agreement.md └── personal-data-collection.md ├── release-history.md ├── to_delete.md └── web.config /.github/workflows/publish-kb.yml: -------------------------------------------------------------------------------- 1 | name: Publish Knowledge Base Article 2 | on: 3 | repository_dispatch: 4 | types: [publish-kb] 5 | 6 | run-name: Publish Knowledge Base Article ${{ github.event.client_payload.name }} ${{ github.event.client_payload.id }} 7 | 8 | permissions: 9 | contents: write 10 | pull-requests: write 11 | 12 | concurrency: 13 | group: '${{ github.workflow }} ${{ github.event.client_payload.id }}' 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | publish_kb: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: configure git 21 | run: | 22 | git config --global user.email "kb-bot@telerik.com" 23 | git config --global user.name "KB Bot" 24 | 25 | - name: Checkout 26 | uses: actions/checkout@v3 27 | 28 | - name: Create branch 29 | run: | 30 | git checkout -b "new-kb-$name-$id" 31 | cd $folder 32 | echo "$content" > "$name.md" 33 | git add "$name.md" 34 | git commit -m "Added new kb article $name" 35 | git push -u origin "new-kb-$name-$id" 36 | env: 37 | name: ${{ github.event.client_payload.name }} 38 | content: ${{ github.event.client_payload.content }} 39 | folder: ${{ github.event.client_payload.folder }} 40 | id: ${{ github.event.client_payload.id }} 41 | 42 | - name: Create pull request 43 | run: gh pr create --fill 44 | env: 45 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 46 | 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .bundle 3 | .dockerignore 4 | .editorconfig 5 | .jekyll-metadata 6 | .ruby-version 7 | .suo 8 | .vs 9 | /.asset-cache/ 10 | /LICENSE 11 | /_assets/ 12 | /_build/ 13 | /_buildApi/ 14 | /_common/root/ 15 | /_data/ 16 | /_includes/ 17 | /_layouts/ 18 | /_plugins/ 19 | /_site/ 20 | /_templates/ 21 | /_tools/ 22 | /docs-watcher/ 23 | /favicon.ico 24 | /fonts/ 25 | /styles/ 26 | Dockerfile 27 | Gemfile 28 | Gemfile.lock 29 | _site_SL 30 | _tempconfig.yml 31 | bs-config.js 32 | build-docs.sh 33 | copy_content.sh 34 | copy_local.sh 35 | install-npm.sh 36 | knowledge-base.html 37 | modify-config.sh 38 | robots.txt 39 | search.html 40 | start-docs-sl.sh 41 | start-docs.sh 42 | watch.sh -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "Prefs", 4 | "Strahl's", 5 | "certmaker", 6 | "fiddlercore", 7 | "strahl", 8 | "ticketid" 9 | ] 10 | } -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @telerik/docs-seed-reviewers 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright (c) 2015-2019 Progress Software Corporation 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | FiddlerCore Public Documentation

3 | 4 |

Welcome to the GitHub repo for FiddlerCore Documentation. This repository contains the source content--written in Markdown--that we use to power the FiddlerCore documentation. 5 | 6 |

We believe that the documentation for a product is at its best when the content is a collaboration between the builders and consumers of that product. As such, this documentation is both public, and open sourced. That means you can clone this repository, read the docs off line, or even load the entire thing to an Apple Newton, if that's your thing.

7 | 8 |

It also means that you can play a role in making our docs better for everyone, and if helping us make the FiddlerCore docs better sounds interesting to you, read on.

9 | 10 |

11 | Contributing

12 | 13 |

There are two ways you can contribute to the public FiddlerCore documentation: either create an issue in this repository, or fork the repo, make the change and send us a pull request!

14 | 15 |
24 |

Note: When creating issues, please don't modify the assignee or milestone fields. Also, please create one issue per fix or change. "Bundled" entries will be deleted.

25 |
26 | 27 | 59 | -------------------------------------------------------------------------------- /_assetsApi/api/index.md: -------------------------------------------------------------------------------- 1 | 84 | 85 | # Telerik FiddlerCore API Reference 86 | The API reference section of the documentation contains a list and descriptions of all public available classes, methods and properties of the Telerik FiddlerCore product. 87 | 88 | ## Namespaces 89 | 90 | | Namespaces | Description | 91 | | -----------| ----------- | 92 | | [Fiddler](/fiddler-core/api/fiddler) | In: *FiddlerCore.dll*
This namespace must be included to any FiddlerCore project. | 93 | | [Telerik.NetworkConnections](/fiddler-core/api/telerik.networkconnections) | In: *Telerik.NetworkConnections.dll* | 94 | | [Telerik.NetworkConnections.Windows](/fiddler-core/api/telerik.networkconnections.windows) | In: *Telerik.NetworkConnections.dll* | 95 | | [Telerik.NetworkConnections.Linux](/fiddler-core/api/telerik.networkconnections.linux) | In: *Telerik.NetworkConnections.dll* | 96 | | [Telerik.NetworkConnections.Mac](/fiddler-core/api/telerik.networkconnections.mac) | In: *Telerik.NetworkConnections.dll* | 97 | -------------------------------------------------------------------------------- /_assetsApi/docfx-tmpl/src/partials/docsearch.tmpl.partial: -------------------------------------------------------------------------------- 1 | 38 | -------------------------------------------------------------------------------- /_assetsApi/docfx-tmpl/src/partials/footer.tmpl.partial: -------------------------------------------------------------------------------- 1 |  96 | -------------------------------------------------------------------------------- /_assetsApi/docfx-tmpl/src/styles/docfx.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information. 2 | $(function () { 3 | var active = 'active'; 4 | var expanded = 'in'; 5 | var collapsed = 'collapsed'; 6 | var filtered = 'filtered'; 7 | var show = 'show'; 8 | var hide = 'hide'; 9 | var util = new utility(); 10 | 11 | workAroundFixedHeaderForAnchors(); 12 | highlight(); 13 | enableSearch(); 14 | 15 | renderTables(); 16 | renderAlerts(); 17 | renderLinks(); 18 | renderNavbar(); 19 | renderSidebar(true); 20 | renderAffix(); 21 | renderFooter(); 22 | renderLogo(); 23 | 24 | breakText(); 25 | renderTabs(); 26 | 27 | window.refresh = function (article) { 28 | // Update markup result 29 | if (typeof article == 'undefined' || typeof article.content == 'undefined') 30 | console.error("Null Argument"); 31 | $("article.content").html(article.content); 32 | 33 | highlight(); 34 | renderTables(); 35 | renderAlerts(); 36 | renderAffix(); 37 | renderTabs(); 38 | } 39 | 40 | // Add this event listener when needed 41 | // window.addEventListener('content-update', contentUpdate); 42 | 43 | function breakText() { 44 | $(".xref").addClass("text-break"); 45 | var texts = $(".text-break"); 46 | texts.each(function () { 47 | $(this).breakWord(); 48 | }); 49 | } 50 | 51 | // Styling for tables in conceptual documents using Bootstrap. 52 | // See http://getbootstrap.com/css/#tables 53 | function renderTables() { 54 | $('table').addClass('table table-bordered table-striped table-condensed').wrap('
'); 55 | } 56 | 57 | // Styling for alerts. 58 | function renderAlerts() { 59 | $('.NOTE, .TIP').addClass('alert alert-info'); 60 | $('.WARNING').addClass('alert alert-warning'); 61 | $('.IMPORTANT, .CAUTION').addClass('alert alert-danger'); 62 | } 63 | 64 | // Enable anchors for headings. 65 | (function () { 66 | anchors.options = { 67 | placement: 'left', 68 | visible: 'touch' 69 | }; 70 | anchors.add('article h2:not(.no-anchor), article h3:not(.no-anchor), article h4:not(.no-anchor)'); 71 | })(); 72 | 73 | // Open links to different host in a new window. 74 | function renderLinks() { 75 | if ($("meta[property='docfx:newtab']").attr("content") === "true") { 76 | $(document.links).filter(function () { 77 | return this.hostname !== window.location.hostname; 78 | }).attr('target', '_blank'); 79 | } 80 | } 81 | 82 | // Enable highlight.js 83 | function highlight() { 84 | $('pre code').each(function (i, block) { 85 | hljs.highlightBlock(block); 86 | }); 87 | $('pre code[highlight-lines]').each(function (i, block) { 88 | if (block.innerHTML === "") return; 89 | var lines = block.innerHTML.split('\n'); 90 | 91 | queryString = block.getAttribute('highlight-lines'); 92 | if (!queryString) return; 93 | 94 | var ranges = queryString.split(','); 95 | for (var j = 0, range; range = ranges[j++];) { 96 | var found = range.match(/^(\d+)\-(\d+)?$/); 97 | if (found) { 98 | // consider region as `{startlinenumber}-{endlinenumber}`, in which {endlinenumber} is optional 99 | var start = +found[1]; 100 | var end = +found[2]; 101 | if (isNaN(end) || end > lines.length) { 102 | end = lines.length; 103 | } 104 | } else { 105 | // consider region as a sigine line number 106 | if (isNaN(range)) continue; 107 | var start = +range; 108 | var end = start; 109 | } 110 | if (start <= 0 || end <= 0 || start > end || start > lines.length) { 111 | // skip current region if invalid 112 | continue; 113 | } 114 | lines[start - 1] = '' + lines[start - 1]; 115 | lines[end - 1] = lines[end - 1] + ''; 116 | } 117 | 118 | block.innerHTML = lines.join('\n'); 119 | }); 120 | } 121 | 122 | // Support full-text-search 123 | function enableSearch() { 124 | var query; 125 | var relHref = $("meta[property='docfx\\:rel']").attr("content"); 126 | if (typeof relHref === 'undefined') { 127 | return; 128 | } 129 | try { 130 | var worker = new Worker(relHref + 'styles/search-worker.js'); 131 | if (!worker && !window.worker) { 132 | localSearch(); 133 | } else { 134 | webWorkerSearch(); 135 | } 136 | 137 | renderSearchBox(); 138 | highlightKeywords(); 139 | addSearchEvent(); 140 | } catch (e) { 141 | console.error(e); 142 | } 143 | 144 | //Adjust the position of search box in navbar 145 | function renderSearchBox() { 146 | autoCollapse(); 147 | $(window).on('resize', autoCollapse); 148 | $(document).on('click', '.navbar-collapse.in', function (e) { 149 | if ($(e.target).is('a')) { 150 | $(this).collapse('hide'); 151 | } 152 | }); 153 | 154 | function autoCollapse() { 155 | var navbar = $('#autocollapse'); 156 | if (navbar.height() === null) { 157 | setTimeout(autoCollapse, 300); 158 | } 159 | navbar.removeClass(collapsed); 160 | if (navbar.height() > 60) { 161 | navbar.addClass(collapsed); 162 | } 163 | } 164 | } 165 | 166 | // Search factory 167 | function localSearch() { 168 | console.log("using local search"); 169 | var lunrIndex = lunr(function () { 170 | this.ref('href'); 171 | this.field('title', { boost: 50 }); 172 | this.field('keywords', { boost: 20 }); 173 | }); 174 | lunr.tokenizer.seperator = /[\s\-\.]+/; 175 | var searchData = {}; 176 | var searchDataRequest = new XMLHttpRequest(); 177 | 178 | var indexPath = relHref + "index.json"; 179 | if (indexPath) { 180 | searchDataRequest.open('GET', indexPath); 181 | searchDataRequest.onload = function () { 182 | if (this.status != 200) { 183 | return; 184 | } 185 | searchData = JSON.parse(this.responseText); 186 | for (var prop in searchData) { 187 | if (searchData.hasOwnProperty(prop)) { 188 | lunrIndex.add(searchData[prop]); 189 | } 190 | } 191 | } 192 | searchDataRequest.send(); 193 | } 194 | 195 | $("body").bind("queryReady", function () { 196 | var hits = lunrIndex.search(query); 197 | var results = []; 198 | hits.forEach(function (hit) { 199 | var item = searchData[hit.ref]; 200 | results.push({ 'href': item.href, 'title': item.title, 'keywords': item.keywords }); 201 | }); 202 | handleSearchResults(results); 203 | }); 204 | } 205 | 206 | function webWorkerSearch() { 207 | console.log("using Web Worker"); 208 | var indexReady = $.Deferred(); 209 | 210 | worker.onmessage = function (oEvent) { 211 | switch (oEvent.data.e) { 212 | case 'index-ready': 213 | indexReady.resolve(); 214 | break; 215 | case 'query-ready': 216 | var hits = oEvent.data.d; 217 | handleSearchResults(hits); 218 | break; 219 | } 220 | } 221 | 222 | indexReady.promise().done(function () { 223 | $("body").bind("queryReady", function () { 224 | worker.postMessage({ q: query }); 225 | }); 226 | if (query && (query.length >= 3)) { 227 | worker.postMessage({ q: query }); 228 | } 229 | }); 230 | } 231 | 232 | // Highlight the searching keywords 233 | function highlightKeywords() { 234 | var q = url('?q'); 235 | if (q !== null) { 236 | var keywords = q.split("%20"); 237 | keywords.forEach(function (keyword) { 238 | if (keyword !== "") { 239 | $('.data-searchable *').mark(keyword); 240 | $('article *').mark(keyword); 241 | } 242 | }); 243 | } 244 | } 245 | 246 | function addSearchEvent() { 247 | $('body').bind("searchEvent", function () { 248 | $('#search-query').keypress(function (e) { 249 | return e.which !== 13; 250 | }); 251 | 252 | $('#search-query').keyup(function () { 253 | query = $(this).val(); 254 | if (query.length < 3) { 255 | flipContents("show"); 256 | } else { 257 | flipContents("hide"); 258 | $("body").trigger("queryReady"); 259 | $('#search-results>.search-list').text('Search Results for "' + query + '"'); 260 | } 261 | }).off("keydown"); 262 | }); 263 | } 264 | 265 | function flipContents(action) { 266 | if (action === "show") { 267 | $('.hide-when-search').show(); 268 | $('#search-results').hide(); 269 | } else { 270 | $('.hide-when-search').hide(); 271 | $('#search-results').show(); 272 | } 273 | } 274 | 275 | function relativeUrlToAbsoluteUrl(currentUrl, relativeUrl) { 276 | var currentItems = currentUrl.split(/\/+/); 277 | var relativeItems = relativeUrl.split(/\/+/); 278 | var depth = currentItems.length - 1; 279 | var items = []; 280 | for (var i = 0; i < relativeItems.length; i++) { 281 | if (relativeItems[i] === '..') { 282 | depth--; 283 | } else if (relativeItems[i] !== '.') { 284 | items.push(relativeItems[i]); 285 | } 286 | } 287 | return currentItems.slice(0, depth).concat(items).join('/'); 288 | } 289 | 290 | function extractContentBrief(content) { 291 | var briefOffset = 512; 292 | var words = query.split(/\s+/g); 293 | var queryIndex = content.indexOf(words[0]); 294 | var briefContent; 295 | if (queryIndex > briefOffset) { 296 | return "..." + content.slice(queryIndex - briefOffset, queryIndex + briefOffset) + "..."; 297 | } else if (queryIndex <= briefOffset) { 298 | return content.slice(0, queryIndex + briefOffset) + "..."; 299 | } 300 | } 301 | 302 | function handleSearchResults(hits) { 303 | var numPerPage = 10; 304 | $('#pagination').empty(); 305 | $('#pagination').removeData("twbs-pagination"); 306 | if (hits.length === 0) { 307 | $('#search-results>.sr-items').html('

No results found

'); 308 | } else { 309 | $('#pagination').twbsPagination({ 310 | totalPages: Math.ceil(hits.length / numPerPage), 311 | visiblePages: 5, 312 | onPageClick: function (event, page) { 313 | var start = (page - 1) * numPerPage; 314 | var curHits = hits.slice(start, start + numPerPage); 315 | $('#search-results>.sr-items').empty().append( 316 | curHits.map(function (hit) { 317 | var currentUrl = window.location.href; 318 | var itemRawHref = relativeUrlToAbsoluteUrl(currentUrl, relHref + hit.href); 319 | var itemHref = relHref + hit.href + "?q=" + query; 320 | var itemTitle = hit.title; 321 | var itemBrief = extractContentBrief(hit.keywords); 322 | 323 | var itemNode = $('
').attr('class', 'sr-item'); 324 | var itemTitleNode = $('
').attr('class', 'item-title').append($('').attr('href', itemHref).attr("target", "_blank").text(itemTitle)); 325 | var itemHrefNode = $('
').attr('class', 'item-href').text(itemRawHref); 326 | var itemBriefNode = $('
').attr('class', 'item-brief').text(itemBrief); 327 | itemNode.append(itemTitleNode).append(itemHrefNode).append(itemBriefNode); 328 | return itemNode; 329 | }) 330 | ); 331 | query.split(/\s+/).forEach(function (word) { 332 | if (word !== '') { 333 | $('#search-results>.sr-items *').mark(word); 334 | } 335 | }); 336 | } 337 | }); 338 | } 339 | } 340 | }; 341 | 342 | // Update href in navbar 343 | function renderNavbar() { 344 | var navbar = $('#navbar ul')[0]; 345 | if (typeof (navbar) === 'undefined') { 346 | loadNavbar(); 347 | } else { 348 | $('#navbar ul a.active').parents('li').addClass(active); 349 | renderBreadcrumb(); 350 | } 351 | 352 | function loadNavbar() { 353 | var navbarPath = $("meta[property='docfx\\:navrel']").attr("content"); 354 | if (!navbarPath) { 355 | return; 356 | } 357 | navbarPath = navbarPath.replace(/\\/g, '/'); 358 | var tocPath = $("meta[property='docfx\\:tocrel']").attr("content") || ''; 359 | if (tocPath) tocPath = tocPath.replace(/\\/g, '/'); 360 | $.get(navbarPath, function (data) { 361 | $(data).find("#toc>ul").appendTo("#navbar"); 362 | if ($('#search-results').length !== 0) { 363 | $('#search').show(); 364 | $('body').trigger("searchEvent"); 365 | } 366 | var index = navbarPath.lastIndexOf('/'); 367 | var navrel = ''; 368 | if (index > -1) { 369 | navrel = navbarPath.substr(0, index + 1); 370 | } 371 | $('#navbar>ul').addClass('navbar-nav'); 372 | var currentAbsPath = util.getAbsolutePath(window.location.pathname); 373 | // set active item 374 | $('#navbar').find('a[href]').each(function (i, e) { 375 | var href = $(e).attr("href"); 376 | if (util.isRelativePath(href)) { 377 | href = navrel + href; 378 | $(e).attr("href", href); 379 | 380 | // TODO: currently only support one level navbar 381 | var isActive = false; 382 | var originalHref = e.name; 383 | if (originalHref) { 384 | originalHref = navrel + originalHref; 385 | if (util.getDirectory(util.getAbsolutePath(originalHref)) === util.getDirectory(util.getAbsolutePath(tocPath))) { 386 | isActive = true; 387 | } 388 | } else { 389 | if (util.getAbsolutePath(href) === currentAbsPath) { 390 | isActive = true; 391 | } 392 | } 393 | if (isActive) { 394 | $(e).addClass(active); 395 | } 396 | } 397 | }); 398 | renderNavbar(); 399 | }); 400 | } 401 | } 402 | 403 | function showLoading(elementSelector) { 404 | kendo.ui.progress($(elementSelector), true); 405 | } 406 | 407 | function hideLoading(elementSelector) { 408 | kendo.ui.progress($(elementSelector), false); 409 | } 410 | 411 | function renderSidebar(init) { 412 | if (init) { 413 | loadToc(); 414 | } else { 415 | registerTocEvents(); 416 | if ($('footer').is(':visible')) { 417 | $('.sidetoc').addClass('shiftup'); 418 | } 419 | 420 | // Scroll to active item 421 | var top = 0; 422 | $('#toc a.active').parents('li').each(function (i, e) { 423 | $(e).addClass(active).addClass(expanded); 424 | $(e).children('a').addClass(active); 425 | top += $(e).position().top; 426 | }) 427 | $('.sidetoc').scrollTop(top - 50); 428 | 429 | if ($('footer').is(':visible')) { 430 | $('.sidetoc').addClass('shiftup'); 431 | } 432 | 433 | renderBreadcrumb(); 434 | setSideNavPosition(); 435 | } 436 | 437 | function registerTocEvents() { 438 | $('.toc .nav > li > .expand-stub').click(function (e) { 439 | $(e.target).parent().toggleClass(expanded); 440 | }); 441 | $('.toc .nav > li > .expand-stub + a:not([href])').click(function (e) { 442 | $(e.target).parent().toggleClass(expanded); 443 | }); 444 | $('#toc_filter_input').on('input', function (e) { 445 | var val = this.value; 446 | if (val === '') { 447 | // Clear 'filtered' class 448 | $('#toc li').removeClass(filtered).removeClass(hide); 449 | return; 450 | } 451 | 452 | // Get leaf nodes 453 | $('#toc li>a').filter(function (i, e) { 454 | return $(e).siblings().length === 0 455 | }).each(function (i, anchor) { 456 | var text = $(anchor).attr('title'); 457 | var parent = $(anchor).parent(); 458 | var parentNodes = parent.parents('ul>li'); 459 | for (var i = 0; i < parentNodes.length; i++) { 460 | var parentText = $(parentNodes[i]).children('a').attr('title'); 461 | if (parentText) text = parentText + '.' + text; 462 | }; 463 | if (filterNavItem(text, val)) { 464 | parent.addClass(show); 465 | parent.removeClass(hide); 466 | } else { 467 | parent.addClass(hide); 468 | parent.removeClass(show); 469 | } 470 | }); 471 | $('#toc li>a').filter(function (i, e) { 472 | return $(e).siblings().length > 0 473 | }).each(function (i, anchor) { 474 | var parent = $(anchor).parent(); 475 | if (parent.find('li.show').length > 0) { 476 | parent.addClass(show); 477 | parent.addClass(filtered); 478 | parent.removeClass(hide); 479 | } else { 480 | parent.addClass(hide); 481 | parent.removeClass(show); 482 | parent.removeClass(filtered); 483 | } 484 | }) 485 | 486 | function filterNavItem(name, text) { 487 | if (!text) return true; 488 | if (name && name.toLowerCase().indexOf(text.toLowerCase()) > -1) return true; 489 | return false; 490 | } 491 | }); 492 | } 493 | 494 | function loadToc() { 495 | var tocPath = $("meta[property='docfx\\:tocrel']").attr("content"); 496 | if (!tocPath) { 497 | return; 498 | } 499 | tocPath = tocPath.replace(/\\/g, '/'); 500 | showLoading('.sidetoc'); 501 | $('#sidetoc').load(tocPath + " #sidetoggle > div", function () { 502 | var index = tocPath.lastIndexOf('/'); 503 | var tocrel = ''; 504 | if (index > -1) { 505 | tocrel = tocPath.substr(0, index + 1); 506 | } 507 | var currentHref = util.getAbsolutePath(window.location.pathname); 508 | $('#sidetoc').find('a[href]').each(function (i, e) { 509 | var href = $(e).attr("href"); 510 | if (util.isRelativePath(href)) { 511 | href = tocrel + href; 512 | $(e).attr("href", href); 513 | } 514 | 515 | if (util.getAbsolutePath(e.href).toLowerCase().split('.html')[0] === currentHref.toLowerCase().split('.html')[0]) { 516 | $(e).addClass(active); 517 | } 518 | 519 | $(e).breakWord(); 520 | }); 521 | 522 | $('#sidetoc .sidetoc').prepend(" Documentation") 523 | 524 | renderSidebar(); 525 | $('input#toc_filter_input').attr('placeholder', 'Filter'); 526 | $('#sidetoc .sidetoc').ready(function() { 527 | hideLoading(); 528 | }); 529 | }); 530 | } 531 | } 532 | 533 | function renderBreadcrumb() { 534 | var breadcrumb = []; 535 | $('#navbar a.active').each(function (i, e) { 536 | breadcrumb.push({ 537 | href: e.href, 538 | name: e.innerHTML 539 | }); 540 | }) 541 | $('#toc a.active').each(function (i, e) { 542 | breadcrumb.push({ 543 | href: e.href, 544 | name: e.innerHTML 545 | }); 546 | }) 547 | 548 | var html = util.formList(breadcrumb, 'breadcrumb'); 549 | $('#breadcrumb').html(html); 550 | } 551 | 552 | //Setup Affix 553 | function renderAffix() { 554 | var hierarchy = getHierarchy(); 555 | if (hierarchy && hierarchy.length > 0) { 556 | var html = '
In This Article
' 557 | html += util.formList(hierarchy, ['nav', 'bs-docs-sidenav']); 558 | $("#affix").empty().append(html); 559 | if ($('footer').is(':visible')) { 560 | $(".sideaffix").css("bottom", "70px"); 561 | } 562 | $('#affix a').click(function () { 563 | var scrollspy = $('[data-spy="scroll"]').data()['bs.scrollspy']; 564 | var target = e.target.hash; 565 | if (scrollspy && target) { 566 | scrollspy.activate(target); 567 | } 568 | }); 569 | } 570 | 571 | function getHierarchy() { 572 | // supported headers are h1, h2, h3 573 | var $headers = $($.map(['h1', 'h2', 'h3', 'h4'], function (h) { return ".article article " + h; }).join(", ")); 574 | 575 | // a stack of hierarchy items that are currently being built 576 | var stack = []; 577 | $headers.each(function (i, e) { 578 | if (!e.id) { 579 | return; 580 | } 581 | 582 | var item = { 583 | name: htmlEncode($(e).text()), 584 | href: "#" + e.id, 585 | items: [] 586 | }; 587 | 588 | if (!stack.length) { 589 | stack.push({ type: e.tagName, siblings: [item] }); 590 | return; 591 | } 592 | 593 | var frame = stack[stack.length - 1]; 594 | if (e.tagName === frame.type) { 595 | frame.siblings.push(item); 596 | } else if (e.tagName[1] > frame.type[1]) { 597 | // we are looking at a child of the last element of frame.siblings. 598 | // push a frame onto the stack. After we've finished building this item's children, 599 | // we'll attach it as a child of the last element 600 | stack.push({ type: e.tagName, siblings: [item] }); 601 | } else { // e.tagName[1] < frame.type[1] 602 | // we are looking at a sibling of an ancestor of the current item. 603 | // pop frames from the stack, building items as we go, until we reach the correct level at which to attach this item. 604 | while (e.tagName[1] < stack[stack.length - 1].type[1]) { 605 | buildParent(); 606 | } 607 | if (e.tagName === stack[stack.length - 1].type) { 608 | stack[stack.length - 1].siblings.push(item); 609 | } else { 610 | stack.push({ type: e.tagName, siblings: [item] }); 611 | } 612 | } 613 | }); 614 | while (stack.length > 1) { 615 | buildParent(); 616 | } 617 | 618 | function buildParent() { 619 | var childrenToAttach = stack.pop(); 620 | var parentFrame = stack[stack.length - 1]; 621 | var parent = parentFrame.siblings[parentFrame.siblings.length - 1]; 622 | $.each(childrenToAttach.siblings, function (i, child) { 623 | parent.items.push(child); 624 | }); 625 | } 626 | if (stack.length > 0) { 627 | 628 | var topLevel = stack.pop().siblings; 629 | if (topLevel.length === 1) { // if there's only one topmost header, dump it 630 | return topLevel[0].items; 631 | } 632 | return topLevel; 633 | } 634 | return undefined; 635 | } 636 | 637 | function htmlEncode(str) { 638 | if (!str) return str; 639 | return str 640 | .replace(/&/g, '&') 641 | .replace(/"/g, '"') 642 | .replace(/'/g, ''') 643 | .replace(//g, '>'); 645 | } 646 | 647 | function htmlDecode(value) { 648 | if (!str) return str; 649 | return value 650 | .replace(/"/g, '"') 651 | .replace(/'/g, "'") 652 | .replace(/</g, '<') 653 | .replace(/>/g, '>') 654 | .replace(/&/g, '&'); 655 | } 656 | 657 | function cssEscape(str) { 658 | // see: http://stackoverflow.com/questions/2786538/need-to-escape-a-special-character-in-a-jquery-selector-string#answer-2837646 659 | if (!str) return str; 660 | return str 661 | .replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g, "\\$&"); 662 | } 663 | } 664 | 665 | // Show footer 666 | function renderFooter() { 667 | initFooter(); 668 | $(window).on("scroll", showFooterCore); 669 | 670 | function initFooter() { 671 | if (needFooter()) { 672 | shiftUpBottomCss(); 673 | $("footer").show(); 674 | } else { 675 | resetBottomCss(); 676 | $("footer").hide(); 677 | } 678 | } 679 | 680 | function showFooterCore() { 681 | if (needFooter()) { 682 | shiftUpBottomCss(); 683 | $("footer").fadeIn(); 684 | } else { 685 | resetBottomCss(); 686 | $("footer").fadeOut(); 687 | } 688 | } 689 | 690 | function needFooter() { 691 | var scrollHeight = $(document).height(); 692 | var scrollPosition = $(window).height() + $(window).scrollTop(); 693 | return (scrollHeight - scrollPosition) < 1; 694 | } 695 | 696 | function resetBottomCss() { 697 | $(".sidetoc").removeClass("shiftup"); 698 | $(".sideaffix").removeClass("shiftup"); 699 | } 700 | 701 | function shiftUpBottomCss() { 702 | $(".sidetoc").addClass("shiftup"); 703 | $(".sideaffix").addClass("shiftup"); 704 | } 705 | } 706 | 707 | function renderLogo() { 708 | // For LOGO SVG 709 | // Replace SVG with inline SVG 710 | // http://stackoverflow.com/questions/11978995/how-to-change-color-of-svg-image-using-css-jquery-svg-image-replacement 711 | jQuery('img.svg').each(function () { 712 | var $img = jQuery(this); 713 | var imgID = $img.attr('id'); 714 | var imgClass = $img.attr('class'); 715 | var imgURL = $img.attr('src'); 716 | 717 | jQuery.get(imgURL, function (data) { 718 | // Get the SVG tag, ignore the rest 719 | var $svg = jQuery(data).find('svg'); 720 | 721 | // Add replaced image's ID to the new SVG 722 | if (typeof imgID !== 'undefined') { 723 | $svg = $svg.attr('id', imgID); 724 | } 725 | // Add replaced image's classes to the new SVG 726 | if (typeof imgClass !== 'undefined') { 727 | $svg = $svg.attr('class', imgClass + ' replaced-svg'); 728 | } 729 | 730 | // Remove any invalid XML tags as per http://validator.w3.org 731 | $svg = $svg.removeAttr('xmlns:a'); 732 | 733 | // Replace image with new SVG 734 | $img.replaceWith($svg); 735 | 736 | }, 'xml'); 737 | }); 738 | } 739 | 740 | function renderTabs() { 741 | var contentAttrs = { 742 | id: 'data-bi-id', 743 | name: 'data-bi-name', 744 | type: 'data-bi-type' 745 | }; 746 | 747 | var Tab = (function () { 748 | function Tab(li, a, section) { 749 | this.li = li; 750 | this.a = a; 751 | this.section = section; 752 | } 753 | Object.defineProperty(Tab.prototype, "tabIds", { 754 | get: function () { return this.a.getAttribute('data-tab').split(' '); }, 755 | enumerable: true, 756 | configurable: true 757 | }); 758 | Object.defineProperty(Tab.prototype, "condition", { 759 | get: function () { return this.a.getAttribute('data-condition'); }, 760 | enumerable: true, 761 | configurable: true 762 | }); 763 | Object.defineProperty(Tab.prototype, "visible", { 764 | get: function () { return !this.li.hasAttribute('hidden'); }, 765 | set: function (value) { 766 | if (value) { 767 | this.li.removeAttribute('hidden'); 768 | this.li.removeAttribute('aria-hidden'); 769 | } 770 | else { 771 | this.li.setAttribute('hidden', 'hidden'); 772 | this.li.setAttribute('aria-hidden', 'true'); 773 | } 774 | }, 775 | enumerable: true, 776 | configurable: true 777 | }); 778 | Object.defineProperty(Tab.prototype, "selected", { 779 | get: function () { return !this.section.hasAttribute('hidden'); }, 780 | set: function (value) { 781 | if (value) { 782 | this.a.setAttribute('aria-selected', 'true'); 783 | this.a.tabIndex = 0; 784 | this.section.removeAttribute('hidden'); 785 | this.section.removeAttribute('aria-hidden'); 786 | } 787 | else { 788 | this.a.setAttribute('aria-selected', 'false'); 789 | this.a.tabIndex = -1; 790 | this.section.setAttribute('hidden', 'hidden'); 791 | this.section.setAttribute('aria-hidden', 'true'); 792 | } 793 | }, 794 | enumerable: true, 795 | configurable: true 796 | }); 797 | Tab.prototype.focus = function () { 798 | this.a.focus(); 799 | }; 800 | return Tab; 801 | }()); 802 | 803 | initTabs(document.body); 804 | 805 | function initTabs(container) { 806 | var queryStringTabs = readTabsQueryStringParam(); 807 | var elements = container.querySelectorAll('.tabGroup'); 808 | var state = { groups: [], selectedTabs: [] }; 809 | for (var i = 0; i < elements.length; i++) { 810 | var group = initTabGroup(elements.item(i)); 811 | if (!group.independent) { 812 | updateVisibilityAndSelection(group, state); 813 | state.groups.push(group); 814 | } 815 | } 816 | container.addEventListener('click', function (event) { return handleClick(event, state); }); 817 | if (state.groups.length === 0) { 818 | return state; 819 | } 820 | selectTabs(queryStringTabs, container); 821 | updateTabsQueryStringParam(state); 822 | notifyContentUpdated(); 823 | return state; 824 | } 825 | 826 | function initTabGroup(element) { 827 | var group = { 828 | independent: element.hasAttribute('data-tab-group-independent'), 829 | tabs: [] 830 | }; 831 | var li = element.firstElementChild.firstElementChild; 832 | while (li) { 833 | var a = li.firstElementChild; 834 | a.setAttribute(contentAttrs.name, 'tab'); 835 | var dataTab = a.getAttribute('data-tab').replace(/\+/g, ' '); 836 | a.setAttribute('data-tab', dataTab); 837 | var section = element.querySelector("[id=\"" + a.getAttribute('aria-controls') + "\"]"); 838 | var tab = new Tab(li, a, section); 839 | group.tabs.push(tab); 840 | li = li.nextElementSibling; 841 | } 842 | element.setAttribute(contentAttrs.name, 'tab-group'); 843 | element.tabGroup = group; 844 | return group; 845 | } 846 | 847 | function updateVisibilityAndSelection(group, state) { 848 | var anySelected = false; 849 | var firstVisibleTab; 850 | for (var _i = 0, _a = group.tabs; _i < _a.length; _i++) { 851 | var tab = _a[_i]; 852 | tab.visible = tab.condition === null || state.selectedTabs.indexOf(tab.condition) !== -1; 853 | if (tab.visible) { 854 | if (!firstVisibleTab) { 855 | firstVisibleTab = tab; 856 | } 857 | } 858 | tab.selected = tab.visible && arraysIntersect(state.selectedTabs, tab.tabIds); 859 | anySelected = anySelected || tab.selected; 860 | } 861 | if (!anySelected) { 862 | for (var _b = 0, _c = group.tabs; _b < _c.length; _b++) { 863 | var tabIds = _c[_b].tabIds; 864 | for (var _d = 0, tabIds_1 = tabIds; _d < tabIds_1.length; _d++) { 865 | var tabId = tabIds_1[_d]; 866 | var index = state.selectedTabs.indexOf(tabId); 867 | if (index === -1) { 868 | continue; 869 | } 870 | state.selectedTabs.splice(index, 1); 871 | } 872 | } 873 | var tab = firstVisibleTab; 874 | tab.selected = true; 875 | state.selectedTabs.push(tab.tabIds[0]); 876 | } 877 | } 878 | 879 | function getTabInfoFromEvent(event) { 880 | if (!(event.target instanceof HTMLElement)) { 881 | return null; 882 | } 883 | var anchor = event.target.closest('a[data-tab]'); 884 | if (anchor === null) { 885 | return null; 886 | } 887 | var tabIds = anchor.getAttribute('data-tab').split(' '); 888 | var group = anchor.parentElement.parentElement.parentElement.tabGroup; 889 | if (group === undefined) { 890 | return null; 891 | } 892 | return { tabIds: tabIds, group: group, anchor: anchor }; 893 | } 894 | 895 | function handleClick(event, state) { 896 | var info = getTabInfoFromEvent(event); 897 | if (info === null) { 898 | return; 899 | } 900 | event.preventDefault(); 901 | info.anchor.href = 'javascript:'; 902 | setTimeout(function () { return info.anchor.href = '#' + info.anchor.getAttribute('aria-controls'); }); 903 | var tabIds = info.tabIds, group = info.group; 904 | var originalTop = info.anchor.getBoundingClientRect().top; 905 | if (group.independent) { 906 | for (var _i = 0, _a = group.tabs; _i < _a.length; _i++) { 907 | var tab = _a[_i]; 908 | tab.selected = arraysIntersect(tab.tabIds, tabIds); 909 | } 910 | } 911 | else { 912 | if (arraysIntersect(state.selectedTabs, tabIds)) { 913 | return; 914 | } 915 | var previousTabId = group.tabs.filter(function (t) { return t.selected; })[0].tabIds[0]; 916 | state.selectedTabs.splice(state.selectedTabs.indexOf(previousTabId), 1, tabIds[0]); 917 | for (var _b = 0, _c = state.groups; _b < _c.length; _b++) { 918 | var group_1 = _c[_b]; 919 | updateVisibilityAndSelection(group_1, state); 920 | } 921 | updateTabsQueryStringParam(state); 922 | } 923 | notifyContentUpdated(); 924 | var top = info.anchor.getBoundingClientRect().top; 925 | if (top !== originalTop && event instanceof MouseEvent) { 926 | window.scrollTo(0, window.pageYOffset + top - originalTop); 927 | } 928 | } 929 | 930 | function selectTabs(tabIds) { 931 | for (var _i = 0, tabIds_1 = tabIds; _i < tabIds_1.length; _i++) { 932 | var tabId = tabIds_1[_i]; 933 | var a = document.querySelector(".tabGroup > ul > li > a[data-tab=\"" + tabId + "\"]:not([hidden])"); 934 | if (a === null) { 935 | return; 936 | } 937 | a.dispatchEvent(new CustomEvent('click', { bubbles: true })); 938 | } 939 | } 940 | 941 | function readTabsQueryStringParam() { 942 | var qs = parseQueryString(); 943 | var t = qs.tabs; 944 | if (t === undefined || t === '') { 945 | return []; 946 | } 947 | return t.split(','); 948 | } 949 | 950 | function updateTabsQueryStringParam(state) { 951 | var qs = parseQueryString(); 952 | qs.tabs = state.selectedTabs.join(); 953 | var url = location.protocol + "//" + location.host + location.pathname + "?" + toQueryString(qs) + location.hash; 954 | if (location.href === url) { 955 | return; 956 | } 957 | history.replaceState({}, document.title, url); 958 | } 959 | 960 | function toQueryString(args) { 961 | var parts = []; 962 | for (var name_1 in args) { 963 | if (args.hasOwnProperty(name_1) && args[name_1] !== '' && args[name_1] !== null && args[name_1] !== undefined) { 964 | parts.push(encodeURIComponent(name_1) + '=' + encodeURIComponent(args[name_1])); 965 | } 966 | } 967 | return parts.join('&'); 968 | } 969 | 970 | function parseQueryString(queryString) { 971 | var match; 972 | var pl = /\+/g; 973 | var search = /([^&=]+)=?([^&]*)/g; 974 | var decode = function (s) { return decodeURIComponent(s.replace(pl, ' ')); }; 975 | if (queryString === undefined) { 976 | queryString = ''; 977 | } 978 | queryString = queryString.substring(1); 979 | var urlParams = {}; 980 | while (match = search.exec(queryString)) { 981 | urlParams[decode(match[1])] = decode(match[2]); 982 | } 983 | return urlParams; 984 | } 985 | 986 | function arraysIntersect(a, b) { 987 | for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { 988 | var itemA = a_1[_i]; 989 | for (var _a = 0, b_1 = b; _a < b_1.length; _a++) { 990 | var itemB = b_1[_a]; 991 | if (itemA === itemB) { 992 | return true; 993 | } 994 | } 995 | } 996 | return false; 997 | } 998 | 999 | function notifyContentUpdated() { 1000 | // Dispatch this event when needed 1001 | // window.dispatchEvent(new CustomEvent('content-update')); 1002 | } 1003 | } 1004 | 1005 | function utility() { 1006 | this.getAbsolutePath = getAbsolutePath; 1007 | this.isRelativePath = isRelativePath; 1008 | this.isAbsolutePath = isAbsolutePath; 1009 | this.getDirectory = getDirectory; 1010 | this.formList = formList; 1011 | 1012 | function getAbsolutePath(href) { 1013 | // Use anchor to normalize href 1014 | var anchor = $('')[0]; 1015 | // Ignore protocal, remove search and query 1016 | return anchor.host + anchor.pathname; 1017 | } 1018 | 1019 | function isRelativePath(href) { 1020 | if (href === undefined || href === '' || href[0] === '/') { 1021 | return false; 1022 | } 1023 | return !isAbsolutePath(href); 1024 | } 1025 | 1026 | function isAbsolutePath(href) { 1027 | return (/^(?:[a-z]+:)?\/\//i).test(href); 1028 | } 1029 | 1030 | function getDirectory(href) { 1031 | if (!href) return ''; 1032 | var index = href.lastIndexOf('/'); 1033 | if (index == -1) return ''; 1034 | if (index > -1) { 1035 | return href.substr(0, index); 1036 | } 1037 | } 1038 | 1039 | function formList(item, classes) { 1040 | var level = 1; 1041 | var model = { 1042 | items: item 1043 | }; 1044 | var cls = [].concat(classes).join(" "); 1045 | return getList(model, cls); 1046 | 1047 | function getList(model, cls) { 1048 | if (!model || !model.items) return null; 1049 | var l = model.items.length; 1050 | if (l === 0) return null; 1051 | var html = '
    '; 1052 | level++; 1053 | for (var i = 0; i < l; i++) { 1054 | var item = model.items[i]; 1055 | var href = item.href; 1056 | var name = item.name; 1057 | if (!name) continue; 1058 | html += href ? '
  • ' + name + '' : '
  • ' + name; 1059 | html += getList(item, cls) || ''; 1060 | html += '
  • '; 1061 | } 1062 | html += '
'; 1063 | return html; 1064 | } 1065 | } 1066 | 1067 | /** 1068 | * Add into long word. 1069 | * @param {String} text - The word to break. It should be in plain text without HTML tags. 1070 | */ 1071 | function breakPlainText(text) { 1072 | if (!text) return text; 1073 | return text.replace(/([a-z])([A-Z])|(\.)(\w)/g, '$1$3$2$4') 1074 | } 1075 | 1076 | /** 1077 | * Add into long word. The jQuery element should contain no html tags. 1078 | * If the jQuery element contains tags, this function will not change the element. 1079 | */ 1080 | $.fn.breakWord = function () { 1081 | if (this.html() == this.text()) { 1082 | this.html(function (index, text) { 1083 | return breakPlainText(text); 1084 | }) 1085 | } 1086 | return this; 1087 | } 1088 | } 1089 | 1090 | // adjusted from https://stackoverflow.com/a/13067009/1523776 1091 | function workAroundFixedHeaderForAnchors() { 1092 | var HISTORY_SUPPORT = !!(history && history.pushState); 1093 | var ANCHOR_REGEX = /^#[^ ]+$/; 1094 | 1095 | function getFixedOffset() { 1096 | return $('header').first().height(); 1097 | } 1098 | 1099 | /** 1100 | * If the provided href is an anchor which resolves to an element on the 1101 | * page, scroll to it. 1102 | * @param {String} href 1103 | * @return {Boolean} - Was the href an anchor. 1104 | */ 1105 | function scrollIfAnchor(href, pushToHistory) { 1106 | var match, rect, anchorOffset; 1107 | 1108 | if (!ANCHOR_REGEX.test(href)) { 1109 | return false; 1110 | } 1111 | 1112 | match = document.getElementById(href.slice(1)); 1113 | 1114 | if (match) { 1115 | rect = match.getBoundingClientRect(); 1116 | anchorOffset = window.pageYOffset + rect.top - getFixedOffset(); 1117 | window.scrollTo(window.pageXOffset, anchorOffset); 1118 | 1119 | // Add the state to history as-per normal anchor links 1120 | if (HISTORY_SUPPORT && pushToHistory) { 1121 | history.pushState({}, document.title, location.pathname + href); 1122 | } 1123 | } 1124 | 1125 | return !!match; 1126 | } 1127 | 1128 | /** 1129 | * Attempt to scroll to the current location's hash. 1130 | */ 1131 | function scrollToCurrent() { 1132 | scrollIfAnchor(window.location.hash); 1133 | } 1134 | 1135 | /** 1136 | * If the click event's target was an anchor, fix the scroll position. 1137 | */ 1138 | function delegateAnchors(e) { 1139 | var elem = e.target; 1140 | 1141 | if (scrollIfAnchor(elem.getAttribute('href'), true)) { 1142 | e.preventDefault(); 1143 | } 1144 | } 1145 | 1146 | $(window).on('hashchange', scrollToCurrent); 1147 | // Exclude tabbed content case 1148 | $('a:not([data-tab])').click(delegateAnchors); 1149 | scrollToCurrent(); 1150 | } 1151 | }); 1152 | -------------------------------------------------------------------------------- /_assetsApi/filterConfig.yml: -------------------------------------------------------------------------------- 1 | apiRules: 2 | - exclude: 3 | uidRegex: ^BCCertMaker 4 | - exclude: 5 | uidRegex: ^Org\.BouncyCastle\. 6 | - exclude: 7 | uidRegex: ^SmartAssembly\. 8 | - exclude: 9 | uidRegex: ^FiddlerCore\.Utilities\.SmartAssembly\. -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # The public documentation URL, used for sitemap.xml 2 | url: "https://docs.telerik.com/fiddlercore" 3 | 4 | # Exclude files which should not be in the output 5 | exclude: [README.md, Gemfile, Gemfile.lock] 6 | exclude_navigation: ["knowledge-base/*"] 7 | 8 | ## List your directory names and order here, like this: 9 | navigation: 10 | getting-started: 11 | title: Getting Started 12 | position: 10 13 | 14 | basic-usage: 15 | title: Basic Usage 16 | position: 20 17 | 18 | knowledge-base: 19 | title: Knowledge Base 20 | position: 100 21 | 22 | licensing: 23 | title: Licensing 24 | position: 200 25 | 26 | ## An exprerimental property to resolve th SEO vs STA panels conflicts 27 | ## Discussed in the folllowing issue: https://github.com/telerik/docs-seed/issues/159 28 | ## Build only with docs-seed branch #fiddler-page-title 29 | page_title_product: "FiddlerCore" 30 | use_product_in_title: true 31 | 32 | 33 | ## Product title 34 | product: "Progress Telerik FiddlerCore" 35 | platform: fiddler-core 36 | 37 | ## The application virtual path 38 | baseurl: /fiddlercore 39 | 40 | ## Assign layout and category per different paths 41 | defaults: 42 | - 43 | scope: 44 | path: "" 45 | values: 46 | layout: "documentation" 47 | category: "default" 48 | product: "fiddlercore" 49 | editable: true 50 | 51 | has_kb_portal: true 52 | has_api_reference: true 53 | 54 | 55 | productCode: FIDDLERCORE 56 | 57 | # The google services configuration 58 | google_analytics: UA-111455-1 59 | google_tag_manager: GTM-6X92 60 | gcs_engine: '001595215763381649090:bhf815yqanw' 61 | gcs_api_key: 'AIzaSyDWHnF6UKhvS44zCVYggJysw98qCaInqiE' 62 | 63 | edit_repo_url: https://github.com/telerik/fiddler-core-docs/edit/master 64 | 65 | footer: 66 | - 67 | title: "Getting Started" 68 | links: 69 | "Try Now": https://www.telerik.com/download/fiddlercore 70 | - 71 | title: "Community" 72 | links: 73 | "Forums": https://www.telerik.com/forums/fiddler 74 | "Blogs": https://www.telerik.com/blogs/tag/fiddler 75 | "Feedback Portal": https://feedback.telerik.com/fiddlercore 76 | 77 | footer_social: 78 | facebook: https://www.facebook.com/Telerik/ 79 | youtube: https://www.youtube.com/user/TelerikInc 80 | linkedin: https://www.linkedin.com/showcase/telerik/ 81 | twitter: https://twitter.com/TelerikFiddler/ 82 | 83 | api_reference_url: "api/" 84 | 85 | # Assets pipeline configuration 86 | assets: 87 | cachebust: soft 88 | js_compressor: uglifier 89 | 90 | ## Do not edit below this line 91 | safe: false 92 | markdown: MarkdownProcessor 93 | kramdown: 94 | toc_levels: 2..3 95 | smart_quotes: ["quot", "quot", "quot", "quot"] 96 | input: GFM 97 | -------------------------------------------------------------------------------- /basic-usage/capture-https-traffic.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Capture HTTP/S Traffic 3 | description: Use FiddlerCore application events to capture and analyze HTTP and HTTPS traffic 4 | slug: capture-https-traffic 5 | tags: capture-https-traffic 6 | published: True 7 | position: 30 8 | --- 9 | 10 | # Capture HTTP/S Traffic with FiddlerCore 11 | 12 | This article explains how to capture HTTP/S traffic with FiddlerCore 13 | 14 | Once FiddlerCore is [configured]({%slug configuration %}), it starts to listen for a traffic on the background. When it captures any session, it notifies you by raising the following events: 15 | 16 | >tip The following event handlers are invoked on session-handling **background threads**. 17 | > 18 | >If you need to update a UI thread (e.g. in WPF or Windows Forms application), you may need to delegate the update logic back to the UI thread, for example by using [Dispatcher.BeginInvoke](https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.begininvoke) (WPF) or [Control.Invoke](https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.invoke) (Windows Forms). 19 | > 20 | >Also, if you use collections that are not thread-safe, like [`List`](https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1), you may need to employ additional synchronization mechanisms. 21 | 22 | ## FiddlerApplication.BeforeRequest 23 | You should use this event to act when client request is received. For example, you can modify the session flags to use specific ssl protocols. 24 | ```c# 25 | FiddlerApplication.BeforeRequest += session => 26 | { 27 | session["x-OverrideSslProtocols"] = "ssl3;tls1.0;tls1.1;tls1.2"; 28 | }; 29 | ``` 30 | 31 | ## FiddlerApplication.BeforeResponse 32 | 33 | You should use this event to act when a server response is received. For example, you can decode the body. 34 | ```c# 35 | FiddlerApplication.BeforeResponse += session => 36 | { 37 | session.utilDecodeResponse(); 38 | }; 39 | ``` 40 | ## FiddlerApplication.AfterSessionComplete 41 | 42 | You should use this event to act when a session is completed. For example, notify the user. 43 | ```c# 44 | FiddlerApplication.AfterSessionComplete += session => 45 | { 46 | Console.WriteLine($"Finished session: {session.fullUrl}"); 47 | } 48 | ``` 49 | >tip These are only the most commonly used handlers. For the full list of events check [FiddlerApplication's API reference](/api/fiddler.fiddlerapplication). 50 | 51 | ## FiddlerApplication.ClientCertificateProvider 52 | 53 | You can use the `ClientCertificateProvider` field to set custom client certificate for specific hosts and you don't want to implement your own custom TLS Connection provider (through the `UseClientTlsProvider()` startup method). The `ClientCertificateProvider` field is available with FiddlerCore version 6.x.x and above. 54 | 55 | 56 | ```sh 57 | FiddlerApplication.ClientCertificateProvider = localCertificateSelectionCallback; 58 | ``` 59 | 60 | ## Next Steps 61 | 62 | - [Import/export sessions]({%slug import-export-sessions%}) 63 | -------------------------------------------------------------------------------- /basic-usage/configuration.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Configuration 3 | description: Learn more about FiddlerCore start-up, proxy, handling, and shutdown settings 4 | slug: configuration 5 | tags: configuration 6 | published: True 7 | position: 10 8 | --- 9 | 10 | # Configuration 11 | 12 | On high-level, working with FiddlerCore is done through the `FiddlerApplication` class and contains 3 steps: 13 | 14 | 1. Attach to some event handlers, which will be used by FiddlerCore to report information to the application, for example `FiddlerApplication.BeforeRequest` or `FiddlerApplication.AfterSessionComplete`. 15 | 16 | 2. Start FiddlerCore using `FiddlerApplication.Startup(FiddlerCoreStartupSettings)` method. 17 | 18 | 3. Shutdown FiddlerCore using `FiddlerApplication.Shutdown()` method. 19 | 20 | The simplest usage is demonstrated in the following code snippet: 21 | ```c# 22 | using System; 23 | using Fiddler; 24 | 25 | class Program 26 | { 27 | static void Main(string[] args) 28 | { 29 | // Attach to events of interest: 30 | FiddlerApplication.AfterSessionComplete += session => Console.WriteLine(session.fullUrl); 31 | 32 | // Build startup settings: 33 | var settings = new FiddlerCoreStartupSettingsBuilder() 34 | .RegisterAsSystemProxy() // instructs FiddlerCore to act as the operating system proxy 35 | .Build(); 36 | 37 | // Start: 38 | FiddlerApplication.Startup(settings); 39 | 40 | Console.ReadLine(); 41 | 42 | // Shutdown: 43 | FiddlerApplication.Shutdown(); 44 | } 45 | } 46 | ``` 47 | 48 | ## Startup configuration 49 | 50 | To configure FiddlerCore, you can use `FiddlerCoreStartupSettingsBuilder` class, which encapsulates the logic for creating `FiddlerCoreStartupSettting` instance, which in turn can be used as an argument for `FiddlerApplication.Startup(FiddlerCoreStartupSettings)` method. 51 | 52 | `FiddlerCoreStartupSettingsBuilder` provides fluent API, for example a convenient usage is: 53 | ```c# 54 | FiddlerCoreStartupSettings startupSettings = 55 | new FiddlerCoreStartupSettingsBuilder() 56 | .ListenOnPort(fiddlerCoreListenPort) 57 | .DecryptSSL() // Capture and decrypt HTTPS, Use alongside the set certificate provider 58 | .RegisterAsSystemProxy() 59 | .EnableHTTP2() // Enable HTTP/2 support (suported in FiddlerCore version 6.x.x and above) 60 | .Build(); 61 | 62 | // Example for using BouncyCastle as certificate provider. 63 | BCCertMaker.BCCertMaker certProvider = new BCCertMaker.BCCertMaker(); 64 | CertMaker.oCertProvider = certProvider; 65 | 66 | // In case the current certificate is not already trusted, trust it, so that FiddlerCore can capture and decrypt HTTPS traffic. 67 | if (!CertMaker.IsRootCertificateTrusted()) 68 | { 69 | CertMaker.TrustRootCertificate(); 70 | } 71 | 72 | // Example for using a FiddlerApplication event 73 | FiddlerApplication.AfterSessionComplete += session => 74 | { 75 | Console.WriteLine($"Finished session: {session.fullUrl}"); 76 | } 77 | 78 | FiddlerApplication.Startup(startupSettings); 79 | ``` 80 | 81 | The following configuration methods of `FiddlerCoreStartupSettingsBuilder` are available: 82 | 83 | #### Common settings: 84 | 85 | - `ListenOnPort(ushort port)`: Specifies the port on which FiddlerCore will listen. If 0 is used, random port is assigned. 86 | - `AllowRemoteClients()`: Allows FiddlerCore to accept requests from outside of the current machine, e.g. remote computers and devices. 87 | 88 | >warning Be cautious when allowing remote clients to connect to FiddlerCore. If an attacker is able to proxy its traffic through this FiddlerCore instance, it could circumvent IPSec traffic rules and intranet firewalls. 89 | 90 | #### System proxy settings: 91 | 92 | > There are a lot of possible systems and types of connections which might have to be modified in order to set proper proxy settings, and the following methods handle only the most common scenarios. For more advanced proxy configuration, see [Register as System Proxy]({%slug register-as-system-proxy %}) article. 93 | 94 | - `RegisterAsSystemProxy()`: Modifies the local LAN connection's proxy settings to point to the port on which FiddlerCore is listening on localhost. 95 | - `MonitorAllConnections()`: Modifies all system connections' proxy settings to point to the port on which FiddlerCore is listening on localhost. 96 | - `CaptureFTP()`: Modifies the system's proxy FTP-related settings to point to the port on which FiddlerCore is listening on localhost. 97 | - `HookUsingPACFile()`: Modifies current proxy settings to be configured using [PAC](https://en.wikipedia.org/wiki/Proxy_auto-config) file. On the other side, FiddlerCore serves a PAC file which is used to modify the connection. The default PAC file which is served can be configured by changing the "fiddler.proxy.pacfile.text" preference, which includes the body of the PAC file's `FindProxyForURL(url, host)` function, for example: 98 | ```c# 99 | FiddlerApplication.Prefs.SetStringPref("fiddler.proxy.pacfile.text", "return 'PROXY 127.0.0.1:8888'"); 100 | ``` 101 | 102 | #### FiddlerCore proxy settings: 103 | 104 | - `ChainToUpstreamGateway()`: Sets the current LAN connection's proxy settings as an upstream gateway proxy. For example, if the application is running in a corporate environment behind a corporate proxy, the corporate proxy will be used as an upstream gateway proxy for FiddlerCore. 105 | >note Chaining when upstream gateway proxy settings are configured to use PAC file is supported only on Windows. 106 | - `SetUpstreamProxySettingsTo(ProxySettings proxySettings)`: Sets the FiddlerCore upstream proxy settings as specified in the passed instance for ProxySettings class. 107 | 108 | #### Other settings: 109 | 110 | - `EnableHTTP2()`: Enables the support for capturing HTTP/2 traffic. Available with FiddlerCore version 6.x.x and above. 111 | - `DecryptSSL()`: Enables decryption of HTTPS traffic. You should have a CertificateProvider loaded with trusted certificate. For more details see [Use Custom Root Certificate]({%slug use-custom-root-certificate %}) article. 112 | - `UseClientTlsProvider(IClientTlsConnectionProvider customClientTlsProvider)`: Sets a custom client TLS provider for Fiddler. The provider will be used to authenticate an existing connection and return a stream to read/write data from/to it. Available with FiddlerCore version 6.x.x and above. 113 | 114 | ## Handling Events 115 | 116 | The `FiddlerApplication` class exposes numerous events like `BeforeRequest`, `BeforeResponse`, `AfterSessionComplete`, and many more. Full list of all supported events can be found in the [FiddlerCore API reference](https://docs.telerik.com/fiddlercore/api/fiddler.fiddlerapplication#events). 117 | 118 | Learn more on how to use the FiddlerCore events in the [Capture HTTP/S Traffic]({%slug capture-https-traffic %}) article. 119 | 120 | ## Shutdown 121 | 122 | FidlerCore can be shut down using the following method of `FiddlerApplication` 123 | - `Shutdown()`: Shuts down FiddlerCore, and reverts the proxy settings to the original ones, in case they were modified on startup. 124 | >note If there is traffic in progress when calling `FiddlerApplication.Shutdown()`, some of the background threads handling the sessions may throw `ObjectDisposedException` or `NullReferenceException`. 125 | 126 | ## Next Steps 127 | 128 | - [Register as System Proxy]({%slug register-as-system-proxy %}) 129 | - [Use Custom Root Certificate]({%slug use-custom-root-certificate %}) 130 | -------------------------------------------------------------------------------- /basic-usage/import-export-sessions.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Import and Export Sessions 3 | slug: import-export-sessions 4 | tags: import-export-sessions 5 | published: True 6 | position: 50 7 | --- 8 | 9 | # Import and Export Sessions with FiddlerCore 10 | 11 | This article explains how to import and export sessions with FiddlerCore. 12 | 13 | ## Import Sessions 14 | 15 | You can import sessions with FiddlerCore by using the following code: 16 | ```c# 17 | Session[] loaded = Utilities.ReadSessionArchive(sazFilename, false, "", (file, part) => 18 | { 19 | Console.WriteLine($"Enter the password for { part } (or just hit Enter to cancel):"); 20 | string sResult = Console.ReadLine(); 21 | Console.WriteLine(); 22 | 23 | return sResult; 24 | }); 25 | ``` 26 | 27 | ## Export Sessions 28 | 29 | You can export sessions with FiddlerCore by using the following code: 30 | ```c# 31 | bool success = Utilities.WriteSessionArchive(filename, sessions.ToArray(), password, false); 32 | ``` 33 | 34 | >tip With FiddlerCore version 6.0.0 and above, the SAZ archive will contain additional information about various metrics, such as timings and sizes, through the `SessionMetrics` class. 35 | 36 | ## Custom SAZ Provider 37 | 38 | There are cases when you may want to use custom provider to save FiddlerCore sessions. You do this by setting the following property: 39 | ```c# 40 | FiddlerApplication.oSAZProvider = new CustomSazProvider(); 41 | ``` 42 | -------------------------------------------------------------------------------- /basic-usage/register-as-system-proxy.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Register as System Proxy 3 | description: Learn how to set FiddlerCore as the system proxy 4 | slug: register-as-system-proxy 5 | tags: register 6 | published: True 7 | position: 20 8 | --- 9 | 10 | # Register as System Proxy 11 | 12 | This article explains how to register FiddlerCore as system proxy. This is a common scenario, in which part or all of the system traffic is redirected to FiddlerCore, so it can capture and/or modify it – similar to what Fiddler do. 13 | 14 | ## Basic approach 15 | 16 | The simplest way to register FiddlerCore as a system proxy is by passing `FiddlerCoreStartupSettings` on startup: 17 | ```c# 18 | FiddlerCoreStartupSettings startupSettings = 19 | new FiddlerCoreStartupSettingsBuilder() 20 | .RegisterAsSystemProxy() 21 | .Build(); 22 | 23 | FiddlerApplication.Startup(startupSettings); 24 | ``` 25 | 26 | There are more basic methods affecting the system proxy settings in the FiddlerCoreStartupSettings. You can read more in [Configuration/Proxy settings]({%slug configuration %}#system-proxy-settings) article. 27 | 28 | ## Advanced approach 29 | Instead of using the basic configuration methods, you can manually modify the proxy settings. The logic for modifying the system connections' proxy settings is separated in the Telerik.NetworkConnections assembly. 30 | 31 | It contains the following key members: 32 | 33 | - `INetworkConnectionsDetector`: Base interface representing network connection detector. It contains a single `Detect()` method, which should return a set of `NetworkConnection` instances of a particular type. 34 | - `NetworkConnection`: Base abstract class which allows manipulation and monitoring of proxy settings for a specific network connection. The most important members are: 35 | - `GetCurrentProxySettings()`: Returns the current `ProxySettings` for the connection. 36 | - `SetProxySettings(ProxySettings)`: Sets specified proxy settings for the connection. 37 | - `ProxySettingsChanged`: Event raised when proxy settings for the connection are changed. 38 | 39 | To manually manipulate network connections' proxy settings, you can use any of the built-in detectors, obtain an instance of a NetworkConnection class, and invoke it's `SetProxySettings` method, for example: 40 | ```c# 41 | // Detect the network connections: 42 | var networkConnections = new WinINetNetworkConnectionsDetector().Detect(); 43 | 44 | // Create appropriate proxy settings (in this case bypassing particular hosts): 45 | var proxySettings = new ProxySettings(true, "https://www.telerik.com"); 46 | 47 | // Modify some of the network connections: 48 | networkConnections.First().SetProxySettings(proxySettings); 49 | 50 | // Start: 51 | FiddlerApplication.Startup(new FiddlerCoreStartupSettingsBuilder().Build()); 52 | ``` 53 | 54 | The following default implementations for `INetworkConnectionsDetector` are provided: 55 | - `WinINetNetworkConnectionsDetector`: detector for Windows-specific Windows Internet (WinINET) networking component network connection. 56 | - `RasNetworkConnectionsDetector`: detector for Windows-specific RAS network connections. 57 | - `MacNetworkConnectionsDetector`: Detector for Mac-specific network connections. 58 | - `LinuxNetworkConnectionsDetector`: Detector for Linux-specific network connections. 59 | 60 | >note The built-in connection detectors are OS-specific and will throw exception if invoked on not supported platforms. 61 | 62 | ## Next Steps 63 | 64 | - [Capture HTTP/S Traffic]({%slug capture-https-traffic %}) 65 | 66 | -------------------------------------------------------------------------------- /basic-usage/session-flags.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FiddlerCore Session flags 3 | description: FiddlerCore provides set of specific flags to control the processing of the Session object 4 | slug: fiddler-core-session-flags 5 | published: True 6 | position: 60 7 | --- 8 | 9 | # Session Flags 10 | 11 | A field in each `Session` object contains flags that control the processing of the session. The flags can be accessed by `oSession.oFlags["flagname"]` or by using the default indexer on the `Session` object: `oSession["flagname"]`. 12 | 13 | ## Using SessionFlags 14 | 15 | - Flag names are not case-sensitive. 16 | - Flag values are always strings. 17 | - If you examine `oFlags["non-existent-flag"]`, the result will be `null`. 18 | - The `oFlags` collection is the "indexer" for the `Session` object, so `oSession.oFlags["flagname"]` can be written as: 19 | - `oSession["flagname"]` or 20 | - `oSession["SESSION", "flagname"]` 21 | - You can remove a flag from the list by: 22 | - Calling: `oFlags.Remove("flagname")` or 23 | - Setting `oSession["flagname"] = null` 24 | - The value of most flags is not important; simply adding the flag is enough. So `oSession["ui-hide"]="no"` does the same thing as `oSession["ui-hide"] = "true"` (hides the session). 25 | - While you can call `oFlags.Add("flagname")`, this will throw an exception if the flag already exists. It's better to just set the value: `oFlags["flagname"] = "value";` 26 | - You can create new flags that attach metadata to a given session. To avoid naming conflicts, it's recommended that you choose distinctive flagnames. For example: `addon.acme.loggingFlag`. 27 | 28 | ## Host Flags 29 | 30 | - `x-overrideHost` - Provide the _Host:Port_ combination, which should be used for DNS resolution purposes. Note that this mechanism does not change the HOST header on the request and thus is not useful if there's an upstream gateway. 31 | - `x-hostIP` - Indicates the IP address of the server used for this request. **Read-only** flag. 32 | - `x-overrideGateway` - Provide the Host:Port combination of a gateway that should be used to proxy this request, or DIRECT to send the request directly to the origin server. 33 | 34 | ## Client Flags 35 | 36 | - `x-ProcessInfo` - Information (module name and ProcessID) on source of local requests. 37 | - `x-clientIP` - Indicates the client IP that sent this request. It is most useful when multiple computers on a network are pointed to a single Fiddler instance. **Read-only** flag. 38 | - `x-clientport` - Indicates the port on the client that sent this request. **Read-only** flag. 39 | - `x-ConnectResponseRemoveConnectionClose` - Use during the `FiddlerApplication.RequestHeadersAvailable` or `FiddlerApplication.BeforeRequest` event, so that when FiddlerCore responds to the client's CONNECT request with `_"200 Connection established"_`, it will not add the `_"Connection: close"_` header. This header is known to be controversial for the CONNECT response, and it causes problems with some clients. 40 | 41 | ## Socket Reuse Flags 42 | 43 | - `x-serversocket` - String containing data about the reuse status of the server socket. **Read-only** flag. 44 | - `x-securepipe` - String containing data about the reuse status of a secure server socket. **Read-only** flag. 45 | 46 | ## Decryption and Authentication Flags 47 | 48 | - `x-no-decrypt` - If set on a CONNECT tunnel, the traffic in the tunnel will not be decrypted. 49 | - `https-Client-Certificate` - Filename of client certificate (e.g. .CER) that should be attached to this secure request. 50 | - `x-OverrideCertCN` - String specifying the hostname that should appear in the CN field of this CONNECT tunnel's Fiddler-generated certificate. 51 | - `x-SuppressProxySupportHeader` - Prevent FiddlerCore from adding a "Proxy-Support: Session-Based-Authentication" header to HTTP/401 or HTTP/407 responses that request Negotiate or NTLM authentication. 52 | 53 | ## Performance Flags 54 | 55 | - `request-trickle delay` - Milliseconds to delay each outbound kilobyte of request data. 56 | - `response-trickle-delay` - Milliseconds to delay each inbound kilobyte of response data. 57 | 58 | ## Drop Sessions Flags 59 | 60 | - `log-drop-request-body` - Drop the request body from the session list after a request is sent to the server. Helpful in reducing memory usage. 61 | - `log-drop-response-body` - Drop the request body from the session list after a response is sent to the client. Helpful in reducing memory usage. 62 | 63 | -------------------------------------------------------------------------------- /basic-usage/use-custom-root-certificate.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Use Custom Root Certificate 3 | description: Create, read and trust root certificate with BouncyCastle in FiddlerCore 4 | slug: use-custom-root-certificate 5 | tags: use-custom-root-certificate 6 | published: True 7 | position: 40 8 | --- 9 | 10 | # Use Custom Root Certificate 11 | 12 | This article explains how to generate and trust your own root certificate. 13 | 14 | By default, when you use the `FiddlerCoreStartupSettingsBuilder.DecryptSSL()` setting, 15 | FiddlerCore will create new certificate every time the application runs. This example shows how to change this behavior. 16 | 17 | ## Set the Default Certificate Provider 18 | 19 | The following code explains how to set the default certificate provider for FiddlerCore: 20 | ```c# 21 | BCCertMaker.BCCertMaker certProvider = new BCCertMaker.BCCertMaker(); 22 | CertMaker.oCertProvider = certProvider; 23 | ``` 24 | 25 | ## Create Root Certificate 26 | 27 | The following code explains how to create your own root certificate. 28 | ```c# 29 | string rootCertificatePath = @"Path\To\Your\Root\Certificate\RootCertificate.p12"; 30 | string rootCertificatePassword = "S0m3T0pS3cr3tP4ssw0rd"; 31 | if (!File.Exists(rootCertificatePath)) 32 | { 33 | certProvider.CreateRootCertificate(); 34 | certProvider.WriteRootCertificateAndPrivateKeyToPkcs12File(rootCertificatePath, rootCertificatePassword); 35 | } 36 | ``` 37 | 38 | ## Read Root Certificate from File 39 | 40 | The following code explains how to create your own root certificate. 41 | ```c# 42 | string rootCertificatePath = @"Path\To\Your\Root\Certificate\RootCertificate.p12"; 43 | string rootCertificatePassword = "S0m3T0pS3cr3tP4ssw0rd"; 44 | if (File.Exists(rootCertificatePath)) 45 | { 46 | certProvider.ReadRootCertificateAndPrivateKeyFromPkcs12File(rootCertificatePath, rootCertificatePassword); 47 | } 48 | ``` 49 | 50 | ## Trust Root Certificate 51 | 52 | The following code explains how to trust your root certificate. 53 | ```c# 54 | if (!CertMaker.rootCertIsTrusted()) 55 | { 56 | CertMaker.trustRootCert(); 57 | } 58 | ``` 59 | 60 | ## Next Steps 61 | 62 | - [Import/export sessions]({%slug import-export-sessions%}) 63 | -------------------------------------------------------------------------------- /exclude.txt: -------------------------------------------------------------------------------- 1 | .git/ 2 | .vscode/ 3 | .asset-cache/ 4 | _site/ 5 | .github/ 6 | _buildApi/ 7 | README.md 8 | .gitignore 9 | .contentignore 10 | exclude_files.txt 11 | exclude_dirs.txt 12 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/favicon.ico -------------------------------------------------------------------------------- /getting-started/download-product-files.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Download Product Files 3 | slug: download-product-files 4 | position: 2 5 | --- 6 | 7 | # Download Product Files 8 | 9 | When you have an active trial or developer license, you can download the following files: 10 | 11 | * Standalone installation 12 | * Assemblies for manual installation 13 | * NuGet packages 14 | * Old versions 15 | 16 | In order to download these you need to take the following steps: 17 | 18 | **1. Log into your [Telerik account](https://www.telerik.com/account/).** 19 | 20 | **2. Click on the __Downloads__ tab:** 21 | 22 | ![](images/download_product_files_1.png) 23 | 24 | **3. Select __FiddlerCore__ product title:** 25 | 26 | ![](images/download_product_files_2.png) 27 | 28 | **4. The next page allows you to download the Automatic Installation msi file, DLLs and NuGet Packages.** 29 | 30 | ![](images/download_product_files_3.png) 31 | 32 | Below you could find a list of the available files: 33 | 34 | >[license] could be Trial or Dev depending on the license you have. 35 | 36 | >[version] is replaced with the version the file corresponds to. 37 | 38 | ### Installation 39 | 40 | * FiddlerCoreEmbeddedEngine[version]_[license].zip - contains the required . 41 | 42 | ## Next Steps 43 | 44 | - [FiddlerCore Configuration]({%slug configuration%}) 45 | -------------------------------------------------------------------------------- /getting-started/first-steps.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: First Steps with FiddlerCore 3 | description: Get started with the FiddlerCore library 4 | slug: first-steps 5 | tags: first-steps 6 | published: True 7 | position: 0 8 | --- 9 | 10 | # First Steps 11 | 12 | This article explains everything you need to know about FiddlerCore before you start. 13 | 14 | ## System Requirements 15 | 16 | You can check the requirements for FiddlerCore suite in the [System Requirements]({%slug system-requirements%}) help article. 17 | 18 | ## Download FiddlerCore 19 | 20 | See how to download the library in the following help articles: 21 | 22 | * [Download Product Files]({%slug download-product-files%}) 23 | * [Use Telerik NuGet Server]({%slug telerik-nuget-server%}) 24 | 25 | ## Next Steps 26 | 27 | [Check the system requirements]({%slug system-requirements%}) -------------------------------------------------------------------------------- /getting-started/images/binaries-current-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/binaries-current-structure.png -------------------------------------------------------------------------------- /getting-started/images/binaries-references.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/binaries-references.png -------------------------------------------------------------------------------- /getting-started/images/binaries-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/binaries-structure.png -------------------------------------------------------------------------------- /getting-started/images/calendar-getting-started-update-packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/calendar-getting-started-update-packages.png -------------------------------------------------------------------------------- /getting-started/images/download_product_files_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/download_product_files_1.png -------------------------------------------------------------------------------- /getting-started/images/download_product_files_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/download_product_files_2.png -------------------------------------------------------------------------------- /getting-started/images/download_product_files_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/download_product_files_3.png -------------------------------------------------------------------------------- /getting-started/images/downloads/account-downloads-002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/downloads/account-downloads-002.png -------------------------------------------------------------------------------- /getting-started/images/downloads/account-downloads-003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/downloads/account-downloads-003.png -------------------------------------------------------------------------------- /getting-started/images/downloads/account-downloads-005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/downloads/account-downloads-005.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-add-package-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-add-package-source.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-add-packages-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-add-packages-dialog.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-add-packages-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-add-packages-menu.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-add-telerk-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-add-telerk-server.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-configure-sources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-configure-sources.png -------------------------------------------------------------------------------- /getting-started/images/getting-started-restore-packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/getting-started-restore-packages.png -------------------------------------------------------------------------------- /getting-started/images/item-templates-stocks-view-android-5.7inch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/item-templates-stocks-view-android-5.7inch.png -------------------------------------------------------------------------------- /getting-started/images/legacy-binaries-references.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/legacy-binaries-references.png -------------------------------------------------------------------------------- /getting-started/images/legacy-binaries-structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/legacy-binaries-structure.png -------------------------------------------------------------------------------- /getting-started/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/logo.png -------------------------------------------------------------------------------- /getting-started/images/nuget-keys-telerik-001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-keys-telerik-001.png -------------------------------------------------------------------------------- /getting-started/images/nuget-server/nuget-vs-add-packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-server/nuget-vs-add-packages.png -------------------------------------------------------------------------------- /getting-started/images/nuget-server/nuget-vs-add-source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-server/nuget-vs-add-source.png -------------------------------------------------------------------------------- /getting-started/images/nuget-server/nuget-vs-manage-packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-server/nuget-vs-manage-packages.png -------------------------------------------------------------------------------- /getting-started/images/nuget-server/nuget-vs-pm-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-server/nuget-vs-pm-settings.png -------------------------------------------------------------------------------- /getting-started/images/nuget-server/nuget-vs-telerik-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/nuget-server/nuget-vs-telerik-server.png -------------------------------------------------------------------------------- /getting-started/images/registry-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/registry-key.png -------------------------------------------------------------------------------- /getting-started/images/telerik-account-zip-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/telerik-account-zip-download.png -------------------------------------------------------------------------------- /getting-started/images/telerik-ui-for-xamarin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/telerik-ui-for-xamarin.png -------------------------------------------------------------------------------- /getting-started/images/telrik-project-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/telrik-project-wizard.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-created-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-created-solution.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-new-project-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-new-project-create.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-new-project-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-new-project-dialog.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-new-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-new-solution.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-new-solution_screen2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-new-solution_screen2.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-project-wizard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-project-wizard.png -------------------------------------------------------------------------------- /getting-started/images/visual-studio-solution-projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/visual-studio-solution-projects.png -------------------------------------------------------------------------------- /getting-started/images/vs2015_xamarin_install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/vs2015_xamarin_install.png -------------------------------------------------------------------------------- /getting-started/images/vs2017_xamarin_workload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/vs2017_xamarin_workload.png -------------------------------------------------------------------------------- /getting-started/images/vsmac_xamarin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/vsmac_xamarin.png -------------------------------------------------------------------------------- /getting-started/images/xamarin-studio-new-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/getting-started/images/xamarin-studio-new-solution.png -------------------------------------------------------------------------------- /getting-started/nuget-sso.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Generating and Using Telerik NuGet Key 3 | description: Learn how to use API keys for authentication with the Telerik NuGet server when you have an SSO account and cannot use a username and password. 4 | slug: telerik-nuget-sso 5 | position: 100 6 | --- 7 | 8 | # Generating and Using Telerik NuGet Key 9 | 10 | Progress Telerik expanded the account sign-in and login options, and now you can create a Telerik account through Google Authentication or by using custom SSO providers. While that change aims to ease the accessibility and usage of the whole Telerik system, it also presents a challenge for those who want to use a NuGet library through the Telerik NuGet server. 11 | 12 | ## Why and How to use a NuGet Key 13 | 14 | The main reason is that you can quickly and efficiatenly set your NeGut key within the application configuration and forget about Nuget credentials. 15 | 16 | Additionally, some Telerik products (like [FiddlerCore](https://docs.telerik.com/fiddlercore/getting-started/telerik-nuget-server) or [Kendo UI](https://docs.telerik.com/kendo-ui/intro/installation/nuget-install)) are available through the Telerik NuGet server which requires authentication. Until recently, you could only use your Telerik account credentials to authenticate with the Telerik NuGet server. However, a Telerik account that uses Google Authentication or custom SSO will notice no direct SSO login option to access the NuGet servers, and entering a username & password is a no-go. Luckily, the Progress Telerik team developed NuGet keys which can be used instead of the conventional username & password paradigm. 17 | 18 | >tip NuGet keys are helpful not only for Telerik users with Google Auth or SSO accounts but also for CI users and desktop developers. Learn more about the NuGet keys and how to use them by reading [this excellent blog post by Lance McCarthy](https://www.telerik.com/blogs/announcing-nuget-keys). 19 | 20 | ### Generating a NuGet Key 21 | 22 | Generating a key for the Telerik NuGet server (https://nuget.telerik.com/v3/index.json) is fast and easy: 23 | 24 | 1. Open the [NuGet keys management page](https://www.telerik.com/account/downloads/nuget-keys). Alternatively, navigate to that page through **Account Overview** > **Downloads** > **Manage NuGet Keys** 25 | 26 | 1. Click the **Generate Key** button to create a new NuGet key. 27 | 28 | 1. Copy and then store the value before replacing the contents of your clipboard. Note that this is the only time that you will see the key. Each generated key is valid for two years (or until explicitly deleted). 29 | 30 | ![Generate new key](./images/nuget-keys-telerik-001.png) 31 | 32 | ### Using the NuGet Key for Authentication 33 | 34 | Instead of entering a username and password through a Visual Studio prompt or a CLI command, the NuGet key must be provided through the NuGet.Config file. 35 | 36 | You have the option to create a NuGet.Config file on the application level (it will overwrite any global NuGet.Config files and configuration will be applicable only for the specific application) or to use a global NuGet.Config file (it will be valid for all applications unless explicitly overwritten by an application NuGet.Config file). [Learn more details about NuGet.Config configuration and location on each operating system here...](https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior) 37 | 38 | 1. Close all instances of Visual Studio. 39 | 40 | 1. Navigate to the directory where the NuGet.Config file resides. [Learn where is the location of NuGet.Config on each operating system here...](https://learn.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior#config-file-locations-and-uses) 41 | 42 | 1. Open the NuGet.Config file or create one if the file does not exist. 43 | 44 | 1. Add the Telerik NuGet server in the package source section through a custom key (in the demo case, the key is named **MyTelerikFeed**) 45 | 46 | 1. Add the generated Telerik NuGet key in the `packageSourceCredentials` section: 47 | 48 | 1. Add a `Username` key with the value `api-key` 49 | 50 | 1. Add a `ClearTextPassword` key with the value of the generated Telerik NuGet key. 51 | 52 | ```XML 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | ``` 68 | 69 | >Always use the `ClearTextPassword` option (not `Password`). Note that while you can directly copy/paste the Telerik NuGet key, it is not a good practice in terms of security. You can learn how to protect your API key from [Lance's blog post on NuGet keys](https://www.telerik.com/blogs/announcing-nuget-keys). 70 | 71 | 1. Re-open your .NET application in Visual Studio and restore the NuGet packages. 72 | 73 | That's it! With the above configuration in place, you can now access the Telerik NuGet and download & install the needed libraries without entering credentials. -------------------------------------------------------------------------------- /getting-started/system-requirements.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: System Requirements 3 | description: FiddlerCore system requirments 4 | slug: system-requirements 5 | position: 1 6 | --- 7 | 8 | # System Requirements 9 | 10 | In order to develop applications with **Telerik FiddlerCore** you need to have the following development tools installed: 11 | 12 | ## FiddlerCore for .NET 13 | 14 | ### Windows 15 | 16 | - FiddlerCore 6.x.x or older versions 17 | - Windows 8.1 or higher 18 | - Microsoft Visual Studio 2017 or higher (optional) 19 | 20 | ### Mac OS 21 | 22 | - FiddlerCore 6.x.x or older versions 23 | - Mac OS Sierra 10.12 or higher 24 | - Visual Studio for Mac (optional) 25 | 26 | ### Linux 27 | 28 | - FiddlerCore 6.x.x or older version 29 | - Full list of supported Linux distributions can be found [here](https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore21#linux-distribution-dependencies) 30 | 31 | ## FiddlerCore for .NET Framework 4.8 32 | 33 | - FiddlerCore 5.0.2 (or older versions). Note that FiddlerCore 6.x.x is incompatible with .NET Framework 34 | - Windows 8.1 or higher 35 | - Microsoft Visual Studio 2015 or higher (optional) 36 | - .NET Framework 4.8 37 | 38 | ## Next Steps 39 | 40 | * [Download Product Files]({%slug download-product-files%}) 41 | * [Use Telerik NuGet Server]({%slug telerik-nuget-server%}) 42 | -------------------------------------------------------------------------------- /getting-started/telerik-nuget-server.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Telerik NuGet Server 3 | description: Installing the latest version of FiddlerCore via the Telerik Nuget servers 4 | slug: telerik-nuget-server 5 | position: 8 6 | --- 7 | 8 | # Telerik NuGet Server 9 | 10 | The following steps demonstrate how users can use the Telerik NuGet server to include our suite in their solution and/or update to the latest available version. 11 | 12 | The credentials needed to access the Telerik NuGet server are the same as you use to log into your [Telerik account](https://www.telerik.com/account). The recommended approach to authenticate is to [generate]({%slug telerik-nuget-sso%}#generating-a-nuget-key) and [use]({%slug telerik-nuget-sso%}#using-the-nuget-key-for-authentication) the Telerik NuGet key. 13 | 14 | ## Visual Studio 15 | 16 | The first step is to add the Telerik server to the NuGet package sources. This can be done in the Package Manager Settings from the Tools menu. 17 | 18 | ![](images/nuget-server/nuget-vs-pm-settings.png) 19 | 20 | In the Package Sources section, users can add new sources. 21 | 22 | ![](images/nuget-server/nuget-vs-add-source.png) 23 | 24 | In the Source field, users should fill in the address of the Telerik server (URL: **https://nuget.telerik.com/v3/index.json**) and click the Update button. 25 | 26 | >important The previous version of the Telerik NuGet server (https://nuget.telerik.com/nuget) will be deprecated. Update your settings to point to the new v3 API (URL: **https://nuget.telerik.com/v3/index.json**), which is faster, lighter, and reduces the number of requests from NuGet clients. 27 | 28 | ![](images/nuget-server/nuget-vs-telerik-server.png) 29 | 30 | The Telerik server is now ready to use. Users can go to their solution and open the solution package manager. 31 | 32 | ![](images/nuget-server/nuget-vs-manage-packages.png) 33 | 34 | Users have to find the **FiddlerCore** package and install it to their projects following these steps: 35 | 36 | 1. Select the Telerik server as a package source and enter their credentials when prompted. 37 | 1. Search for the FiddlerCore package. 38 | 1. Select the package when found. 39 | 1. Select which projects will have the package installed. 40 | 1. Choose the desired version and click Install. 41 | 42 | ![](images/nuget-server/nuget-vs-add-packages.png) 43 | 44 | >tip You will need to autheticate when usiong the Telerik NuGet server. The recommended approach is to [generate and use a Telerik NuGet key]({%slug telerik-nuget-sso%}). 45 | 46 | ## Troubleshooting 47 | 48 | #### Receiving 401 Logon failed Error 49 | 50 | If you're receiving this error when connecting to Telerik Nuget Server, you could try to update your NuGet credentials through the Windows Credential Manager. Please follow the steps below: 51 | 52 | 1. Close all open Visual Studio instances (this is so that all NuGet package manager tasks are stopped); 53 | 1. Open the "Credential Manager" app on your PC; 54 | 1. Scroll through all the entries until you find any that are for nuget.telerik.com; 55 | 1. Once you find that entry, expand it and select "edit"; 56 | 1. Make sure the username and password are the same ones you use for your Telerik account (use the Email in the place of username) and click "Save". 57 | 58 | Now, you can reopen Visual Studio and access the Telerik NuGet server. 59 | 60 | ## Next Steps 61 | 62 | - [Generate and use Telerik NuGet key instead of using credentials]({%slug telerik-nuget-sso%}) 63 | - [FiddlerCore Configuration]({%slug configuration%}) 64 | -------------------------------------------------------------------------------- /images/anchor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/anchor.png -------------------------------------------------------------------------------- /images/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/api.png -------------------------------------------------------------------------------- /images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/arrow.png -------------------------------------------------------------------------------- /images/caution-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/caution-icon.png -------------------------------------------------------------------------------- /images/close-btn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 10 | 11 | -------------------------------------------------------------------------------- /images/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/close.png -------------------------------------------------------------------------------- /images/column.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/column.png -------------------------------------------------------------------------------- /images/datagrid_localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/datagrid_localization.png -------------------------------------------------------------------------------- /images/datagrid_resourcemanager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/datagrid_resourcemanager.png -------------------------------------------------------------------------------- /images/datagrid_resourcesfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/datagrid_resourcesfile.png -------------------------------------------------------------------------------- /images/external.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/external.png -------------------------------------------------------------------------------- /images/file-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/file-white.png -------------------------------------------------------------------------------- /images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/file.png -------------------------------------------------------------------------------- /images/folder-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/folder-close.png -------------------------------------------------------------------------------- /images/folder-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/folder-open.png -------------------------------------------------------------------------------- /images/getting-started.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/getting-started.png -------------------------------------------------------------------------------- /images/howdoi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/howdoi.png -------------------------------------------------------------------------------- /images/icon-telerik-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/icon-telerik-badge.png -------------------------------------------------------------------------------- /images/important-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/important-icon.png -------------------------------------------------------------------------------- /images/important.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/important.png -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/logo.png -------------------------------------------------------------------------------- /images/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/menu.png -------------------------------------------------------------------------------- /images/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/minus.png -------------------------------------------------------------------------------- /images/nav-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/nav-arrow.png -------------------------------------------------------------------------------- /images/note-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/note-icon.png -------------------------------------------------------------------------------- /images/note-types/notetypes-actualappearance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/note-types/notetypes-actualappearance.png -------------------------------------------------------------------------------- /images/note-types/notetypes-mddeclaration.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/note-types/notetypes-mddeclaration.PNG -------------------------------------------------------------------------------- /images/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/open.png -------------------------------------------------------------------------------- /images/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/plus.png -------------------------------------------------------------------------------- /images/search-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/search-24.png -------------------------------------------------------------------------------- /images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/search.png -------------------------------------------------------------------------------- /images/tap-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/tap-logo.png -------------------------------------------------------------------------------- /images/tip-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/tip-icon.png -------------------------------------------------------------------------------- /images/tutorials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/telerik/fiddler-core-docs/2273f5acfd94efbf205ae13cbc12ab528105a8fa/images/tutorials.png -------------------------------------------------------------------------------- /introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | description: FiddlerCore is MITM proxy distributed as a .NET class library that you can integrate into your .NET applications. 4 | slug: introduction 5 | publish: true 6 | position: 1 7 | --- 8 | 9 | # Welcome to FiddlerCore 10 | 11 | Thank you for choosing Progress® Telerik® FiddlerCore! 12 | 13 | ## What Is FiddlerCore and Why Do I Need It? 14 | 15 | FiddlerCore is a .NET class library you can integrate into your .NET applications. It's available in .NET Standard 2.0, .NET Framework 4.0, and .NET Framework 4.5 flavors, which allows using it on Windows, Linux, Mac, and any other platform implementing .NET Standard. 16 | 17 | FiddlerCore allows you to capture and modify HTTP and HTTPS traffic just like [Fiddler](https://www.telerik.com/fiddler), without any of the Fiddler UI. 18 | 19 | ## Features at a Glance 20 | 21 | - HTTP and HTTPS traffic capture and modification. 22 | - Powerful object model for content filtering and modification. 23 | - Store and reload web traffic. 24 | - Support for virtually any client application. 25 | - Support for most devices via mobile proxy settings. 26 | 27 | ## Next Steps 28 | 29 | [First steps with FiddlerCore]({%slug first-steps%}) 30 | -------------------------------------------------------------------------------- /knowledge-base/modifying-response-with-fiddler-core.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Modifying a response with FiddlerCore 3 | description: 4 | type: how-to 5 | page_title: Modifying Response 6 | slug: modifying-response-fcore 7 | ticketid: 1516567 8 | res_type: kb 9 | --- 10 | 11 | #### Environment 12 | 13 | | | | 14 | |---|---| 15 | | Product | FiddlerCore | 16 | | Product Version | 5.0.1 | 17 | 18 | #### Description 19 | 20 | To modify an HTTP response, ensure the session is set to **buffered mode**. 21 | 22 | Use some of the early events of the response, for example, the `ResponseHeadersAvailable` to access the session object and set the `bBufferResponse` property to `true`. If the property is not set to `true`, in the `BeforeResponse` event, you'll receive a **copy** of the response, while it will be streamed to the client as well. So your modifications will not be applied to the response that the client will receive. 23 | 24 | ```CSharp 25 | private static void FiddlerApplication_ResponseHeadersAvailable(Session oSession) 26 | { 27 | 28 | if (oSession.fullUrl.Contains("example.com")) 29 | { 30 | /* 31 | Set this to true, so in BeforeResponse, you'll be able to modify the body. 32 | If the value is false (default one), the response you'll work with within the BeforeResponse handler will be just a copy. 33 | The original one will already be streamed to the client, and all of your modifications will not be visible there. 34 | */ 35 | oSession.bBufferResponse = true; 36 | } 37 | } 38 | ``` 39 | 40 | Then you can handle the `BeforeResponse` event and modify the session's response as per your requirements. 41 | 42 | ```CSharp 43 | private static void FiddlerApplication_BeforeResponse(Session oSession) 44 | { 45 | if (oSession.fullUrl.Contains("example.com") && oSession.HTTPMethodIs("GET")) 46 | { 47 | oSession.bBufferResponse = true; 48 | oSession.utilDecodeResponse(); 49 | 50 | // Remove any compression or chunking 51 | oSession.utilDecodeResponse(); 52 | var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes); 53 | 54 | // Modify the body as you want 55 | oBody = "Replaced body"; 56 | 57 | // Set the response body to the div-less string 58 | oSession.utilSetResponseBody(oBody); 59 | } 60 | } 61 | ``` 62 | -------------------------------------------------------------------------------- /knowledge-base/persisting-the-root-certificate-in-fiddler-core.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Persisting the Root Certificate in Fiddler Core 3 | description: Article showing different methods for persisting the Certificate in Fiddler Core 4 | type: how-to 5 | page_title: Reusing Certificates 6 | slug: persisting-the-root-certificate-in-fiddler-core 7 | ticketid: 1429862 8 | res_type: kb 9 | --- 10 | 11 | #### Environment 12 | 13 | | | | 14 | |---|---| 15 | | Product | Fiddler Core | 16 | | Product Version | 4.6.20191.7809 | 17 | 18 | #### Description 19 | 20 | FiddlerCore uses different APIs for certificate creation than the Desktop Version. By default, FiddlerCore includes the CertMaker and BCMakeCert assemblies for use with the Bouncy Castle API but doesn't persist the certificate by default. The Bouncy Castle API is recommended because it can be used across multiple platforms. 21 | 22 | ## Persisting and Reusing Certificates 23 | 24 | Since FiddlerCore is a library that can be used in other applications, the API won't force persisting the Certificate and leaves the implementation up to the developer. The following workarounds are examples that show different ways this can be achieved. 25 | 26 | ## Using MakeCert.dll with Application (Recommended) 27 | 28 | In this example, the MakeCert.dll is used with the ICertificateProvider5 Interface to store the Certificate Information. For example, call the `EnsureRootCertificate` method like below. 29 | 30 | ``` csharp 31 | private static void EnsureRootCertificate() 32 | { 33 | BCCertMaker.BCCertMaker certProvider = new BCCertMaker.BCCertMaker(); 34 | CertMaker.oCertProvider = certProvider; 35 | 36 | // On first run generate root certificate using the loaded provider, then re-use it for subsequent runs. 37 | string rootCertificatePath = Path.Combine(assemblyDirectory, "..", "..", "RootCertificate.p12"); 38 | string rootCertificatePassword = "S0m3T0pS3cr3tP4ssw0rd"; 39 | if (!File.Exists(rootCertificatePath)) 40 | { 41 | certProvider.CreateRootCertificate(); 42 | certProvider.WriteRootCertificateAndPrivateKeyToPkcs12File(rootCertificatePath, rootCertificatePassword); 43 | } 44 | else 45 | { 46 | certProvider.ReadRootCertificateAndPrivateKeyFromPkcs12File(rootCertificatePath, rootCertificatePassword); 47 | } 48 | 49 | if (!CertMaker.rootCertIsTrusted()) 50 | { 51 | CertMaker.trustRootCert(); 52 | } 53 | } 54 | ``` 55 | 56 | ## Store Certificate Keys in Application Settings 57 | 58 | This method was identified by Rick Strahl's blog post titled [Using FiddlerCore to Capture Http Requests with .NET](https://weblog.west-wind.com/posts/2014/jul/29/using-fiddlercore-to-capture-http-requests-with-net). The approach store the certificate and keys in the Application Configuration. See the below code snippet from Rick Strahl's blog post. 59 | 60 | ``` csharp 61 | // Installing the Certificate 62 | public static bool InstallCertificate() 63 | { 64 | if (!CertMaker.rootCertExists()) 65 | { 66 | if (!CertMaker.createRootCert()) 67 | return false; 68 | 69 | if (!CertMaker.trustRootCert()) 70 | return false; 71 | 72 | App.Configuration.UrlCapture.Cert = 73 | FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.cert", null); // Set FiddlerCore BC Cert value into Application Configuration 74 | App.Configuration.UrlCapture.Key = 75 | FiddlerApplication.Prefs.GetStringPref("fiddler.certmaker.bc.key", null); // Set FiddlerCore BC Key value into Application Configuration 76 | } 77 | 78 | return true; 79 | } 80 | 81 | // Uninstalling the Certificate 82 | public static bool UninstallCertificate() 83 | { 84 | if (CertMaker.rootCertExists()) 85 | { 86 | if (!CertMaker.removeFiddlerGeneratedCerts(true)) 87 | return false; 88 | } 89 | App.Configuration.UrlCapture.Cert = null; // Clear the Cert from Application Configuration 90 | App.Configuration.UrlCapture.Key = null; // Clear the Key from Application Configuration 91 | return true; 92 | } 93 | 94 | public FiddlerCapture(StressTestForm form) 95 | { 96 | InitializeComponent(); 97 | CaptureConfiguration = App.Configuration.UrlCapture; 98 | MainForm = form; 99 | 100 | if (!string.IsNullOrEmpty(App.Configuration.UrlCapture.Cert)) 101 | { 102 | FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.key", App.Configuration.UrlCapture.Key); // Read the Key from Application Configuration 103 | FiddlerApplication.Prefs.SetStringPref("fiddler.certmaker.bc.cert", App.Configuration.UrlCapture.Cert); // Read the Cert from Application Configuration 104 | } 105 | } 106 | ``` 107 | 108 | ## See Also 109 | 110 | [Certificate Installation with Fiddler Core - Rick Strahl](https://weblog.west-wind.com/posts/2014/jul/29/using-fiddlercore-to-capture-http-requests-with-net#Certificate-Installation-with-FiddlerCore) -------------------------------------------------------------------------------- /licensing/copyright.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Copyright 3 | page_title: Copyright 4 | description: Copyright 5 | slug: license-copyright 6 | tags: copyright 7 | published: True 8 | position: 0 9 | --- 10 | 11 | # Copyright 12 | 13 | __© {{ site.time | date: '%Y' }} Progress Software Corporation and/or one of its subsidiaries or affiliates. All rights reserved.__ 14 | 15 | These materials and all Progress® software products are copyrighted and all rights are reserved by Progress Software Corporation. The information in these materials is subject to change without notice, and Progress Software Corporation assumes no responsibility for any errors that may appear therein. The references in these materials to specific platforms supported are subject to change. 16 | 17 | Business Making Progress, Corticon, DataDirect (and design), DataDirect Cloud, DataDirect Connect, DataDirect Connect64, DataDirect XML Converters, DataDirect XQuery, Deliver More Than Expected, Icenium, Kendo UI, Making Software Work Together, NativeScript, OpenEdge, Powered by Progress, Progress, Progress Software Business Making Progress, Progress Software Developers Network, Rollbase, RulesCloud, RulesWorld, SequeLink, Sitefinity (and Design), SpeedScript, Stylus Studio, TeamPulse, Telerik, Telerik (and Design), Test Studio, and WebSpeed are registered trademarks of Progress Software Corporation or one of its affiliates or subsidiaries in the U.S. and/or other countries. AccelEvent, AppsAlive, AppServer, BravePoint, BusinessEdge, DataDirect Spy, DataDirect SupportLink, Future Proof, High Performance Integration, OpenAccess, ProDataSet, Progress Arcade, Progress Profiles, Progress Results, Progress RFID, Progress Software, ProVision, PSE Pro, SectorAlliance, Sitefinity, SmartBrowser, SmartComponent, SmartDataBrowser, SmartDataObjects, SmartDataView, SmartDialog, SmartFolder, SmartFrame, SmartObjects, SmartPanel, SmartQuery, SmartViewer, SmartWindow, WebClient, and Who Makes Progress are trademarks or service marks of Progress Software Corporation and/or its subsidiaries or affiliates in the U.S. and other countries. Java is a registered trademark of Oracle and/or its affiliates. Any other marks contained herein may be trademarks of their respective owners. 18 | 19 | Please refer to the Release Notes applicable to the particular Progress product release for any third-party acknowledgements required to be provided in the documentation associated with the Progress product. -------------------------------------------------------------------------------- /licensing/license-agreement.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: License Agreement 3 | page_title: License Agreement 4 | description: Telerik FiddlerCore License Agreement 5 | slug: license-agreement 6 | tags: license-agreement 7 | published: True 8 | position: 1 9 | --- 10 | 11 | # License Agreement 12 | 13 | End User License Agreement for Progress Telerik FiddlerCore can be found on the following pages: 14 | 15 | * [https://www.telerik.com/purchase/license-agreement/fiddlercore](https://www.telerik.com/purchase/license-agreement/fiddlercore) for the internal version of FiddlerCore, including Trial License. -------------------------------------------------------------------------------- /licensing/personal-data-collection.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Personal Data Collection 3 | slug: common-personal-data-collection 4 | tags: personaldatacollection, gdpr 5 | position: 4 6 | --- 7 | 8 | # Personal Data Collection 9 | 10 | ## How personal data is used by Telerik Products 11 | 12 | Telerik FiddlerCore uses your account details, email address and a product usage data to better understand customer experience allowing us to focus development efforts on the products and features that matter most to our customers. Additionally, this information may be used by Marketing and / or Sales to ensure you receive relevant content updates, product news and materials to ensure your success with our products. Please see our [Privacy Policy](https://www.progress.com/legal/privacy-center) for more details. 13 | 14 | This information is for our own purposes and do not sell or otherwise provide this information to any third-parties for a commercial purpose. 15 | 16 | ## How I can see what data about me is stored? 17 | 18 | You can see the information stored for your account by sending request to us via the following form [GDPR Data Subject Access Rights Request](https://app.onetrust.com/app/#/webform/7897e80a-b8a4-4797-883a-bdacfe1ab8e4) 19 | 20 | ## How I can delete the data stored about me? 21 | 22 | You can request deletion of the information stored for your account by sending request to us via the following form [GDPR Data Subject Access Rights Request](https://app.onetrust.com/app/#/webform/7897e80a-b8a4-4797-883a-bdacfe1ab8e4) 23 | -------------------------------------------------------------------------------- /release-history.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Release History 3 | description: FiddlerCore versions release hostory 4 | slug: fc-release-history 5 | publish: true 6 | position: 300 7 | --- 8 | 9 | # Release History 10 | 11 | ## v6.0.0 FiddlerCore 12 | 13 | #### Breaking Changes 14 | 15 | - Dropped support for .NET Framework version 4.8 or lower. 16 | - Deprecated `OptimizeThreadPool` configuration option. 17 | - The `SendBodyAsync` method in `ClientChatter` now returns an integer that represents the size of the data being transferred. 18 | - The `SendDataAsync` method in `PipeBase` now returns an integer that represents the size of the data being transferred 19 | - The `SendRequestHeadersAsync` in `PipeBase` now returns an integer that represents the size of the data being transferred 20 | - The `SendResponseHeadersAsync` in `PipeBase` now returns an integer that represents the size of the data being transferred 21 | - The `SessionTimers` class has been renamed to `SessionMetrics`. 22 | - The `Timers` field in `Session` has been renamed to `Metrics`. 23 | 24 | #### Improvements 25 | 26 | - Added support for TLS 1.3 27 | - Support for HTTP/2 through the `EnableHTTP2` configuration option. 28 | - Support for adding a custom TLS provider through the `UseClientTlsProvider` configuration option. 29 | - The `SessionMetrics` has additional information for different timings and sizes throughout the session lifecycle. 30 | - The SAZ archive now contains additional information for timings and sizes. 31 | 32 | ## v5.0.2 FiddlerCore 33 | 34 | #### Improvements 35 | 36 | - Add digital signature to the FiddlerCore NuGet package and the FiddlerCore assemblies. 37 | 38 | ## v5.0.1 FiddlerCore 39 | 40 | #### Features 41 | 42 | - Add x-`ConnectResponseRemoveConnectionClose` session flag (documented in the [Client flags]({%slug fiddler-core-session-flags%}#client-flags) section). 43 | 44 | ## v5.0.0 FiddlerCore 45 | 46 | #### Fixed bugs 47 | 48 | - SSL handshake fails for some servers with TLS1.2 49 | 50 | #### Improvements 51 | 52 | - Removal of makecert.exe from FiddlerCore distributions 53 | - Improved the NetworkConnections API 54 | - Included PDBs for the NetworkConnections assemblies in the distributions 55 | - Hook using PAC script only 56 | - Updated FiddlerCore EULA 57 | - Updated FiddlerCore demo project 58 | -------------------------------------------------------------------------------- /to_delete.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: to_delete 3 | publish: False 4 | sitemap: false 5 | --- 6 | -------------------------------------------------------------------------------- /web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | --------------------------------------------------------------------------------