{"id":1091,"url":"https://github.com/divar-ir/NetShears","last_synced_at":"2025-07-30T20:31:15.186Z","repository":{"id":38027095,"uuid":"380537087","full_name":"divar-ir/NetShears","owner":"divar-ir","description":"iOS Network monitor/interceptor framework","archived":false,"fork":false,"pushed_at":"2023-08-05T15:39:49.000Z","size":563,"stargazers_count":135,"open_issues_count":4,"forks_count":21,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-05-01T15:18:45.265Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/divar-ir.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-06-26T15:39:20.000Z","updated_at":"2024-04-28T09:08:13.000Z","dependencies_parsed_at":"2024-01-26T21:15:45.815Z","dependency_job_id":null,"html_url":"https://github.com/divar-ir/NetShears","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divar-ir%2FNetShears","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divar-ir%2FNetShears/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divar-ir%2FNetShears/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/divar-ir%2FNetShears/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/divar-ir","download_url":"https://codeload.github.com/divar-ir/NetShears/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":227455966,"owners_count":17777937,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-01-05T20:15:38.738Z","updated_at":"2024-12-04T19:32:52.053Z","avatar_url":"https://github.com/divar-ir.png","language":"Swift","readme":"![Logo](./logo.png)\n\n# NetShears\n\nNetShears is a Network interceptor framework written in Swift.\n\nNetShears adds a Request interceptor mechanisms to be able to modify the HTTP/HTTPS Request before being sent . This mechanism can be used to implement authentication policies, add headers to a request , add log trace or even redirect requests.\n\n\n## Features\n\n- [x] Intercept HTTP/HTTPS request header\n- [x] Intercept HTTP/HTTPS request endpoint\n- [x] View traffic logs\n- [x] Request observer\n- [x] Intercept HTTP/HTTPS response body\n- [ ] Block HTTP requests\n\n## How it works\n\nNetShears has three main functionality :\n\n1 - Network request observer which can be used to observe every HTTP/HTTPS request using delegation.\n```swift\nNetshears.shared.startListener() \n```\n\n2 - Request interceptor mechanisms to be able to modify the HTTP/HTTPS Request before being sent.\n```swift\nNetshears.shared.startInterceptor() \n```\n\n3 - Show network traffics.\n```swift\nNetshears.shared.startLogger() \n```\n\n## Interceptor\n\nMake sure to call ```startInterceptor()``` before adding modifiers.\n```swift\nNetshears.shared.startInterceptor()\n```\n\nHeader Modification:\n\n```swift\nlet header = HeaderModifyModel(key: \"API-Version\", value: \"123\")\nlet headerModifier = RequestEvaluatorModifierHeader(header: header)\nNetShears.shared.modify(modifier: headerModifier)\n```\n\nEndpoint Modification: \n\n```swift\nlet endpoint = RedirectedRequestModel(originalUrl: \"/register\", redirectUrl: \"/login\")\nlet endpointModifier = RequestEvaluatorModifierEndpoint(redirectedRequest: endpoint)\nNetShears.shared.modify(modifier: endpointModifier)\n```\n\nResponse Modification\n\n```swift\nlet response = HTTPResponseModifyModel(\n    url: \"https://example.com/\",\n    data: #\"{\"message\": \"ok\"}\"#.data(using: .utf8)!\n)\nlet responseModifier = RequestEvaluatorModifierResponse(response: response)\nNetShears.shared.modify(modifier: responseModifier)\n```\n\n# Traffic Monitoring\n\nMake sure to call ```startLogger()``` before showing netwrok traffic logs.\n```swift\nNetshears.shared.startLogger()\n```\n\nIn order to show network traffics in your app simply call presentNetworkMonitor method and then a view will present containing traffic logs.\n\n```swift\nNetShears.shared.presentNetworkMonitor()\n```\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/divar-ir/NetShears/master/traffic_screen.png\" alt=\"Icon\"/\u003e\n\u003c/p\u003e\n\n## gRPC \n\nYou can view gRPC calls by constructing the Request and Response from GRPC models:\n\n```swift\npublic func addGRPC(url: String,\n                        host: String,\n                        requestObject: Data?,\n                        responseObject: Data?,\n                        success: Bool,\n                        statusCode: Int,\n                        statusMessage: String?,\n                        duration: Double?,\n                        HPACKHeadersRequest: [String: String]?,\n                        HPACKHeadersResponse: [String: String]?)\n```\nExample\n\n```swift\n// Your GRPC services that is generated from SwiftGRPC\nprivate let client = NoteServiceServiceClient.init(address: \"127.0.0.1:12345\", secure: false)\n\n\nfunc insertNote(note: Note, completion: @escaping(Note?, CallResult?) -\u003e Void) {\n    _ = try? client.insert(note, completion: { (createdNote, result) in\n\n        NetShears.shared.addGRPC(url: \"https://test.com/grpc\",\n                         requestObject: try? note.jsonUTF8Data(),\n                         responseObject: try? createdNote.jsonUTF8Data(),\n                         success: result.success,\n                         statusCode: result.statusCode.rawValue,\n                         statusMessage: result.statusMessage)\n    })\n}\n```\n\n## Ignore requests \n\nYou can ignore requests by setting ```NetShears.ignore``` to ```.enabled``` and set its ```ignoreHandler``` as below:\n\nExample\n\n```swift\nNetShears.shared.ignore = .enabled(ignoreHandler: { request in\n    request.url.contains(\"google\")\n})\n```\nNote that requests will be ignored **just** in Traffic Monitoring View; so you can set another ```ignoreHandler``` and get different results.\nBy default ```NetShears.ignore``` is ```.disabled```.\n\n# Request Observer\n\nFor observing requests you need to first call startListener then just simply adopt RequestBroadcast \u003cRequestBroadcastDelegate\u003e delegate.\n```swift\nNetShears.shared.startListener()\n\nRequestBroadcast.shared.setDelegate(self)\n\n```\n\n## Installation\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\nCreate a `Package.swift` file.\n\n```swift\n// swift-tools-version:5.0\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"YourProject\",\n  dependencies: [\n    .package(url: \"https://github.com/divar-ir/NetShears.git\", from: \"3.2.3\"),\n  ],\n  targets: [\n    .target(name: \"YourProject\", dependencies: [\"NetShears\"])\n  ]\n)\n```\n\n```bash\n$ swift build\n```\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'NetShears'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n## Contributing\nPlease see our [Contributing Guide](./CONTRIBUTING.md).\n\n## Inspiration\n\n* [depoon/NetworkInterceptor](https://github.com/depoon/NetworkInterceptor)\n* [pmusolino/Wormholy](https://github.com/pmusolino/Wormholy)\n\n## License\n[MIT](https://choosealicense.com/licenses/mit/)\n","funding_links":[],"categories":["Debugging","Swift"],"sub_categories":["Getting Started"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivar-ir%2FNetShears","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdivar-ir%2FNetShears","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivar-ir%2FNetShears/lists"}