Skip to content

Commit

Permalink
Refactored file storing. Other minor refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
vGubriienko committed Dec 20, 2021
1 parent f04ccaf commit d4b6926
Show file tree
Hide file tree
Showing 10 changed files with 195 additions and 154 deletions.
4 changes: 3 additions & 1 deletion netfox.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 1020;
LastUpgradeCheck = 1310;
ORGANIZATIONNAME = kasketis;
TargetAttributes = {
8229AD611F8FB34300A9D613 = {
Expand Down Expand Up @@ -606,6 +606,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down Expand Up @@ -665,6 +666,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down
6 changes: 1 addition & 5 deletions netfox.xcodeproj/xcshareddata/xcschemes/netfox_ios.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down Expand Up @@ -29,8 +29,6 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
Expand All @@ -51,8 +49,6 @@
ReferencedContainer = "container:netfox.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
Expand Down
6 changes: 1 addition & 5 deletions netfox.xcodeproj/xcshareddata/xcschemes/netfox_osx.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down Expand Up @@ -29,8 +29,6 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
Expand All @@ -51,8 +49,6 @@
ReferencedContainer = "container:netfox.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
Expand Down
33 changes: 13 additions & 20 deletions netfox/Core/NFX.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ open class NFX: NSObject {
case alreadyStoppedMessage = "Already stopped!"
case startedMessage = "Started!"
case stoppedMessage = "Stopped!"
case prefixForCheck = "nfx"
case nibName = "NetfoxWindow"
}

Expand Down Expand Up @@ -84,6 +83,8 @@ open class NFX: NSObject {
register()
enable()
clearOldData()
NFXPath.deleteOldNFXLogs()
NFXPath.createNFXDirIfNotExist()
showMessage(Constants.startedMessage.rawValue)
#if os(OSX)
addNetfoxToMainMenu()
Expand Down Expand Up @@ -175,12 +176,7 @@ open class NFX: NSObject {
}

@objc open func getSessionLog() -> Data? {
var data: Data? = nil
if let sessionLogData = try? Data(contentsOf: URL(fileURLWithPath: NFXPath.SessionLog)) {
data = sessionLogData
}

return data
return try? Data(contentsOf: NFXPath.sessionLogURL)
}

@objc open func ignoreURLs(_ urls: [String]) {
Expand Down Expand Up @@ -227,17 +223,8 @@ open class NFX: NSObject {

internal func clearOldData() {
NFXHTTPModelManager.sharedInstance.clear()
do {
let documentsPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true).first!
let filePathsArray = try FileManager.default.subpathsOfDirectory(atPath: documentsPath)
for filePath in filePathsArray {
if filePath.hasPrefix(Constants.prefixForCheck.rawValue) {
try FileManager.default.removeItem(atPath: (documentsPath as NSString).appendingPathComponent(filePath))
}
}

try FileManager.default.removeItem(atPath: NFXPath.SessionLog)
} catch {}

NFXPath.deleteNFXDir()
}

func getIgnoredURLs() -> [String] {
Expand All @@ -258,18 +245,24 @@ open class NFX: NSObject {

func getCachedFilters() -> [Bool] {
if filters.isEmpty {
filters = [Bool](repeating: true, count: HTTPModelShortType.allValues.count)
filters = [Bool](repeating: true, count: HTTPModelShortType.allCases.count)
}
return filters
}

func getCachedFilterTypes() -> [HTTPModelShortType] {
return getCachedFilters()
.enumerated()
.compactMap { $1 ? HTTPModelShortType.allCases[$0] : nil }
}

}

#if os(iOS)

extension NFX {
fileprivate var presentingViewController: UIViewController? {
var rootViewController = UIApplication.shared.keyWindow?.rootViewController
var rootViewController = UIWindow.keyWindow?.rootViewController
while let controller = rootViewController?.presentedViewController {
rootViewController = controller
}
Expand Down
125 changes: 47 additions & 78 deletions netfox/Core/NFXHTTPModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {

public var timeInterval: Float?

@objc public var randomHash: NSString?
@objc public var shortType: NSString = HTTPModelShortType.OTHER.rawValue as NSString
@objc public var noResponse: Bool = true

@objc public lazy var randomHash = UUID().uuidString
public var shortType = HTTPModelShortType.OTHER
@objc public var shortTypeString: String { return shortType.rawValue }

@objc public var noResponse = true

func saveRequest(_ request: URLRequest) {
requestDate = Date()
Expand All @@ -66,7 +66,7 @@ fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
}

func logRequest(_ request: URLRequest) {
formattedRequestLogEntry().appendToFile(filePath: NFXPath.SessionLog)
formattedRequestLogEntry().appendToFileURL(NFXPath.sessionLogURL)
}

func saveErrorResponse() {
Expand All @@ -83,108 +83,100 @@ fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
let headers = response.getNFXHeaders()

if let contentType = headers["Content-Type"] as? String {
responseType = contentType.components(separatedBy: ";")[0]
shortType = getShortTypeFrom(responseType!).rawValue as NSString
let responseType = contentType.components(separatedBy: ";")[0]
shortType = HTTPModelShortType(contentType: responseType)
self.responseType = responseType
}

timeInterval = Float(responseDate!.timeIntervalSince(requestDate!))

saveResponseBodyData(data)
formattedResponseLogEntry().appendToFile(filePath: NFXPath.SessionLog)
formattedResponseLogEntry().appendToFileURL(NFXPath.sessionLogURL)
}


func saveRequestBodyData(_ data: Data) {
let tempBodyString = NSString.init(data: data, encoding: String.Encoding.utf8.rawValue)
let tempBodyString = String.init(data: data, encoding: String.Encoding.utf8)
self.requestBodyLength = data.count
if (tempBodyString != nil) {
saveData(tempBodyString!, toFile: getRequestBodyFilepath())
saveData(tempBodyString!, to: getRequestBodyFileURL())
}
}

func saveResponseBodyData(_ data: Data) {
var bodyString: NSString?
var bodyString: String?

if shortType as String == HTTPModelShortType.IMAGE.rawValue {
bodyString = data.base64EncodedString(options: .endLineWithLineFeed) as NSString?
if shortType == .IMAGE {
bodyString = data.base64EncodedString(options: .endLineWithLineFeed)

} else {
if let tempBodyString = NSString.init(data: data, encoding: String.Encoding.utf8.rawValue) {
if let tempBodyString = String(data: data, encoding: String.Encoding.utf8) {
bodyString = tempBodyString
}
}

if bodyString != nil {
if let bodyString = bodyString {
responseBodyLength = data.count
saveData(bodyString!, toFile: getResponseBodyFilepath())
saveData(bodyString, to: getResponseBodyFileURL())
}

}

fileprivate func prettyOutput(_ rawData: Data, contentType: String? = nil) -> NSString {
if let contentType = contentType {
let shortType = getShortTypeFrom(contentType)
if let output = prettyPrint(rawData, type: shortType) {
return output as NSString
}
fileprivate func prettyOutput(_ rawData: Data, contentType: String? = nil) -> String {
guard let contentType = contentType,
let output = prettyPrint(rawData, type: .init(contentType: contentType))
else {
return String(data: rawData, encoding: String.Encoding.utf8) ?? ""
}
return NSString(data: rawData, encoding: String.Encoding.utf8.rawValue) ?? ""

return output
}

@objc public func getRequestBody() -> NSString {
guard let data = readRawData(getRequestBodyFilepath()) else {
@objc public func getRequestBody() -> String {
guard let data = readRawData(from: getRequestBodyFileURL()) else {
return ""
}
return prettyOutput(data, contentType: requestType)
}

@objc public func getResponseBody() -> NSString {
guard let data = readRawData(getResponseBodyFilepath()) else {
@objc public func getResponseBody() -> String {
guard let data = readRawData(from: getResponseBodyFileURL()) else {
return ""
}

return prettyOutput(data, contentType: responseType)
}

@objc public func getRandomHash() -> NSString {
if !(randomHash != nil) {
randomHash = UUID().uuidString as NSString?
}
return randomHash!
}

@objc public func getRequestBodyFilepath() -> String {
let dir = getDocumentsPath() as NSString
return dir.appendingPathComponent(getRequestBodyFilename())
@objc public func getRequestBodyFileURL() -> URL {
return NFXPath.pathURLToFile(getRequestBodyFilename())
}

@objc public func getRequestBodyFilename() -> String {
return String("nfx_request_body_") + "\(requestTime!)_\(getRandomHash() as String)"
return "request_body_\(requestTime!)_\(randomHash)"
}

@objc public func getResponseBodyFilepath() -> String {
let dir = getDocumentsPath() as NSString
return dir.appendingPathComponent(getResponseBodyFilename())
@objc public func getResponseBodyFileURL() -> URL {
return NFXPath.pathURLToFile(getResponseBodyFilename())
}

@objc public func getResponseBodyFilename() -> String {
return String("nfx_response_body_") + "\(requestTime!)_\(getRandomHash() as String)"
}

@objc public func getDocumentsPath() -> String {
return NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true).first!
return "response_body_\(requestTime!)_\(randomHash)"
}

@objc public func saveData(_ dataString: NSString, toFile: String) {
@objc public func saveData(_ dataString: String, to fileURL: URL) {
do {
try dataString.write(toFile: toFile, atomically: false, encoding: String.Encoding.utf8.rawValue)
} catch {
print("catch !!!")
try dataString.write(to: fileURL, atomically: true, encoding: .utf8)
} catch let error {
print("[NFX]: Failed to save data to [\(fileURL)] - \(error.localizedDescription)")
}
}

@objc public func readRawData(_ fromFile: String) -> Data? {
return (try? Data(contentsOf: URL(fileURLWithPath: fromFile)))
@objc public func readRawData(from fileURL: URL) -> Data? {
do {
return try Data(contentsOf: fileURL)
} catch let error {
print("[NFX]: Failed to load data from [\(fileURL)] - \(error.localizedDescription)")
return nil
}
}

@objc public func getTimeFromDate(_ date: Date) -> String? {
Expand All @@ -200,41 +192,18 @@ fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
}
}

public func getShortTypeFrom(_ contentType: String) -> HTTPModelShortType {
if NSPredicate(format: "SELF MATCHES %@",
"^application/(vnd\\.(.*)\\+)?json$").evaluate(with: contentType) {
return .JSON
}

if (contentType == "application/xml") || (contentType == "text/xml") {
return .XML
}

if contentType == "text/html" {
return .HTML
}

if contentType.hasPrefix("image/") {
return .IMAGE
}

return .OTHER
}

public func prettyPrint(_ rawData: Data, type: HTTPModelShortType) -> NSString? {
public func prettyPrint(_ rawData: Data, type: HTTPModelShortType) -> String? {
switch type {
case .JSON:
do {
let rawJsonData = try JSONSerialization.jsonObject(with: rawData, options: [])
let prettyPrintedString = try JSONSerialization.data(withJSONObject: rawJsonData, options: [.prettyPrinted])
return NSString(data: prettyPrintedString, encoding: String.Encoding.utf8.rawValue)
return String(data: prettyPrintedString, encoding: String.Encoding.utf8)
} catch {
return nil
}

default:
return nil

}
}

Expand Down
19 changes: 3 additions & 16 deletions netfox/Core/NFXHTTPModelManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,8 @@ final class NFXHTTPModelManager: NSObject {
}

func getModels() -> [NFXHTTPModel] {
var predicates = [NSPredicate]()

let filterValues = NFX.sharedInstance().getCachedFilters()
let filterNames = HTTPModelShortType.allValues

for (index, filterValue) in filterValues.enumerated() {
if filterValue {
let filterName = filterNames[index].rawValue
let predicate = NSPredicate(format: "shortType == '\(filterName)'")
predicates.append(predicate)
}
}

let searchPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
let array = (models as NSArray).filtered(using: searchPredicate)
return array as! [NFXHTTPModel]
let filteredTypes = NFX.sharedInstance().getCachedFilterTypes()
return models.filter { filteredTypes.contains($0.shortType) }
}

}
Loading

0 comments on commit d4b6926

Please sign in to comment.