Skip to content

Commit

Permalink
Merge pull request #7 from divar-ir/add-observation-protocol
Browse files Browse the repository at this point in the history
Add observation protocol
  • Loading branch information
Karosahafi authored Nov 28, 2021
2 parents 334946b + 8c0cd5f commit 06351aa
Show file tree
Hide file tree
Showing 18 changed files with 196 additions and 71 deletions.
26 changes: 13 additions & 13 deletions Sources/NetShears/Colors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,25 @@ import UIKit
struct Colors {

struct UI{
static public let wordsInEvidence = UIColor(hexString: "#dadfe1")
static public let wordFocus = UIColor(hexString: "#f7ca18")
static let wordsInEvidence = UIColor(hexString: "#dadfe1")
static let wordFocus = UIColor(hexString: "#f7ca18")
}

struct Gray{
static public let darkestGray = UIColor(hexString: "#666666")
static public let darkerGray = UIColor(hexString: "#888888")
static public let darkGray = UIColor(hexString: "#999999")
static public let midGray = UIColor(hexString: "#BBBBBB")
static public let lightGray = UIColor(hexString: "#CCCCCC")
static public let lighestGray = UIColor(hexString: "#E7E7E7")
static let darkestGray = UIColor(hexString: "#666666")
static let darkerGray = UIColor(hexString: "#888888")
static let darkGray = UIColor(hexString: "#999999")
static let midGray = UIColor(hexString: "#BBBBBB")
static let lightGray = UIColor(hexString: "#CCCCCC")
static let lighestGray = UIColor(hexString: "#E7E7E7")
}

struct HTTPCode{
static public let Success = UIColor(hexString: "#297E4C") //2xx
static public let Redirect = UIColor(hexString: "#3D4140") //3xx
static public let ClientError = UIColor(hexString: "#D97853") //4xx
static public let ServerError = UIColor(hexString: "#D32C58") //5xx
static public let Generic = UIColor(hexString: "#999999") //Others
static let Success = UIColor(hexString: "#297E4C") //2xx
static let Redirect = UIColor(hexString: "#3D4140") //3xx
static let ClientError = UIColor(hexString: "#D97853") //4xx
static let ServerError = UIColor(hexString: "#D32C58") //5xx
static let Generic = UIColor(hexString: "#999999") //Others
}
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/NetShears/Extension/URLRequest+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import Foundation

extension URLRequest {
public func getHttpBodyStreamData() -> Data? {
func getHttpBodyStreamData() -> Data? {
guard let httpBodyStream = self.httpBodyStream else {
return nil
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/NetShears/Models/RequestModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import Foundation
import UIKit

final class NetShearsRequestModel: Codable {
public final class NetShearsRequestModel: Codable {
let id: String
let url: String
let host: String?
Expand Down
10 changes: 9 additions & 1 deletion Sources/NetShears/NetShears.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,18 @@ public final class NetShears: NSObject {

public static let shared = NetShears()
let networkRequestInterceptor = NetworkRequestInterceptor()

lazy var config: NetworkInterceptorConfig = {
var savedModifiers = [RequestEvaluatorModifier]().retrieveFromDisk()
return NetworkInterceptorConfig(modifiers: savedModifiers)
}()

lazy var requestObserver: RequestObserverProtocol = {
RequestObserver(options: [
RequestStorage.shared,
RequestBroadcast.shared
])
}()


public func startRecording(){
Expand Down Expand Up @@ -56,6 +64,6 @@ public final class NetShears: NSObject {
HPACKHeadersRequest: [String: String]?,
HPACKHeadersResponse: [String: String]?){
let request = NetShearsRequestModel(url: url, host: host, requestObject: requestObject, responseObject: responseObject, success: success, statusCode: statusCode, duration: duration, HPACKHeadersRequest: HPACKHeadersRequest, HPACKHeadersResponse: HPACKHeadersResponse)
Storage.shared.saveRequest(request: request)
requestObserver.newRequestArrived(request)
}
}
11 changes: 5 additions & 6 deletions Sources/NetShears/NetworkInterceptor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,26 @@
import Foundation


@objc public class NetworkInterceptor: NSObject {
@objc class NetworkInterceptor: NSObject {

@objc public static let shared = NetworkInterceptor()
@objc static let shared = NetworkInterceptor()
let networkRequestInterceptor = NetworkRequestInterceptor()

public func startRecording(){
func startRecording(){
self.networkRequestInterceptor.startRecording()
}

public func stopRecording(){
func stopRecording(){
self.networkRequestInterceptor.stopRecording()
}

public func shouldRequestModify(urlRequest: URLRequest) -> Bool {
func shouldRequestModify(urlRequest: URLRequest) -> Bool {
for modifer in NetShears.shared.config.modifiers {
if modifer.isActionAllowed(urlRequest: urlRequest) {
return true
}
}
return false
}

}

6 changes: 3 additions & 3 deletions Sources/NetShears/NetworkInterceptorConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public struct RedirectedRequestModel: Codable, Equatable {
public let originalUrl: String
public let redirectUrl: String

public init (originalUrl: String, redirectUrl: String) {
public init(originalUrl: String, redirectUrl: String) {
self.originalUrl = originalUrl
self.redirectUrl = redirectUrl
}
Expand All @@ -21,13 +21,13 @@ public struct HeaderModifyModel: Codable, Equatable {
public let key: String
public let value: String

public init (key: String, value: String) {
public init(key: String, value: String) {
self.key = key
self.value = value
}
}

public final class NetworkInterceptorConfig {
final class NetworkInterceptorConfig {
var modifiers: [RequestEvaluatorModifier] = [] {
didSet {
modifiers.store()
Expand Down
12 changes: 6 additions & 6 deletions Sources/NetShears/NetworkRequestInterceptor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,25 @@
import Foundation


@objc public class NetworkRequestInterceptor: NSObject{

@objc class NetworkRequestInterceptor: NSObject{
func swizzleProtocolClasses(){
let instance = URLSessionConfiguration.default
let uRLSessionConfigurationClass: AnyClass = object_getClass(instance)!

let method1: Method = class_getInstanceMethod(uRLSessionConfigurationClass, #selector(getter: uRLSessionConfigurationClass.protocolClasses))!
let method2: Method = class_getInstanceMethod(URLSessionConfiguration.self, #selector(URLSessionConfiguration.fakeProcotolClasses))!

method_exchangeImplementations(method1, method2)
}

public func startRecording() {
func startRecording() {
URLProtocol.registerClass(NetworkInterceptorUrlProtocol.self)
URLProtocol.registerClass(NetworkLoggerUrlProtocol.self)
swizzleProtocolClasses()
}

public func stopRecording() {
func stopRecording() {
URLProtocol.unregisterClass(NetworkInterceptorUrlProtocol.self)
URLProtocol.unregisterClass(NetworkLoggerUrlProtocol.self)
swizzleProtocolClasses()
Expand Down
38 changes: 38 additions & 0 deletions Sources/NetShears/Observable/RequestBroadcast.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//
// RequestBroadcast.swift
//
//
// Created by Ali Moazenzadeh on 11/17/21.
//

import Foundation

public protocol RequestBroadcastDelegate: AnyObject {
func newRequestArrived(_ request: NetShearsRequestModel)
}

public final class RequestBroadcast: RequestObserverProtocol {
static public let shared = RequestBroadcast()

var delegate = ThreadSafe<RequestBroadcastDelegate?>(nil)

private init() {}

public func setDelegate(_ newDelegate: RequestBroadcastDelegate) {
delegate.atomically { delegate in
delegate = newDelegate
}
}

public func removeDelegate() {
delegate.atomically { delegate in
delegate = nil
}
}

func newRequestArrived(_ request: NetShearsRequestModel) {
delegate.atomically { delegate in
delegate?.newRequestArrived(request)
}
}
}
26 changes: 26 additions & 0 deletions Sources/NetShears/Observable/RequestObservable.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// RequestObservable.swift
//
//
// Created by Ali Moazenzadeh on 11/17/21.
//

import Foundation

protocol RequestObserverProtocol {
func newRequestArrived(_ request: NetShearsRequestModel)
}

final class RequestObserver: RequestObserverProtocol {
let options: [RequestObserverProtocol]

init(options: [RequestObserverProtocol]) {
self.options = options
}

func newRequestArrived(_ request: NetShearsRequestModel) {
options.forEach {
$0.newRequestArrived(request)
}
}
}
18 changes: 18 additions & 0 deletions Sources/NetShears/Observable/RequestStorage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// RequestStorage.swift
//
//
// Created by Ali Moazenzadeh on 11/17/21.
//

import Foundation

final class RequestStorage: RequestObserverProtocol {
static let shared = RequestStorage()

private init() {}

func newRequestArrived(_ request: NetShearsRequestModel) {
Storage.shared.saveRequest(request: request)
}
}
2 changes: 1 addition & 1 deletion Sources/NetShears/Protocols/PersistHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import Foundation

public class PersistHelper {
class PersistHelper {

fileprivate init() { }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
public struct RequestEvaluatorModifierEndpoint: RequestEvaluatorModifier, Equatable, Codable {

public var redirectedRequest: RedirectedRequestModel

public static var storeFileName: String {
"Modifier.txt"
}
Expand All @@ -20,7 +20,7 @@ public struct RequestEvaluatorModifierEndpoint: RequestEvaluatorModifier, Equata
}

public func modify(request: inout URLRequest) {

if isRequestRedirectable(urlRequest: request) {
request.modifyURLRequestEndpoint(redirectUrl: redirectedRequest)
}
Expand All @@ -34,7 +34,7 @@ public struct RequestEvaluatorModifierEndpoint: RequestEvaluatorModifier, Equata
guard let urlString = urlRequest.url?.absoluteString else {
return false
}

if urlString.contains(redirectedRequest.originalUrl) {
return true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
public struct RequestEvaluatorModifierHeader: RequestEvaluatorModifier, Equatable, Codable {

public var header: HeaderModifyModel

public static var storeFileName: String {
"Header.txt"
}
Expand Down
6 changes: 3 additions & 3 deletions Sources/NetShears/Storage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation

final class Storage: NSObject {

public static let shared: Storage = Storage()
static let shared: Storage = Storage()

var requests: [NetShearsRequestModel] = []

Expand All @@ -21,9 +21,9 @@ final class Storage: NSObject {

if let index = requests.firstIndex(where: { (req) -> Bool in
return request?.id == req.id ? true : false
}){
}) {
requests[index] = request!
}else{
} else {
requests.insert(request!, at: 0)
}
NotificationCenter.default.post(name: NSNotification.Name.NewRequestNotification, object: nil)
Expand Down
Loading

0 comments on commit 06351aa

Please sign in to comment.