📡 RealHTTP is a lightweight yet powerful client-side HTTP library.

Overview

RealHTTP

RealHTTP

RealHTTP is a lightweight yet powerful client-side HTTP library.
Our goal is make an easy to use and effortless http client for Swift.

ImmobiliareLabs

Feature Highlights

  • Sync/Async & Queued Requests
  • Elegant Request Builder with Chainable Response
  • Combine Support (soon Async/Await!)
  • Retry/timeout, Validators Control
  • URI Template support for parameter's build
  • URL/JSON, Multipart Form/File Upload
  • JSON decoding via Codable
  • Upload/Download progress tracker
  • URL Metrics Tracker
  • cURL Description
  • SSL Pinning, Basic/Digest Authentication
  • TSL Certificate and Public Key Pinning
  • Advanced HTTP Stub

Simple HTTP Client

Making an async http request is easier than ever:

HTTPRequest<Joke>("https://official-joke-api.appspot.com/random_joke").run().onResult { joke in
    // decoded Joke object instance
}

In this case you are executing a request inside the shared HTTPClient, a shared client which manage your requests.
Sometimes you may need to a more fined grained control.
Therefore you can create a custom HTTPClient to execute all your's webservice network calls sharing a common configuration (headers, cookies, authentication etc.) using the run(in:) method.

(.get, "/random_jokes") .json(["category": category, "count": countJokes]) // json parameter encoding! // Instead of callbacks we can also use Combine RX publishers. jokesReq.resultPublisher(in: jokeAPIClient).sink { joke in // decoded Joke object } // Get only the raw server response jokesReq.responsePublisher(in: ).sink { raw in // raw response (with metrics, raw data...) } ">
let jokeAPIClient = HTTPClient(baseURL: "https://official-joke-api.appspot.com")
let jokesReq = HTTPRequest<Joke>(.get, "/random_jokes")
               .json(["category": category, "count": countJokes]) // json parameter encoding!

// Instead of callbacks we can also use Combine RX publishers.
jokesReq.resultPublisher(in: jokeAPIClient).sink { joke in
    // decoded Joke object
}

// Get only the raw server response
jokesReq.responsePublisher(in: ).sink { raw in
    // raw response (with metrics, raw data...)
}

You can use it with regular callbacks, combine publishers and soon with async/await's Tasks.

Simple HTTP Stubber

RealHTTP also offer a built-in http stubber useful to mock your network calls for unit testing.
This is a simple URI matching stub:

var stubLogin = HTTPStubRequest()
                .match(URI: "https://github.com/malcommac/{repository}")
                .stub(for: .post, delay: 5, json: mockLoginJSON))

HTTPStubber.shared.add(stub: stubLogin)
HTTPStubber.shared.enable()

HTTPStubber also support different matchers (regex matcher for url/body, URI template matcher, JSON matcher and more).
This is an example to match Codable entity for a stub:

var stubLogin = HTTPStubRequest()
               .match(object: User(userID: 34, fullName: "Mark"))
               .stub(for: .post, delay: 5, json: mockLoginJSON)

... and more!

But there's lots more features you can use with RealHTTP.
Check out the Documentation section below to learn more!

Documentation

Requirements

RealHTTP can be installed in any platform which supports Swift 5.4+ ON:

  • iOS 13+
  • Xcode 12.5+
  • Swift 5.4+

Installation

To use RealHTTP in your project you can use Swift Package Manager (our primary choice) or CocoaPods.

Swift Package Manager

Aadd it as a dependency in a Swift Package, add it to your Package.swift:

dependencies: [
    .package(url: "https://github.com/immobiliare/RealHTTP.git", from: "1.0.0")
]

And add it as a dependency of your target:

targets: [
    .target(name: "MyTarget", dependencies: [
        .product(name: "https://github.com/immobiliare/RealHTTP.git", package: "RealHTTP")
    ])
]

In Xcode 11+ you can also navigate to the File menu and choose Swift Packages -> Add Package Dependency..., then enter the repository URL and version details.

CocoaPods

RealHTTP can be installed with CocoaPods by adding pod 'RealHTTP' to your Podfile.

pod 'RealHTTP'

Powered Apps

RealHTTP was created by the amazing mobile team at ImmobiliareLabs, the Tech dept at Immobiliare.it, the first real estate site in Italy.
We are currently using RealHTTP in all of our products.

If you are using RealHTTP in your app drop us a message, we'll add below.

Indomio

Support & Contribute

Made with ❤️ by ImmobiliareLabs & Contributors

We'd love for you to contribute to RealHTTP!
If you have any questions on how to use RealHTTP, bugs and enhancement please feel free to reach out by opening a GitHub Issue.

Todo List

If you want to contribuite to the project you can also work on these main topics.

  • Async/Await support for observers
  • Extended the Combine support
  • Complete the test suite

License

RealHTTP is licensed under the MIT license.
See the
LICENSE file for more information.

Comments
  • Crash in HTTPMetrics : Attempted to dereference garbage pointer

    Crash in HTTPMetrics : Attempted to dereference garbage pointer

    Bug Report

    | Q | A | | ------------------- | ------ | | BC Break | no | | Version | 1.5.2 |

    Summary

    It seems that there is still something going on with HTTPMetrics in the 1.5.2 version. I can't reproduce it since I don't really know what's going on, but our crash report shows a considerable amount of these issues...

    FYI, we use the Sentry and NewRelic SDKs and I am not sure if they could interfere with RealHTTP somehow 🤔

    OS Version: iOS 15.5 (19F77)
    Report Version: 104
    
    Exception Type: EXC_BAD_ACCESS (SIGBUS)
    Exception Codes: BUS_NOOP at 0x0000000000000419
    Crashed Thread: 1
    
    Application Specific Information:
    addObject: > countByEnumeratingWithState:objects:count: > transactionMetrics >
    Attempted to dereference garbage pointer 0x419.
    
    Thread 1 Crashed:
    0   libobjc.A.dylib                 0x33045f118         objc_retain
    1   CFNetwork                       0x302374644         CFURLRequestSetShouldStartSynchronously
    2   CFNetwork                       0x30237a400         CFURLCacheCurrentDiskUsage
    3   CFNetwork                       0x3023783c8         CFURLRequestSetHTTPRequestBodyParts
    4   ZVVOneApp                       0x203193e1c         HTTPMetrics.init (HTTPMetrics.swift:61)
    5   ZVVOneApp                       0x203165858         HTTPResponse.init (HTTPResponse.swift:126)
    6   ZVVOneApp                       0x203174368         [inlined] HTTPResponse.__allocating_init (HTTPResponse.swift:120)
    7   ZVVOneApp                       0x203174368         HTTPDataLoader.completeTask (HTTPDataLoader.swift:434)
    8   ZVVOneApp                       0x2031745cc         [inlined] HTTPDataLoader.urlSession (HTTPDataLoader.swift:268)
    9   ZVVOneApp                       0x2031745cc         HTTPDataLoader.urlSession (<compiler-generated>:266)
    10  NewRelic                        0x107941e28         -[NRURLSessionTaskDelegateBase URLSession:task:didCompleteWithError:] (NRMAURLSessionTaskDelegateBase.m:55)
    11  CFNetwork                       0x30234fa74         CFURLRequestCopyHTTPRequestMethod
    12  Foundation                      0x3041f43e8         __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__
    13  Foundation                      0x304205a9c         -[NSBlockOperation main]
    14  Foundation                      0x3041dfad8         __NSOPERATION_IS_INVOKING_MAIN__
    15  Foundation                      0x3041f0018         -[NSOperation start]
    16  Foundation                      0x3041f34e4         __NSOPERATIONQUEUE_IS_STARTING_AN_OPERATION__
    17  Foundation                      0x304200cf8         __NSOQSchedule_f
    18  libdispatch.dylib               0x300da2044         _dispatch_block_async_invoke2
    19  libdispatch.dylib               0x300dc0090         _dispatch_client_callout
    20  libdispatch.dylib               0x300d97ab4         _dispatch_continuation_pop$VARIANT$armv81
    21  libdispatch.dylib               0x300d971f0         _dispatch_async_redirect_invoke
    22  libdispatch.dylib               0x300da462c         _dispatch_root_queue_drain
    23  libdispatch.dylib               0x300da4de8         _dispatch_worker_thread2
    24  libsystem_pthread.dylib         0x3b7a29dd0         _pthread_wqthread
    
    bug 
    opened by nashfive 7
  • Custom error is returned from custom validator and/or decode() function

    Custom error is returned from custom validator and/or decode() function

    I have a custom validator like this:

    public class ErrorMessageValidator: HTTPValidator {
    
        public func validate(response: HTTPResponse, forRequest request: HTTPRequest) -> HTTPResponseValidatorResult {
            if [HTTPStatusCode.ResponseType.success, .redirection].contains(response.statusCode.responseType) {
                return .nextValidator
            }
    
            guard let data = response.data else {
                return .failChain(HTTPError(.invalidResponse))
            }
    
            let jsonData = JSON(data)
    
            guard let message = jsonData.dictionary?["message"]?.string else {
                return .nextValidator
            }
    
            return .failChain(MyError(title: message))
        }
    }
    

    And I get to the last line as expected, so a MyError is returned, wrapped into the failChain.

    But in my calling code:

    let request = myServerCall(myParameters).httpRequest()
    let response = try await request.fetch(MyModel.self)
    

    an error is thrown (expected) but it is an HTTPError with an empty error property, so my MyError isn't available here

    bug 
    opened by haemi 6
  • [Bug]: Body's specific headers overrides all the request/client set headers

    [Bug]: Body's specific headers overrides all the request/client set headers

    Platform Version

    iOS 16

    SDK Version

    1.7.2

    Xcode Version

    Xcode 14

    Steps To Reproduce

    I have this request

    try await HTTPRequest {
                $0.path = "businesscards"
                $0.headers = HTTPHeaders([
                    .authorization:"Bearer \(token)",
                    .contentType:"multipart/form-data"
                ])
                
                $0.method = .post
                $0.body = try .multipart(boundary: nil, { form in
                    if let name = businessCardCreation.name {
                        try form.add(string: name, name: "name")
                    }
                    if let surname = businessCardCreation.surname {
                        try form.add(string: surname, name: "surname")
                    }
                    if let email = businessCardCreation.email {
                        try form.add(string: email, name: "email")
                    }
                })
            }.fetch().decode(BusinessCard.self, decoder: Decoders.decoder)
    

    that is not sending Authorization header to the backend.

    Expected Behavior

    I expect to see the Authorization header in the backend.

    Actual Incorrect Behavior

    I can't see the authorization header in the backend. Here is a screenshot of the headers sent in a local call, but the same happens on the cloud.

    Schermata 2022-10-07 alle 07 36 56

    Trying the same request using Alamofire everything works. Schermata 2022-10-07 alle 08 02 21

    bug 
    opened by dariopellegrini 5
  • SPM Bug: Xcode 134.1 100 % CPU usage with SwiftLintPlugin enabled

    SPM Bug: Xcode 134.1 100 % CPU usage with SwiftLintPlugin enabled

    Platform Version

    Any

    SDK Version

    1.7.0

    Xcode Version

    13.4.1 (13F100)

    Steps To Reproduce

    Embed the latest 1.7.0 in any bigger project and run project.

    Xcode has over 100% usage as soon as the play button is being hit. Also restart of Xcode with project or restart of Mac and opening the project leads to 100% CPU usage. Xcode is extremely slow and doesn't show errors in the code anymore.

    Expected Behavior

    Version not affecting Xcode CPU usage.

    Actual Incorrect Behavior

    100% CPU usage when SDK is embedded in project.

    bug 
    opened by Kondamon 5
  • HTTPDataLoader crashes decrementStrong on line 438

    HTTPDataLoader crashes decrementStrong on line 438

    Bug Report

    | Q | A | | ------------------- | ------ | | BC Break | no | | Version | 1.5.2 |

    Summary

    Hello, I am experiencing some crash using RealHTTP on my app. Not sure if it comes from the lib or the use I do.

    Current behavior

    The app crash when deallocating a pointer on line 438 of the file HTTPDataLoader.swift.

    How to reproduce

    2% of my users are experiencing the crash but not sure of how to reproduce for the moment.

    Here are the stack trace : crash.txt Capture d’écran 2022-07-26 à 17 45 34

    Thanks for your help

    bug 
    opened by hschouman 4
  • Fixes download error 'No such file or directory' when transferMode = .largeData

    Fixes download error 'No such file or directory' when transferMode = .largeData

    When transferMode = .largeData the data is downloaded to a temporary file in Downloads folder. However, when the Downloads folder does not yet exists the following error is shown:

    2022-06-01 09:01:04.079666+0200 Project[3490:61771] open on .../Library/Developer/CoreSimulator/Devices/0FAC81F6-4CC8-492C-AB90-BD7A148107C9/data/Containers/Data/Application/9BE2AA69-AFBB-4796-90A0-9BAC0CE7CCE3/Downloads/ACEC951C-84BC-44E4-8B27-0B6BC2623240: No such file or directory

    The pull requests resolves the issue and creates the temporary folder if it does'n yet exists.

    opened by Kondamon 4
  • Why custom validation errors are embedded in a HTTPError ?

    Why custom validation errors are embedded in a HTTPError ?

    I have a custom validator that parses the JSON response and tries to build an Error struct. If it builds the error successfully, my validator will return with a .failChain(responseError), but in my catch at the call site, the error is still embedded into a HTTPError, which makes the catch a bit convoluted:

    import RealHTTP
    import MyService
    
    do { 
      let result = try await service.callSomeEndpoint()
    } catch let httpError as HTTPError {
      if let responseError = httpError.error as? ResponseError {
        // handle my custom response error here
      } else {
        // handle the http error?
      }
    } catch {
      // 
    }
    

    Question: what's your rationale behind automatically nesting the validator custom errors in a HTTPError ?

    I would probably prefer to have 2 dedicated catches:

    } catch let responseError as ResponseError {
      ...
    } catch let httpError as HTTPError {
      ...
    }
    

    So I can ignore the HTTPError and fallback to a generic catch if I'd like to.. and I could also avoid leaking the RealHTTP implementation/imports in all my services ;)

    enhancement good first issue 
    opened by nashfive 3
  • Cannot run example code

    Cannot run example code

    I tried your example , but I get error

    Instance method 'fetch' requires that 'HTTPRequest' conform to 'APIResourceConvertible'"

    That error appeared hear

    public extension HTTPClient {
    func fetch<T: APIResourceConvertible>(_ convertible: T) async throws -> T.Result {
    let result = try await fetch(convertible.request())
    return try result.decode(T.Result.self)
    }
    }
    
    documentation question 
    opened by X901 3
  • match(urlRegex:) function and the init of HTTPStubRegExMatcher() does not throws in case of wrong regular expression pattern

    match(urlRegex:) function and the init of HTTPStubRegExMatcher() does not throws in case of wrong regular expression pattern

    I use several stubs, just implemented the third one and now running into problems:

    extension HTTPStubRequest {
        static var stubXY: HTTPStubRequest {
            HTTPStubRequest().match(urlRegex: "*/resources/user/*/info").stub(for: .get) { urlRequest, matchedStubRequest in
    
            // getting here for the url https://example.com/resources/public/countries
            ...
            }
        }
    }
    

    This should never be the case, right? I'm having another stub added before this that should handle this case.

    enhancement 
    opened by haemi 3
  • Many waitForStatusRecordUnlock crash, thread lock

    Many waitForStatusRecordUnlock crash, thread lock

    Bug Report

    | Q | A | | ------------------- | ------ | | BC Break | no | | Version | 1.6.2 |

    Summary

    We have many (but intermittent) waitForStatusRecordUnlock crash and we doesn't know why,

    Do you have any idea ? Misuse of the HTTPClient ?

    Thanks for ur helping,

    Screenshot 2022-07-26 at 17 14 44 bug 
    opened by PoissonBallon 2
  • isAbsoluteURL regex doesn't work like expected

    isAbsoluteURL regex doesn't work like expected

    Bug Report

    | Q | A | | ------------------- | ------ | | BC Break | no | | Version | 1.52 |

    Summary

    isAbsoluteURL regex doesn't work like expected

    Current behavior

    Impossible to add urlComponents.queryItems coz path is absolute :/

    How to reproduce

    /connect/login is an absolute URL connect/login is an absolute URL

    Expected behavior

    /connect/login is not an absolute URL connect/login is not an absolute URL

    I think error is the ? after the first group in the regex

    bug enhancement 
    opened by PoissonBallon 2
  • Typos and readability suggestions

    Typos and readability suggestions

    Thanks so much for this library! And thank you for great documentation! I sat down this evening and enjoyed what I was reading so much that I figured I might as well take a moment to help improve the guide, especially since a pair of fresh eyes are the best way to find little typos and such. Feel free to revert any of my suggestions, as I know some of them might be considered just an English style choice.

    opened by jgoodrick 0
  • How to handle errors in RealHTTP: a test case

    How to handle errors in RealHTTP: a test case

    Hello, I did a take-home exercise for Walmart Labs and decided to use RealHTTP after doing a quick compare to other HTTP clients. My take-home was rejected and one of the three reasons was it "doesn't handle errors in a nice way". I didn't really handle errors as it was outside of the scope and 60 minute timeframe, but I did put in a catch:

    struct APIService {
        
        struct InfoService {
            static func fetchCountries() async ->CountryInfo?  {
                do {
                    guard let url = URL(string: "\(APIEnvironment.development.baseURL)/peymano-wmt/32dcb892b06648910ddd40406e37fdab/raw/db25946fd77c5873b0303b858e861ce724e0dcd0/countries.json") else { throw "Malformed URL" }
                    if let countryInfo = try await HTTPRequest(url)
                        .fetch(CountryInfo.self) {
                        return countryInfo
                    }
                } catch {
                    //TODO: log error
                }
                return nil
            }
        }
    }
    
    class CapitalSearchViewModel {
        weak var dataSource : GenericDataSource<CountryInfoElement>?
    
        init(dataSource : GenericDataSource<CountryInfoElement>?) {
            self.dataSource = dataSource
        }
        
        func fetchCountries() {
            Task {
                await self.dataSource?.data.value = APIService.InfoService.fetchCountries() ?? []
            }
        }
    }
    

    Extending on what is above, what would be the preferred way to do error handling with RealHTTP? I can provide access to the project if anyone wants to take a look. I didn't really agree with the feedback and would appreciate more opinions from other iOS devs if anyone has time. My email is bhartsb at gmail.com. The other feedback was "iOS code is overly complex" and "boilerplate code". Boiler plate code was Xcode generated for the most part.

    question 
    opened by bhartsb 3
  • Use HTTPStubber with iOS < 13 ?

    Use HTTPStubber with iOS < 13 ?

    Hi, I am using HTTPStubber and love its simplicity and power.

    I was wondering what would be the best approach to use it in a project with iOS 11+ support ? Since I can't use async/await, is there any way I can still use it? Or should I start looking at a custom implementation (or revert back to the old OHHTTPStubs 😒)?

    Any thoughts?

    enhancement 
    opened by nashfive 5
Releases(1.8.1)
  • 1.8.1(Dec 7, 2022)

  • 1.8.0(Nov 27, 2022)

    2022-11-27

    NEW FEATURES

    • [#69] Added a new retry strategy (.afterTask(TimeInterval, RetryTask, RetryTaskErrorCatcher?)) to allow performing an async task before retrying the original request. With this new option is possible to perform work outside RealHTTP and inject whatever you need into the original request.
    • [#73] Added an explicit option for specifying boolean and array encoding strategies when adding parameters in bulk via formURLEncodedBody() function.
    • [#72] All methods and properties of HTTPAltRequestValidator are now marked as open to allow further customization of the validation behaviors.

    FIXES

    • [#68] Removed warning for withTaskCancellationHandler() method in HTTPDataLoader in Swift 5.5. Also fixed the test_largeFileTestResume() unit test
    • [#70] Fixed the match(URL:) (with .ignoreQueryParameters) HTTPStubber function, which failed to match an URL when the port is explicitly set.

    CONTRIBUTORS

    • Thanks to @frajaona for the new retry request strategy in #69
    • Thanks to @nashfive for suggestion about #73
    • Thanks to @aetherealtech for the report about the bug with stubber in #70
    • Thanks to @NicFontana for fixing large download's unit test and the squash of continuation function deprecation in #68
    Source code(tar.gz)
    Source code(zip)
  • 1.7.4(Oct 24, 2022)

  • 1.7.3(Oct 9, 2022)

    2022-10-09

    Fixes

    • [#62] Fixed an issue with headers values priority override when setting a request body to replace any previously customized headers collection both from parent client's headers and specific requests headers. See #63 for more details.
    Source code(tar.gz)
    Source code(zip)
  • 1.7.2(Sep 23, 2022)

  • 1.7.1(Sep 9, 2022)

  • 1.7.0(Sep 5, 2022)

    2022-09-05

    New Features / Enhancements

    • [NEW] Added ability to set responseTime on HTTPStubResponse to simulate different network conditions

    Example:

    let mock = try HTTPStubRequest()
               .match(urlRegex: "(?s).*")
               .stub(for: .get, {
                    $0.statusCode = .ok
                    $0.responseTime = .withSpeed(.speed1kbps) <--- SIMULATE A VERY SLOW NETWORK
                    $0.body = ...
                    $0.headers = [
                        ...
                    ]
             })
    

    Fixes

    • [FIX] #59 - Fixed crash in HTTPMetrics : Attempted to dereference garbage pointer
    • [FIX] #58 - Fix for HTTPDataLoader crashes decrementStrong (line 438)
    • [FIX] #57 - Fix for waitForStatusRecordUnlock crash, thread lock

    NOTICE

    RealHTTP built-in stubber will soon be removed from this package into a separate package. No changes at APIs level will be applied.

    Source code(tar.gz)
    Source code(zip)
  • 1.6.2(Jul 23, 2022)

    2022-07-23

    New Features / Enhancements

    • [FIX] #56 - HTTPClient and URLSessionTask are incorrectly removed after the download, also breaking the cURLDescription() output.
    Source code(tar.gz)
    Source code(zip)
  • 1.6.0(Jul 22, 2022)

    2022-07-22

    New Features / Enhancements

    • [FIX] #54 - Fixed isAbsoluteURL property (regex) which lead wrong composed URLs for request
    • [FIX] #55 - Ability to change the downloaded file name with a large file data transfer
    • [FIX] #50 - curlDescription is now public

    New Contributors

    • @erdemildiz-loodos made their first contribution with fix #55
    • @Kondamon made their first contribution with fix #52
    • @PoissonBallon made their first contribution with #50

    Thanks for your support!

    Source code(tar.gz)
    Source code(zip)
  • 1.5.2(May 24, 2022)

    2022-05-24

    New Features / Enhancements

    • [FIX] #48 - Improvements to thread safety in HTTPDataLoader's class when making multiple calls at the same time.
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(May 20, 2022)

  • 1.5.0(May 18, 2022)

    2022-05-18

    New Features / Enhancements

    • [FIX] #44 - EXC_BAD_ACCESS with concurrent access to inner's HTTPDataLoader running tasks (it may happen with several concurrent requests in progress)
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Apr 27, 2022)

    2022-04-27

    New Features / Enhancements

    • [NEW] #40 - Ability to return a custom HTTPResponse as result of a validation inside the HTTPValidator response using the nextValidatorWithResponse action response.
    Source code(tar.gz)
    Source code(zip)
  • 1.3.2(Mar 23, 2022)

    2022-03-23

    Bug Fix

    • [FIX] #33 - Custom validator example does not work because of throw (thanks to @haemi)
    • [FIX] #35 - HTTPClient's .queryParams are not added to requests that have no query parameters (aka nil) (thanks to @nashfive)

    New Features / Enhancements

    • [NEW] #38 - match(urlRegex:) function and the init of HTTPStubRegExMatcher() does not throws in case of wrong regular expression pattern (thanks to @haemi)
    • [NEW] #34 - Custom error is returned from custom validator and/or decode() function (thanks to @haemi)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Mar 21, 2022)

    2022-03-21

    Bug Fixes

    • [FIX] #31 - Fix forHTTPStubResponse initializer that is inaccessible due to internal protection level (thanks to @haemi)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.0(Mar 19, 2022)

    2022-03-19

    Bug Fixes

    • [FIX] #27 Fix HTTPAltRequestValidator which does not retry the original request (thanks to @haemi)

    New Features

    • [NEW] #26 Modify the body of a request after initialization before executing it (thanks to @nashfive)
    • [NEW] #28 Added HTTPDynamicStubResponse to customize stub response dynamically

    New Contributors

    • @haemi made their first contributor with fix #27
    • @nashfive made their first contributor with #26
    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Mar 15, 2022)

    2022-03-15

    Bug Fixes

    • [CHG] #24 Decode function should not return an optional value
    • [NEW] #23 Allow defining shared query params at client level
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Mar 12, 2022)

    2022-03-12

    Bug Fixes

    • [FIX] #19 Fixed missing Content-Type/Content-Length in MultiPartForm encoded form
    • [FIX] #20 Fixed missing closing boundary string in encoded MultiPartForm

    New Features/Enhancements

    • [NEW] #21 Complete Unit Tests suite for MultiPartForm Data Encoding
    • [NEW] #17 Added cURLDescription also for HTTPResponse
    • [NEW] #18 Serialize/deserialize in a different Task/thread
    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Feb 18, 2022)

  • 0.9.20(Feb 18, 2022)

  • 0.9.19(Feb 17, 2022)

  • 1.0.1(Feb 16, 2022)

  • 0.9.18(Feb 16, 2022)

  • 1.0.0(Feb 3, 2022)

    2022-02-03

    • [NEW] #8 - Added support SSL Pinning, URLAuthenticationChallenge and Auto-Accept-Self-Signed support for HTTPSecurity
    • [NEW] #9 - Reimplemented HTTPAltRequestValidator for new API set
    Source code(tar.gz)
    Source code(zip)
  • 0.9.17(Feb 1, 2022)

    2022-02-01 (HOTFIX)

    • #6 In case of network error (status code = nil) the HTTPAltRequestValidator custom callback is not called #6

    Se 0.9.9 for a final API release, this branch is dev only.

    Source code(tar.gz)
    Source code(zip)
  • 0.9.9(Jan 31, 2022)

    2022-01-31

    • #5 Full async/await support (this means we require iOS13+, macOS Catalina)
    • a completely revisited API design
    • fully revisited documentation section
    • unit testing suite (along with some integration tests)
    • CI test with iOS 13.7, 14.4 and iOS 15.2
    Source code(tar.gz)
    Source code(zip)
  • 0.9.16(Nov 28, 2021)

  • 0.9.15(Oct 10, 2021)

Owner
Immobiliare Labs
It took sharp skills in technology to establish Immobiliare.it as the leadering online service provider for the real estate market.
Immobiliare Labs
An elegant yet powerful iOS networking layer inspired by ActiveRecord.

Written in Swift 5 AlamoRecord is a powerful yet simple framework that eliminates the often complex networking layer that exists between your networki

Tunespeak 19 Nov 19, 2022
An iOS library to route API paths to objects on client side with request, mapping, routing and auth layers

WANetworkRouting Developed and Maintained by ipodishima Founder & CTO at Wasappli Inc. Sponsored by Wisembly A routing library to fetch objects from a

null 10 Nov 20, 2022
Http - Demo for Http Layer

http Example To run the example project, clone the repo, and run pod install fro

null 0 Jan 24, 2022
Client side for goyotashi

B_2121_client サーバサイドはこちら Required Dependency Cocoa Pods — https://guides.cocoapods.org/using/getting-started.html Getting Started ⚠️ M1 Mac の場合、「Finde

JPHACKS 2 Oct 31, 2021
A little and powerful iOS framework for intercepting HTTP/HTTPS Traffic.

A little and powerful iOS framework for intercepting HTTP/HTTPS Traffic.

Proxyman 867 Dec 29, 2022
The HTTP library used by the Spotify iOS client

Authentication and back-off logic is a pain, let's do it once and forget about it! This is a library that allows you to centralise this logic and forg

Spotify 625 Nov 20, 2022
A lightweight library for writing HTTP web servers with Swift

Taylor Disclaimer: Not actively working on it anymore. You can check out some alternatives Swift 2.0 required. Working with Xcode 7.1. Disclaimer: It

Jorge Izquierdo 925 Nov 17, 2022
Super lightweight async HTTP server library in pure Swift runs in iOS / MacOS / Linux

Embassy Super lightweight async HTTP server in pure Swift. Please read: Embedded web server for iOS UI testing. See also: Our lightweight web framewor

Envoy 540 Dec 15, 2022
A lightweight but powerful network library with simplified and expressive syntax based on AFNetworking.

XMNetworking English Document XMNetworking 是一个轻量的、简单易用但功能强大的网络库,基于 AFNetworking 3.0+ 封装。 其中,XM 前缀是我们团队 Xcode-Men 的缩写。 简介 如上图所示,XMNetworking 采用中心化的设计思想

KANGZUBIN 981 Dec 29, 2022
A barebones Swift HTTP client with automatic JSON response parsing.

HTTP Client A barebones Swift HTTP client with automatic JSON response parsing. Installation Add HTTP Client as a dependency through Xcode or directly

Joe Masilotti 30 Oct 11, 2022
A simple GCD based HTTP client and server, written in 'pure' Swift

SwiftyHTTP Note: I'm probably not going to update this any further - If you need a Swift networking toolset for the server side, consider: Macro.swift

Always Right Institute 116 Aug 6, 2022
Postie - The Next-Level HTTP API Client using Combine

Postie - The Next-Level HTTP API Client using Combine Postie is a pure Swift library for building URLRequests using property wrappers.

kula 28 Jul 23, 2022
HTTPClient - HTTP Client With Swift

HTTPClient Ex. Search Repository import HTTPClient let url: URL = .init(string:

zunda 1 Jul 20, 2022
Cross-platform JsonRPC client implementation with HTTP and WebSocket support

JsonRPC.swift Cross-platform JsonRPC client implementation with HTTP and WebSocket support Getting started Installation Package Manager Add the follow

Tesseract 5 Oct 19, 2022
Lightweight, flexible HTTP server framework written in Swift

Hummingbird Lightweight, flexible server framework written in Swift. Hummingbird consists of three main components, the core HTTP server, a minimal we

Hummingbird 245 Dec 30, 2022
Lightweight lib around NSURLSession to ease HTTP calls

AeroGear iOS HTTP Thin layer to take care of your http requests working with NSURLSession. Project Info License: Apache License, Version 2.0 Build: Co

AeroGear 44 Sep 27, 2022
FlyingFox - a lightweight HTTP server built using Swift Concurrency

Usage Credits Introduction FlyingFox is a lightweight HTTP server built using Swift Concurrency. The server uses non blocking BSD sockets, handling ea

Simon Whitty 262 Dec 24, 2022
Apple Push Notifications (APNs) Server-Side library.

Perfect-Notifications 简体中文 APNs remote Notifications for Perfect. This package adds push notification support to your server. Send notifications to iO

PerfectlySoft Inc. 113 Oct 28, 2022
Swift Express is a simple, yet unopinionated web application server written in Swift

Documentation <h5 align="right"><a href="http://demo.swiftexpress.io/">Live ?? server running Demo <img src="https://cdn0.iconfinder.com/data/icons/

Crossroad Labs 850 Dec 2, 2022