Frequently Asked Questions
Can I use Cauli in my production builds?
Cauli is designed for developing purposes. Even if it doesn’t use any private API we recommend against using it in a production environment.
What kind of network traffic is considered?
Cauli hooks into the URL Loading System. This means it only considers network traffic of URLSessions
as well as traffic from legacy URL Loading Systems such as NSURLConnection
or UIWebView
.
Currently only the URLSession.default
and URLSessions
initialised with the URLSessionConfiguration.default
are supported.
Why are WKWebView and SFSafariViewController not supported?
WKWebView runs out of process, meaning it is not using the URL loading system of your application and thus are not passing through the URLProtocol
. In iOS 11 Apple added the setURLSchemeHandler:forURLScheme:
on the WKWebViewConfiguration which can be used to intercept requests, but it is not possible to register a custom WKURLSchemeHandler
for http or https schemes. There are alternative solutions which leverage private API, but Cauli should stay private API free.
SFSafariViewController
runs out of process as well and is sandboxed. There are no APIs to intercept requests.
How can I modify Records before they are displayed in displaying florets, like the InspectorFloret?
You may want to modify certain aspects of recorded requests or responses before they are displayed in the Cauli
view controller. For example you have some confidential information in the request headers, like an API key or auth token that you don’t want to expose.
Displaying florets fetch their data from a Storage
before it is displayed. This gives you the opportunity to modify the data (a Record
) before it is stored. You can use a RecordModifier
for this, that is passed to your Cauli
Configuration
on init:
let recordModifier = RecordModifier(keyPath: \Record.designatedRequest) { designatedRequest -> (URLRequest) in
let headerKey = "X-AUTH-NAME"
var request = designatedRequest
request.setValue(String(repeating: "*", count: (request.value(forHTTPHeaderField: headerKey) ?? "").count), forHTTPHeaderField: headerKey)
return request
}
let configuration = Configuration(
recordSelector: RecordSelector.max(bytesize: 5 * 1024 * 1024),
enableShakeGesture: true,
storageCapacity: .records(50),
preStorageRecordModifier: recordModifier
)
let cauli = Cauli([ InspectorFloret() ], configuration: configuration)
This will rewrite all request headers with the key “X-AUTH-NAME” to contain only asterisks, but only after the request was executed with the correct header.