├── .gitignore ├── S Responses ├── Assets.xcassets │ ├── Contents.json │ ├── Launch Screen │ │ ├── Contents.json │ │ ├── launchImage.appiconset │ │ │ ├── AppIcon-1024.png │ │ │ └── Contents.json │ │ └── backgroundColour.colorset │ │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── AppIcon-1024.png │ │ ├── AppIcon-20@2x.png │ │ ├── AppIcon-20@3x.png │ │ ├── AppIcon-29@2x.png │ │ ├── AppIcon-29@3x.png │ │ ├── AppIcon-40@2x.png │ │ ├── AppIcon-40@3x.png │ │ ├── AppIcon-60@2x.png │ │ ├── AppIcon-60@3x.png │ │ ├── AppIcon-ipad-20.png │ │ ├── AppIcon-ipad-29.png │ │ ├── AppIcon-ipad-40.png │ │ ├── AppIcon-ipad-76.png │ │ ├── AppIcon-ipad-20@2x.png │ │ ├── AppIcon-ipad-40@2x.png │ │ ├── AppIcon-ipad-76@2x.png │ │ ├── AppIcon-ipad-83.5@2x.png │ │ └── Contents.json │ ├── CC BY SA Licence.imageset │ │ ├── by-sa licence.png │ │ └── Contents.json │ └── AccentColor.colorset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── S_ResponsesApp.swift ├── S Responses.entitlements ├── Helpers │ └── CoreData │ │ └── DataModel.xcdatamodeld │ │ └── DataModel.xcdatamodel │ │ └── contents ├── Views │ ├── SubView.swift │ ├── MainView.swift │ ├── SettingsView.swift │ ├── GlossaryView.swift │ └── Helpers │ │ └── ResponsesEnum.swift └── Info.plist ├── HTTPS Responses.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcuserdata │ │ └── keets.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ └── keets.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── xcshareddata │ └── xcbaselines │ │ └── 3207F47326C494E500D90D50.xcbaseline │ │ ├── Info.plist │ │ └── 6E2FBCA4-1FC9-4F79-9B40-759DBE2DA29A.plist └── project.pbxproj ├── SECURITY.md ├── OneSignalNotificationServiceExtension ├── OneSignalNotificationServiceExtension.entitlements ├── Info.plist └── NotificationService.swift ├── S ResponsesTests ├── Info.plist └── S_ResponsesTests.swift ├── S ResponsesUITests ├── Info.plist └── S_ResponsesUITests.swift └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | S Responses/Helpers/Algolia.swift 3 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/Launch Screen/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /S Responses/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-83.5@2x.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/CC BY SA Licence.imageset/by-sa licence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/CC BY SA Licence.imageset/by-sa licence.png -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/Launch Screen/launchImage.appiconset/AppIcon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/S Responses/Assets.xcassets/Launch Screen/launchImage.appiconset/AppIcon-1024.png -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/xcuserdata/keets.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/project.xcworkspace/xcuserdata/keets.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Person2099/HTTPS-Responses/HEAD/HTTPS Responses.xcodeproj/project.xcworkspace/xcuserdata/keets.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "universal", 6 | "reference" : "systemBlueColor" 7 | }, 8 | "idiom" : "universal" 9 | } 10 | ], 11 | "info" : { 12 | "author" : "xcode", 13 | "version" : 1 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/Launch Screen/launchImage.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIcon-1024.png", 5 | "idiom" : "ios-marketing", 6 | "scale" : "1x", 7 | "size" : "1024x1024" 8 | } 9 | ], 10 | "info" : { 11 | "author" : "xcode", 12 | "version" : 1 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /S Responses/S_ResponsesApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // S_ResponsesApp.swift 3 | // S Responses 4 | // 5 | // Created by Sebastian Keet on 12/8/21. 6 | // 7 | 8 | //MARK: Import Dependencies 9 | import SwiftUI 10 | 11 | // Define App 12 | @main 13 | struct S_ResponsesApp: App { 14 | var body: some Scene { 15 | WindowGroup { 16 | MainView() 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | | Version | Supported | 6 | | ----------------- | ------------------ | 7 | | 1.0 RELEASE | :white_check_mark: | 8 | | 1.0 (9) BETA | :white_check_mark: | 9 | | <= 1.0 (8) BETA | :x: | 10 | 11 | ## Reporting a Vulnerability 12 | To report a vulnerability please use the 'report an issue' form in the app's settings 13 | -------------------------------------------------------------------------------- /OneSignalNotificationServiceExtension/OneSignalNotificationServiceExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.com.person2099.HTTPS-Responses.onesignal 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /S Responses/S Responses.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.security.application-groups 8 | 9 | group.com.person2099.HTTPS-Responses.onesignal 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/CC BY SA Licence.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "filename" : "by-sa licence.png", 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /S Responses/Helpers/CoreData/DataModel.xcdatamodeld/DataModel.xcdatamodel/contents: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/Launch Screen/backgroundColour.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "platform" : "ios", 6 | "reference" : "systemBackgroundColor" 7 | }, 8 | "idiom" : "universal" 9 | }, 10 | { 11 | "appearances" : [ 12 | { 13 | "appearance" : "luminosity", 14 | "value" : "dark" 15 | } 16 | ], 17 | "color" : { 18 | "platform" : "ios", 19 | "reference" : "systemBackgroundColor" 20 | }, 21 | "idiom" : "universal" 22 | } 23 | ], 24 | "info" : { 25 | "author" : "xcode", 26 | "version" : 1 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/xcshareddata/xcbaselines/3207F47326C494E500D90D50.xcbaseline/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | runDestinationsByUUID 6 | 7 | 6E2FBCA4-1FC9-4F79-9B40-759DBE2DA29A 8 | 9 | targetArchitecture 10 | arm64 11 | targetDevice 12 | 13 | modelCode 14 | iPhone10,2 15 | platformIdentifier 16 | com.apple.platform.iphoneos 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/xcuserdata/keets.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | HTTPS Responses.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | OneSignalNotificationServiceExtension.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 1 16 | 17 | S Responses.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 1 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/xcshareddata/xcbaselines/3207F47326C494E500D90D50.xcbaseline/6E2FBCA4-1FC9-4F79-9B40-759DBE2DA29A.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | classNames 6 | 7 | S_ResponsesUITests 8 | 9 | testLaunchPerformance() 10 | 11 | com.apple.dt.XCTMetric_ApplicationLaunch-AppLaunch.duration 12 | 13 | baselineAverage 14 | 2.8597 15 | baselineIntegrationDisplayName 16 | Local Baseline 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /S ResponsesTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /S ResponsesUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /OneSignalNotificationServiceExtension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | OneSignalNotificationServiceExtension 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSExtension 24 | 25 | NSExtensionPointIdentifier 26 | com.apple.usernotifications.service 27 | NSExtensionPrincipalClass 28 | $(PRODUCT_MODULE_NAME).NotificationService 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /S ResponsesTests/S_ResponsesTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // S_ResponsesTests.swift 3 | // S ResponsesTests 4 | // 5 | // Created by Sebastian Keet on 12/8/21. 6 | // 7 | 8 | import XCTest 9 | //@testable import HTTP_S_Responses 10 | 11 | class S_ResponsesTests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | } 16 | 17 | override func tearDownWithError() throws { 18 | // Put teardown code here. This method is called after the invocation of each test method in the class. 19 | } 20 | 21 | func testExample() throws { 22 | var doubleDef: Bool = false 23 | for response in ResponsesEnum.allCases { 24 | doubleDef = response.detailedDef == response.simplifiedDef 25 | } 26 | XCTAssert(!doubleDef) 27 | // This is an example of a functional test case. 28 | // Use XCTAssert and related functions to verify your tests produce the correct results. 29 | } 30 | 31 | func testPerformanceExample() throws { 32 | // This is an example of a performance test case. 33 | self.measure { 34 | // Put the code you want to measure the time of here. 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /S Responses/Views/SubView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubView.swift 3 | // HTTPS Responses 4 | // 5 | // Created by Sebastian Keet on 6/9/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SubView: View { 11 | let response: ResponsesEnum 12 | 13 | var body: some View { 14 | VStack { 15 | HStack { 16 | Text(response.responseCodeTitle) 17 | .font(.title2.bold()) 18 | .padding([.leading, .bottom]) 19 | Spacer() 20 | } 21 | 22 | HStack { 23 | Text(response.responseCodeType) 24 | .bold() 25 | Spacer() 26 | Text("This is \(response.responseCodeTypeGramaticalAnA) \(response.responseCodeType) response type") 27 | .font(.footnote) 28 | } 29 | .padding() 30 | .background(response.responseCodeColour.opacity(0.25)) 31 | .clipShape(RoundedRectangle(cornerRadius: 10.0)) 32 | .padding(.horizontal) 33 | 34 | ScrollView { 35 | Text(response.simplifiedDef) 36 | .padding() 37 | .fontWeight(.medium) 38 | 39 | 40 | Text(response.detailedDef) 41 | .padding() 42 | .font(.subheadline) 43 | } 44 | 45 | }.navigationTitle(response.responseCode) 46 | } 47 | } 48 | 49 | #Preview { 50 | NavigationStack { 51 | SubView(response: .r100) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HTTPS-Responses 2 | Our app is avaliable here: https://apps.apple.com/us/app/http-s-responses/id1580906147 3 | 4 | The app will be released from preorder on Friday 9th September 5 | 6 | Find our website here: https://httpsresponselookup.onuniverse.com/. The website was created using Universe (https://www.onuniverse.com) and fulfills the neccesary requirements for beta testing via TestFlight, namely a privacy policy. 7 | 8 | ## Contributors 9 | ### @Person2099 (https://github.com/Person2099) is Sebastian. 10 | ### @Person2098 (https://github.com/Person2098) is Hunter. 11 | ### @Person2097 (https://github.com/Person2097) is Luke. 12 | 13 | ## Main Application Files 14 | To find the main application files open the `S Responses` Folder. 15 | The View Files will be in the encapsulated `UIViews` Folder and most other notable files can be found in the encapsulated `Helpers` folder. 16 | 17 | ## Tests 18 | The files used for testing reside in the `S ResponsesTests` and `S ResponsesUITests` folders. 19 | 20 | ## Dependencies 21 | ### External Packages 22 | This application relies on the following external swift packages: 23 | - `SwiftUIX` - https://github.com/OneSignal/OneSignal-XCFramework.git (Open Source) ✅ (Secure) 🔐 24 | - `SwiftUIKit` - https://github.com/danielsaidi/SwiftUIKit.git (Open Source) ✅ (Secure) 🔐 25 | - `OneSignalXCFramework` - https://github.com/SwiftUIX/SwiftUIX.git (Open Source) ✅ (Secure) 🔐 26 | - `Sentry` - https://github.com/getsentry/sentry-cocoa.git (Open Source) ✅ (Secure) 🔐 27 | 28 | ### Fonts 29 | Font files (.ttf) can be found under `S Responses` in the `Fonts` folder. 30 | 31 | ### Other Assets (Appicon Images Etc.) 32 | Most other assets can be found in the `Assets.xcassets` folder. 33 | This can be found in the `S Responses folder` 34 | 35 | ## Notification Controller 36 | Most code powering notification handling and controlling can be found in the `OneSignalNotificationServiceExtension` folder. 37 | 38 | ## Other Metadata 39 | Most metadata relating to the application can be found in the `S Responses.xcodeproj` folder. Almost all metadata is compiled and therefore is not human readable in the format shown. 40 | 41 | ## Issues 42 | Feel free to report any issues in the issues tab of this Github Repo. 43 | 44 | ## Releases 45 | Most application binaries can be found in the releases section of this Github Repo. 46 | 47 | -------------------------------------------------------------------------------- /OneSignalNotificationServiceExtension/NotificationService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NotificationService.swift 3 | // OneSignalNotificationServiceExtension 4 | // 5 | // Created by Sebastian Keet on 20/8/21. 6 | // 7 | 8 | import UserNotifications 9 | 10 | import OneSignal 11 | 12 | class NotificationService: UNNotificationServiceExtension { 13 | 14 | var contentHandler: ((UNNotificationContent) -> Void)? 15 | var receivedRequest: UNNotificationRequest! 16 | var bestAttemptContent: UNMutableNotificationContent? 17 | 18 | override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { 19 | self.receivedRequest = request 20 | self.contentHandler = contentHandler 21 | self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) 22 | 23 | if let bestAttemptContent = bestAttemptContent { 24 | //If your SDK version is < 3.5.0 uncomment and use this code: 25 | /* 26 | OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent) 27 | contentHandler(bestAttemptContent) 28 | */ 29 | 30 | /* DEBUGGING: Uncomment the 2 lines below to check this extension is excuting 31 | Note, this extension only runs when mutable-content is set 32 | Setting an attachment or action buttons automatically adds this */ 33 | //OneSignal.setLogLevel(.LL_VERBOSE, visualLevel: .LL_NONE) 34 | //bestAttemptContent.body = "[Modified] " + bestAttemptContent.body 35 | 36 | OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: bestAttemptContent, withContentHandler: self.contentHandler) 37 | } 38 | } 39 | 40 | override func serviceExtensionTimeWillExpire() { 41 | // Called just before the extension will be terminated by the system. 42 | // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. 43 | if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { 44 | OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent) 45 | contentHandler(bestAttemptContent) 46 | } 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /S Responses/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | HTTP/S Responses 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | ITSAppUsesNonExemptEncryption 24 | 25 | LSRequiresIPhoneOS 26 | 27 | NSLocationAlwaysAndWhenInUseUsageDescription 28 | We do not require your location. 29 | NSLocationUsageDescription 30 | We do not require your location. 31 | NSLocationWhenInUseUsageDescription 32 | We do not require your location. 33 | UIAppFonts 34 | 35 | bahnschrift.ttf 36 | 37 | UIApplicationSceneManifest 38 | 39 | UIApplicationSupportsMultipleScenes 40 | 41 | 42 | UIApplicationSupportsIndirectInputEvents 43 | 44 | UIBackgroundModes 45 | 46 | remote-notification 47 | 48 | UILaunchScreen 49 | 50 | UIColorName 51 | backgroundColour 52 | UIImageName 53 | launchImage 54 | UIImageRespectsSafeAreaInsets 55 | 56 | 57 | UIRequiredDeviceCapabilities 58 | 59 | armv7 60 | 61 | UISupportedInterfaceOrientations 62 | 63 | UIInterfaceOrientationPortrait 64 | 65 | UISupportedInterfaceOrientations~ipad 66 | 67 | UIInterfaceOrientationPortrait 68 | UIInterfaceOrientationPortraitUpsideDown 69 | UIInterfaceOrientationLandscapeLeft 70 | UIInterfaceOrientationLandscapeRight 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /S Responses/Views/MainView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainView.swift 3 | // HTTPS Responses 4 | // 5 | // Created by Sebastian Keet on 6/9/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct MainView: View { 11 | @State var searchText: String = "404" 12 | @State var showGlossarySheet: Bool = false 13 | @State var showSettingsSheet: Bool = false 14 | 15 | var body: some View { 16 | NavigationStack { 17 | VStack { 18 | Text("HTTP/S Response Code Lookup") 19 | .font(.largeTitle) 20 | .bold() 21 | .multilineTextAlignment(.center) 22 | 23 | List { 24 | ForEach(ResponsesEnum.allCases) { response in 25 | NavigationLink(destination: SubView(response: response)) { 26 | HStack { 27 | Text(response.responseCode) 28 | .foregroundStyle(response.responseCodeColour) 29 | .fontWeight(.black) 30 | Spacer() 31 | Text(response.responseCodeTitle) 32 | } 33 | .bold() 34 | } 35 | } 36 | }.listStyle(.plain) 37 | } 38 | .toolbar(content: { 39 | ToolbarItem(placement: .secondaryAction) { 40 | Button(action: { showGlossarySheet.toggle() }, label: { 41 | HStack { 42 | Image(systemName: "book.circle") 43 | Text("Glossary") 44 | }.font(.caption) 45 | .bold() 46 | }) 47 | } 48 | ToolbarItem(placement: .secondaryAction) { 49 | Button(action: { showSettingsSheet.toggle() }, label: { 50 | HStack { 51 | Image(systemName: "gear") 52 | Text("Settings") 53 | }.font(.caption) 54 | .bold() 55 | }) 56 | } 57 | }) 58 | .sheet(isPresented: $showGlossarySheet, content: { 59 | NavigationStack { 60 | GlossaryView() 61 | } 62 | }) 63 | .sheet(isPresented: $showSettingsSheet, content: { 64 | NavigationStack { 65 | SettingsView() 66 | } 67 | }) 68 | } 69 | } 70 | } 71 | 72 | #Preview { 73 | MainView() 74 | } 75 | -------------------------------------------------------------------------------- /S Responses/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "AppIcon-20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "AppIcon-20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "20x20", 17 | "idiom" : "ipad", 18 | "filename" : "AppIcon-ipad-20.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "20x20", 23 | "idiom" : "ipad", 24 | "filename" : "AppIcon-ipad-20@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "AppIcon-29@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "29x29", 35 | "idiom" : "iphone", 36 | "filename" : "AppIcon-29@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "AppIcon-40@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "40x40", 47 | "idiom" : "iphone", 48 | "filename" : "AppIcon-40@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "AppIcon-60@2x.png", 55 | "scale" : "2x" 56 | }, 57 | { 58 | "size" : "60x60", 59 | "idiom" : "iphone", 60 | "filename" : "AppIcon-60@3x.png", 61 | "scale" : "3x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "AppIcon-ipad-29.png", 67 | "scale" : "1x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "AppIcon-29@2x.png", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "AppIcon-ipad-40.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "AppIcon-ipad-40@2x.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "76x76", 89 | "idiom" : "ipad", 90 | "filename" : "AppIcon-ipad-76.png", 91 | "scale" : "1x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "AppIcon-ipad-76@2x.png", 97 | "scale" : "2x" 98 | }, 99 | { 100 | "size" : "83.5x83.5", 101 | "idiom" : "ipad", 102 | "filename" : "AppIcon-ipad-83.5@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "1024x1024", 107 | "idiom" : "ios-marketing", 108 | "filename" : "AppIcon-1024.png", 109 | "scale" : "1x" 110 | } 111 | ], 112 | "info" : { 113 | "version" : 1, 114 | "author" : "xcode" 115 | } 116 | } -------------------------------------------------------------------------------- /S Responses/Views/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // HTTPS Responses 4 | // 5 | // Created by Sebastian Keet on 6/9/2023. 6 | // 7 | 8 | import SwiftUI 9 | import StoreKit 10 | 11 | struct SettingsView: View { 12 | 13 | //MARK: Define Variables 14 | @Environment(\.requestReview) var requestReview 15 | @State var darkModeOption = false 16 | @State var darkModeUseSystemSettingsOption = true 17 | 18 | //MARK: View 19 | var body: some View { 20 | ZStack { // ZStack allowing the background to be shown behind the general view 21 | Color(.systemBackground) // Background Colour 22 | .ignoresSafeArea() // Ignores Safe Area (Interactable) Boundaries filling the whole screen 23 | VStack { 24 | Form(content: { 25 | // About Section 26 | Section(header: Text("About")) { 27 | // Current App Version 28 | HStack { 29 | Image(systemName: "questionmark.circle") 30 | Text("Version: \(UIDevice.current.systemVersion)") 31 | .foregroundColor(.primary) 32 | .font(.headline) 33 | } 34 | 35 | Link(destination: URL(string: "https://httpsresponselookup.onuniverse.com/privacy-policy")!, label: { 36 | HStack { 37 | Image(systemName: "hand.raised") 38 | Text("Privacy Policy") 39 | .font(.headline) 40 | } 41 | }) 42 | 43 | // TODO: Update Link to Rating 44 | // Rate Us Button (Will link to app store however currently forwards to website) 45 | Button(action: { requestReview() }, label: { 46 | HStack { 47 | Image(systemName: "star.leadinghalf.fill") 48 | Text("Rate Our App") 49 | .font(.headline) 50 | } 51 | }) 52 | 53 | } 54 | 55 | // Link to Report an Issue 56 | Section { 57 | Link(destination: URL(string: "https://httpsresponses.typeform.com/app-feedback")!, label: { 58 | HStack { 59 | Image(systemName: "exclamationmark.triangle") 60 | .foregroundColor(.red) 61 | .font(.headline) 62 | Text("Report an Issue") 63 | .font(.headline) 64 | .foregroundColor(.primary) 65 | } 66 | }) 67 | } 68 | 69 | Section() { 70 | Link(destination: URL(string: "https://creativecommons.org/licenses/by-sa/4.0/")!, label: { 71 | VStack { 72 | Image("CC BY SA Licence") 73 | .padding(.top) 74 | .multilineTextAlignment(.center) 75 | Text("This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.") 76 | .multilineTextAlignment(.center) 77 | .fixedSize(horizontal: false, vertical: true) 78 | .font(.callout) 79 | .fontWeight(.semibold) 80 | } 81 | }) 82 | } 83 | }) 84 | } 85 | .navigationTitle("Settings") 86 | } 87 | } 88 | } 89 | 90 | #Preview { 91 | NavigationStack { 92 | SettingsView() 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /S ResponsesUITests/S_ResponsesUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // S_ResponsesUITests.swift 3 | // S ResponsesUITests 4 | // 5 | // Created by Sebastian Keet on 12/8/21. 6 | // 7 | 8 | import XCTest 9 | 10 | class S_ResponsesUITests: XCTestCase { 11 | 12 | override func setUpWithError() throws { 13 | // Put setup code here. This method is called before the invocation of each test method in the class. 14 | 15 | // In UI tests it is usually best to stop immediately when a failure occurs. 16 | continueAfterFailure = false 17 | 18 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 19 | } 20 | 21 | override func tearDownWithError() throws { 22 | // Put teardown code here. This method is called after the invocation of each test method in the class. 23 | continueAfterFailure = false 24 | } 25 | 26 | func testOtherViews() throws { 27 | let app = XCUIApplication() 28 | app.launch() 29 | 30 | let homeButton = app.buttons["Home"] 31 | 32 | app.buttons["Response List"].tap() 33 | app.swipeUp(velocity: .fast) 34 | app.swipeDown(velocity: .fast) 35 | homeButton.tap() 36 | 37 | app.buttons["Settings"].tap() 38 | homeButton.tap() 39 | 40 | app.buttons["Glossary"].tap() 41 | app.swipeUp() 42 | app.swipeDown() 43 | homeButton.tap() 44 | } 45 | 46 | func testForDetailedDefPlaceholders() throws { 47 | 48 | let app = XCUIApplication() 49 | app.launch() 50 | 51 | let homeButton = app.buttons["Home"] 52 | 53 | let key0 = app.keys["0"] 54 | let key1 = app.keys["1"] 55 | let key2 = app.keys["2"] 56 | let key3 = app.keys["3"] 57 | let key4 = app.keys["4"] 58 | let key5 = app.keys["5"] 59 | let key6 = app.keys["6"] 60 | let key7 = app.keys["7"] 61 | let key8 = app.keys["8"] 62 | let key9 = app.keys["9"] 63 | 64 | let keyDict = ["0": key0, "1": key1, "2": key2, "3": key3, "4": key4, "5": key5, "6": key6, "7": key7, "8": key8, "9": key9] 65 | let responseCodes = ["100", "101", "102", "200", "201", "202", "203", "204", "205", "206", "207", "208", "226", "300", "301", "302", "303", "304", "305", "306", "307", "308", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "418", "420", "422", "423", "424", "425", "426", "428", "429", "431", "444", "449", "450", "451", "499", "500", "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "598", "599"] 66 | 67 | for code in responseCodes { 68 | app.textFields["Enter Code"].tap() 69 | 70 | for number in code { 71 | keyDict[String(number)]!.tap() 72 | } 73 | 74 | app.buttons["Search"].tap() 75 | // In DetailView Here 76 | 77 | let detailedDefPlaceholder = app.staticTexts["placeholder"] 78 | 79 | if homeButton.waitForExistence(timeout: 5) == false { 80 | XCTFail() 81 | } 82 | continueAfterFailure = true 83 | if detailedDefPlaceholder.exists { 84 | XCTFail("\(code) Contained Detailed Def Placeholder") 85 | } 86 | continueAfterFailure = false 87 | 88 | homeButton.tap() 89 | } 90 | } 91 | 92 | // This test will take an extended period of time 93 | func testResponseCodesExist() throws { 94 | // UI tests must launch the application that they test. 95 | 96 | let app = XCUIApplication() 97 | app.launch() 98 | 99 | let homeButton = app.buttons["Home"] 100 | 101 | let key0 = app.keys["0"] 102 | let key1 = app.keys["1"] 103 | let key2 = app.keys["2"] 104 | let key3 = app.keys["3"] 105 | let key4 = app.keys["4"] 106 | let key5 = app.keys["5"] 107 | let key6 = app.keys["6"] 108 | let key7 = app.keys["7"] 109 | let key8 = app.keys["8"] 110 | let key9 = app.keys["9"] 111 | 112 | let keyDict = ["0": key0, "1": key1, "2": key2, "3": key3, "4": key4, "5": key5, "6": key6, "7": key7, "8": key8, "9": key9] 113 | let responseCodes = ["100", "101", "102", "200", "201", "202", "203", "204", "205", "206", "207", "208", "226", "300", "301", "302", "303", "304", "305", "306", "307", "308", "400", "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "418", "420", "422", "423", "424", "425", "426", "428", "429", "431", "444", "449", "450", "451", "499", "500", "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "598", "599"] 114 | 115 | for code in responseCodes { 116 | app.textFields["Enter Code"].tap() 117 | 118 | for number in code { 119 | keyDict[String(number)]!.tap() 120 | } 121 | 122 | app.buttons["Search"].tap() 123 | 124 | homeButton.tap() 125 | } 126 | } 127 | 128 | func testLaunchPerformance() throws { 129 | if #available(iOS 14.5, *) { 130 | // This measures how long it takes to launch your application. 131 | measure(metrics: [XCTApplicationLaunchMetric()]) { 132 | XCUIApplication().launch() 133 | } 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /S Responses/Views/GlossaryView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlossaryView.swift 3 | // HTTPS Responses 4 | // 5 | // Created by Sebastian Keet on 6/9/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct GlossaryView: View { 11 | 12 | //MARK: View 13 | var body: some View { 14 | VStack { 15 | List() { 16 | RFCDefinition() // What is RFC 17 | 18 | HTTPDefinition() // What is HTTP 19 | 20 | StatusCodesDefinition() // What are HTTP Status Codes 21 | 22 | HTTPVersion1_1SpecDefinition() // The HTTP1/1 Spec 23 | 24 | UniformResourceIdentifierDefinition() // URI Def 25 | 26 | HTTPHeaderFields() // HTTP Header Fields 27 | 28 | OtherDefs() 29 | } 30 | }.navigationTitle("Glossary") 31 | } 32 | } 33 | 34 | //MARK: GlossaryView Extension 35 | // fileprivate tag only encapsulated functions to be accessed from this file 36 | fileprivate extension GlossaryView { 37 | 38 | // Opens input URL in web browser 39 | func visit(url: String) { 40 | if let url = URL(string: url) { 41 | UIApplication.shared.open(url) 42 | } else { 43 | // Handle Errors 44 | //logger.critical("Glossary URL Did Not Open (URL: \(url)") 45 | } 46 | } 47 | } 48 | 49 | //MARK: Concept Definitions 50 | // The following are the views for concepts 51 | 52 | //MARK: RFC 53 | struct RFCDefinition: View { 54 | var body: some View { 55 | Section() { 56 | DisclosureGroup("RFC (Request for Comments)") { 57 | Text("A Request for Comments is a uniquely numbered document that has been published by one of a limited group of authoritive bodies, most prominently the Internet Engineering Task Force (IETF) as well as the principal technical development and standards-setting bodies for the Internet. An RFC is a highly detailed workpiece documented and published by individuals or groups of engineers and computer scientists and describes new or updated internet standards. It is submitted either for peer review or to convey new concepts, information, or occasionally engineering humor. The IETF adopts some of the proposals published as RFCs as Internet Standards meaning they are used throughout the world wide web.") 58 | .font(.callout) 59 | .fontWeight(.regular) 60 | HStack { 61 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/Request_for_Comments")!, label: { 62 | HStack { 63 | Image(systemName: "hand.raised") 64 | Text("Read more on Wikipedia") 65 | } 66 | }) 67 | } 68 | //.foregroundColor(.link) 69 | .font(.headline) 70 | 71 | HStack { 72 | Link(destination: URL(string: "https://www.rfc-editor.org/retrieve/")!, label: { 73 | HStack { 74 | Image(systemName: "globe") 75 | Text("RFC Database") 76 | } 77 | }) 78 | } 79 | //.foregroundStyle(.link) 80 | .font(.headline) 81 | 82 | Text("Request for Comments. (2021, August 18). In Wikipedia. https://en.wikipedia.org/wiki/Request_for_Comments") 83 | .font(.footnote) 84 | .fontWeight(.thin) 85 | } 86 | .font(.title2) 87 | .bold() 88 | } 89 | .padding() 90 | } 91 | } 92 | 93 | //MARK: HTTP 94 | struct HTTPDefinition: View { 95 | var body: some View { 96 | Section() { 97 | DisclosureGroup("Hypertext Transfer Protocol (HTTP)") { 98 | Text("The Hypertext Transfer Protocol (HTTP) is an application layer protocol used to distribute interactive media. HTTP is the foundation of data communication for the World Wide Web. Development of HTTP was initiated by Tim Berners-Lee at CERN in 1989. Development of early HTTP Requests for Comments (RFCs) was a coordinated effort by the Internet Engineering Task Force (IETF) and the World Wide Web Consortium (W3C), with work later moving to the IETF. HTTP functions as a request–response protocol in the client–server computing model. A web browser, for example, may be the client and an application running on a computer hosting a website may be the server. The client submits an HTTP request message to the server. The server, which provides resources such as HTML files and other content, or performs other functions on behalf of the client, returns a response message to the client. The response contains completion status, information about the request and may also contain requested content in its message body.") 99 | .font(.callout) 100 | .fontWeight(.regular) 101 | 102 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol")!, label: { 103 | HStack { 104 | Image(systemName: "book") 105 | Text("Read more on Wikipedia") 106 | } 107 | }) 108 | //.foregroundColor(.link) 109 | .font(.headline) 110 | 111 | Text("Hypertext Transfer Protocol. (2021, August 30). In Wikipedia. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol") 112 | .font(.footnote) 113 | .fontWeight(.thin) 114 | } 115 | .font(.title2) 116 | .bold() 117 | 118 | } 119 | .padding() 120 | } 121 | } 122 | 123 | //MARK: HTTP Status Codes 124 | struct StatusCodesDefinition: View { 125 | var body: some View { 126 | Section() { 127 | DisclosureGroup("HTTP Status Codes") { 128 | Text("Status codes are issued by a server in response to a client's request made to the server. It includes codes from IETF Request for Comments (RFCs), other specifications, and some additional codes used in some common applications of the HTTP. The first digit of the status code specifies one of five standard classes of responses. The message phrases shown are typical, but any human-readable alternative may be provided. Unless otherwise stated, the status code is part of the HTTP/1.1 standard (RFC 7231).\nThe Internet Assigned Numbers Authority (IANA) maintains the official registry of HTTP status codes.") 129 | .font(.callout) 130 | .fontWeight(.regular) 131 | 132 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol")!, label: { 133 | HStack { 134 | Image(systemName: "book") 135 | Text("Read more on Wikipedia") 136 | } 137 | }) 138 | //.foregroundColor(.link) 139 | .font(.headline) 140 | 141 | Link(destination: URL(string: "https://datatracker.ietf.org/doc/html/rfc7231#section-6")!, label: { 142 | HStack { 143 | Image(systemName: "globe") 144 | Text("RFC7231 HTTP/1.1 - Section 6, Response Status Codes") 145 | } 146 | }) 147 | //.foregroundColor(.link) 148 | .font(.headline) 149 | 150 | Text("List of HTTP Status Codes. (2021, August 16). In Wikipedia. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes") 151 | .font(.footnote) 152 | .fontWeight(.thin) 153 | } 154 | .font(.title2) 155 | .bold() 156 | } 157 | .padding() 158 | } 159 | } 160 | 161 | //MARK: HTTP1/1 Specification 162 | struct HTTPVersion1_1SpecDefinition: View { 163 | var body: some View { 164 | Section() { 165 | DisclosureGroup("HTTP1/1 Specification") { 166 | Text("HTTP/1.1 is a revision of the original HTTP (HTTP/1.0). In HTTP/1.0 a separate connection to the same server is made for every resource request. HTTP/1.1 can reuse a connection multiple times to download images, scripts, stylesheets, etc after the page has been delivered. HTTP/1.1 communications therefore experience less latency as the establishment of TCP connections presents considerable overhead.") 167 | .font(.callout) 168 | .fontWeight(.regular) 169 | 170 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol")!, label: { 171 | HStack { 172 | Image(systemName: "book") 173 | Text("Read more on Wikipedia") 174 | } 175 | }) 176 | //.foregroundColor(.link) 177 | .font(.headline) 178 | 179 | Text("Hypertext Transfer Protocol. (2021, August 30). In Wikipedia. https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol") 180 | .font(.footnote) 181 | .fontWeight(.thin) 182 | } 183 | .font(.title2) 184 | .bold() 185 | } 186 | .padding() 187 | } 188 | } 189 | 190 | //MARK: Uniform Resource Identifier (URI) 191 | struct UniformResourceIdentifierDefinition: View { 192 | var body: some View { 193 | Section() { 194 | DisclosureGroup("Uniform Resource Identifier (URI)") { 195 | Text("A Uniform Resource Identifier (URI) is a unique sequence of characters that identifies a logical or physical resource used by web technologies. URIs may be used to identify anything, including real-world objects, such as people and places, concepts, or information resources such as web pages and books. Some URIs provide a means of locating and retrieving information resources on a network these an example of these are Uniform Resource Locators (URLs). Another example is the URI belonging to each file on your computer which allows your computer to find everything.") 196 | .font(.callout) 197 | .fontWeight(.regular) 198 | 199 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/Uniform_Resource_Identifier")!, label: { 200 | HStack { 201 | Image(systemName: "book") 202 | Text("Read more on Wikipedia") 203 | } 204 | }) 205 | //.foregroundColor(.link) 206 | .font(.headline) 207 | 208 | Text("Uniform Resource Identifier. (2021, August 21). In Wikipedia. https://en.wikipedia.org/wiki/Uniform_Resource_Identifier") 209 | .font(.footnote) 210 | .fontWeight(.thin) 211 | } 212 | .font(.title2) 213 | .bold() 214 | } 215 | .padding() 216 | } 217 | } 218 | 219 | //MARK: HTTP Header Fields 220 | struct HTTPHeaderFields: View { 221 | var body: some View { 222 | Section() { 223 | DisclosureGroup("HTTP Header Fields") { 224 | Text("HTTP header fields are a list of linefeed-separated HTTP data being sent and received by both the client program and server on every HTTP request. These headers are usually invisible to the end-user and are only visible to the backend programs and people maintaining the internet system. They define how information sent/received through the connection are encoded (as in Accept-Encoding), the session verification and identification of the client (as in browser cookies, IP address, user-agent) or their anonymity thereof (VPN or proxy masking, user-agent spoofing), how the server should handle data (as in Do-Not-Track), the age of the document being downloaded, amongst others.") 225 | .font(.callout) 226 | .fontWeight(.regular) 227 | 228 | Link(destination: URL(string: "https://en.wikipedia.org/wiki/List_of_HTTP_header_fields")!, label: { 229 | HStack { 230 | Image(systemName: "book") 231 | Text("Read more on Wikipedia") 232 | } 233 | }) 234 | //.foregroundColor(.link) 235 | .font(.headline) 236 | 237 | Text("List of HTTP header fields. (2021, August 13). In Wikipedia. https://en.wikipedia.org/wiki/List_of_HTTP_header_fields") 238 | .font(.footnote) 239 | .fontWeight(.thin) 240 | } 241 | .font(.title2) 242 | .bold() 243 | } 244 | .padding() 245 | } 246 | } 247 | 248 | //MARK: Other Definitions 249 | struct OtherDefs: View { 250 | var body: some View { 251 | Section() { 252 | DisclosureGroup("Other Definitions") { 253 | DisclosureGroup("Metainformation") { 254 | Text("Metainformation is information about information. For example, a if a document is considered to be information, its title, location, and subject are examples of metainformation. This term is sometimes used interchangably with the term metadata.") 255 | .font(.body) 256 | .fontWeight(.regular) 257 | } 258 | .font(.callout) 259 | .bold() 260 | 261 | DisclosureGroup("E-Tag") { 262 | Text("The E-Tag or entity tag is part of HTTP. It is one of several mechanisms that HTTP provides for Web cache validation, which allows a client to make conditional requests. This mechanism allows caches to be more efficient and saves bandwidth, as a Web server does not need to send a full response if the content has not changed. ETags can also be used for optimistic concurrency control to help prevent simultaneous updates of a resource from overwriting each other.") 263 | .font(.body) 264 | .fontWeight(.regular) 265 | } 266 | .font(.callout) 267 | .bold() 268 | 269 | DisclosureGroup("WebDAV") { 270 | Text("WebDAV is an extension of the Hypertext Transfer Protocol (HTTP) that allows clients to perform remote Web content authoring operations. WebDAV is defined in RFC 4918 by a working group of the Internet Engineering Task Force. The WebDAV protocol provides a framework for users to create, change and move documents on a server.") 271 | .font(.body) 272 | .fontWeight(.regular) 273 | } 274 | .font(.callout) 275 | .bold() 276 | 277 | DisclosureGroup("Internet Protocol Suite") { 278 | Text("The Internet protocol suite, commonly known as TCP/IP, is the set of communications protocols used in the Internet and similar computer networks. The current foundational protocols in the suite are the Transmission Control Protocol (TCP) and the Internet Protocol (IP).") 279 | .font(.body) 280 | .fontWeight(.regular) 281 | } 282 | .font(.callout) 283 | .bold() 284 | } 285 | .font(.title2) 286 | .bold() 287 | } 288 | .padding() 289 | } 290 | } 291 | 292 | #Preview { 293 | NavigationStack { 294 | GlossaryView() 295 | } 296 | } 297 | -------------------------------------------------------------------------------- /HTTPS Responses.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3207F45C26C494E300D90D50 /* S_ResponsesApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3207F45B26C494E300D90D50 /* S_ResponsesApp.swift */; }; 11 | 3207F46026C494E500D90D50 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3207F45F26C494E500D90D50 /* Assets.xcassets */; }; 12 | 3207F46326C494E500D90D50 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3207F46226C494E500D90D50 /* Preview Assets.xcassets */; }; 13 | 3207F46E26C494E500D90D50 /* S_ResponsesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3207F46D26C494E500D90D50 /* S_ResponsesTests.swift */; }; 14 | 3207F47926C494E500D90D50 /* S_ResponsesUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3207F47826C494E500D90D50 /* S_ResponsesUITests.swift */; }; 15 | 32A19B7D2AA7E9DA000433A8 /* ResponsesEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B7C2AA7E9DA000433A8 /* ResponsesEnum.swift */; }; 16 | 32A19B7F2AA7F746000433A8 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B7E2AA7F746000433A8 /* MainView.swift */; }; 17 | 32A19B812AA7FC0B000433A8 /* SubView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B802AA7FC0B000433A8 /* SubView.swift */; }; 18 | 32A19B832AA7FEB2000433A8 /* GlossaryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B822AA7FEB2000433A8 /* GlossaryView.swift */; }; 19 | 32A19B842AA85E8A000433A8 /* ResponsesEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B7C2AA7E9DA000433A8 /* ResponsesEnum.swift */; }; 20 | 32A19B862AA85FDD000433A8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32A19B852AA85FDD000433A8 /* SettingsView.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 3207F46A26C494E500D90D50 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 3207F45026C494E300D90D50 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 3207F45726C494E300D90D50; 29 | remoteInfo = "S Responses"; 30 | }; 31 | 3207F47526C494E500D90D50 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 3207F45026C494E300D90D50 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 3207F45726C494E300D90D50; 36 | remoteInfo = "S Responses"; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXCopyFilesBuildPhase section */ 41 | 329CC1A126CF71B40056CE4D /* Embed Foundation Extensions */ = { 42 | isa = PBXCopyFilesBuildPhase; 43 | buildActionMask = 2147483647; 44 | dstPath = ""; 45 | dstSubfolderSpec = 13; 46 | files = ( 47 | ); 48 | name = "Embed Foundation Extensions"; 49 | runOnlyForDeploymentPostprocessing = 0; 50 | }; 51 | /* End PBXCopyFilesBuildPhase section */ 52 | 53 | /* Begin PBXFileReference section */ 54 | 3207F45826C494E300D90D50 /* HTTPS Responses.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "HTTPS Responses.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 3207F45B26C494E300D90D50 /* S_ResponsesApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = S_ResponsesApp.swift; sourceTree = ""; }; 56 | 3207F45F26C494E500D90D50 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 57 | 3207F46226C494E500D90D50 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 58 | 3207F46426C494E500D90D50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | 3207F46926C494E500D90D50 /* HTTPS ResponsesTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HTTPS ResponsesTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | 3207F46D26C494E500D90D50 /* S_ResponsesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = S_ResponsesTests.swift; sourceTree = ""; }; 61 | 3207F46F26C494E500D90D50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 62 | 3207F47426C494E500D90D50 /* HTTPS ResponsesUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "HTTPS ResponsesUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | 3207F47826C494E500D90D50 /* S_ResponsesUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = S_ResponsesUITests.swift; sourceTree = ""; }; 64 | 3207F47A26C494E500D90D50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65 | 329CC19126CF6DF20056CE4D /* S Responses.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "S Responses.entitlements"; sourceTree = ""; }; 66 | 329CC19826CF71B40056CE4D /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 67 | 329CC19A26CF71B40056CE4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 68 | 329CC1A926CF74B60056CE4D /* OneSignalNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OneSignalNotificationServiceExtension.entitlements; sourceTree = ""; }; 69 | 32A19B7C2AA7E9DA000433A8 /* ResponsesEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponsesEnum.swift; sourceTree = ""; }; 70 | 32A19B7E2AA7F746000433A8 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; 71 | 32A19B802AA7FC0B000433A8 /* SubView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubView.swift; sourceTree = ""; }; 72 | 32A19B822AA7FEB2000433A8 /* GlossaryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlossaryView.swift; sourceTree = ""; }; 73 | 32A19B852AA85FDD000433A8 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; 74 | /* End PBXFileReference section */ 75 | 76 | /* Begin PBXFrameworksBuildPhase section */ 77 | 3207F45526C494E300D90D50 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | 3207F46626C494E500D90D50 /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | 3207F47126C494E500D90D50 /* Frameworks */ = { 92 | isa = PBXFrameworksBuildPhase; 93 | buildActionMask = 2147483647; 94 | files = ( 95 | ); 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | /* End PBXFrameworksBuildPhase section */ 99 | 100 | /* Begin PBXGroup section */ 101 | 3207F44F26C494E300D90D50 = { 102 | isa = PBXGroup; 103 | children = ( 104 | 3207F45A26C494E300D90D50 /* S Responses */, 105 | 3207F46C26C494E500D90D50 /* S ResponsesTests */, 106 | 3207F47726C494E500D90D50 /* S ResponsesUITests */, 107 | 329CC19726CF71B40056CE4D /* OneSignalNotificationServiceExtension */, 108 | 3207F45926C494E300D90D50 /* Products */, 109 | 324E1F1926CB8EFC00EB9E07 /* Frameworks */, 110 | ); 111 | sourceTree = ""; 112 | }; 113 | 3207F45926C494E300D90D50 /* Products */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 3207F45826C494E300D90D50 /* HTTPS Responses.app */, 117 | 3207F46926C494E500D90D50 /* HTTPS ResponsesTests.xctest */, 118 | 3207F47426C494E500D90D50 /* HTTPS ResponsesUITests.xctest */, 119 | ); 120 | name = Products; 121 | sourceTree = ""; 122 | }; 123 | 3207F45A26C494E300D90D50 /* S Responses */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 329CC19126CF6DF20056CE4D /* S Responses.entitlements */, 127 | 3207F45B26C494E300D90D50 /* S_ResponsesApp.swift */, 128 | 32A19B7B2AA7E99E000433A8 /* Helpers */, 129 | 32A19B7A2AA7E98B000433A8 /* Views */, 130 | 3207F45F26C494E500D90D50 /* Assets.xcassets */, 131 | 3207F46426C494E500D90D50 /* Info.plist */, 132 | 3207F46126C494E500D90D50 /* Preview Content */, 133 | ); 134 | path = "S Responses"; 135 | sourceTree = ""; 136 | }; 137 | 3207F46126C494E500D90D50 /* Preview Content */ = { 138 | isa = PBXGroup; 139 | children = ( 140 | 3207F46226C494E500D90D50 /* Preview Assets.xcassets */, 141 | ); 142 | path = "Preview Content"; 143 | sourceTree = ""; 144 | }; 145 | 3207F46C26C494E500D90D50 /* S ResponsesTests */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 3207F46D26C494E500D90D50 /* S_ResponsesTests.swift */, 149 | 3207F46F26C494E500D90D50 /* Info.plist */, 150 | ); 151 | path = "S ResponsesTests"; 152 | sourceTree = ""; 153 | }; 154 | 3207F47726C494E500D90D50 /* S ResponsesUITests */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 3207F47826C494E500D90D50 /* S_ResponsesUITests.swift */, 158 | 3207F47A26C494E500D90D50 /* Info.plist */, 159 | ); 160 | path = "S ResponsesUITests"; 161 | sourceTree = ""; 162 | }; 163 | 324E1F1926CB8EFC00EB9E07 /* Frameworks */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | ); 167 | name = Frameworks; 168 | sourceTree = ""; 169 | }; 170 | 329CC19726CF71B40056CE4D /* OneSignalNotificationServiceExtension */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 329CC1A926CF74B60056CE4D /* OneSignalNotificationServiceExtension.entitlements */, 174 | 329CC19826CF71B40056CE4D /* NotificationService.swift */, 175 | 329CC19A26CF71B40056CE4D /* Info.plist */, 176 | ); 177 | path = OneSignalNotificationServiceExtension; 178 | sourceTree = ""; 179 | }; 180 | 32A19B7A2AA7E98B000433A8 /* Views */ = { 181 | isa = PBXGroup; 182 | children = ( 183 | 32A19B7E2AA7F746000433A8 /* MainView.swift */, 184 | 32A19B802AA7FC0B000433A8 /* SubView.swift */, 185 | 32A19B822AA7FEB2000433A8 /* GlossaryView.swift */, 186 | 32A19B852AA85FDD000433A8 /* SettingsView.swift */, 187 | ); 188 | path = Views; 189 | sourceTree = ""; 190 | }; 191 | 32A19B7B2AA7E99E000433A8 /* Helpers */ = { 192 | isa = PBXGroup; 193 | children = ( 194 | 32A19B7C2AA7E9DA000433A8 /* ResponsesEnum.swift */, 195 | ); 196 | name = Helpers; 197 | path = Views/Helpers; 198 | sourceTree = ""; 199 | }; 200 | /* End PBXGroup section */ 201 | 202 | /* Begin PBXNativeTarget section */ 203 | 3207F45726C494E300D90D50 /* HTTPS Responses */ = { 204 | isa = PBXNativeTarget; 205 | buildConfigurationList = 3207F47D26C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS Responses" */; 206 | buildPhases = ( 207 | 3207F45426C494E300D90D50 /* Sources */, 208 | 3207F45526C494E300D90D50 /* Frameworks */, 209 | 3207F45626C494E300D90D50 /* Resources */, 210 | 329CC1A126CF71B40056CE4D /* Embed Foundation Extensions */, 211 | ); 212 | buildRules = ( 213 | ); 214 | dependencies = ( 215 | ); 216 | name = "HTTPS Responses"; 217 | packageProductDependencies = ( 218 | ); 219 | productName = "S Responses"; 220 | productReference = 3207F45826C494E300D90D50 /* HTTPS Responses.app */; 221 | productType = "com.apple.product-type.application"; 222 | }; 223 | 3207F46826C494E500D90D50 /* HTTPS ResponsesTests */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = 3207F48026C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS ResponsesTests" */; 226 | buildPhases = ( 227 | 3207F46526C494E500D90D50 /* Sources */, 228 | 3207F46626C494E500D90D50 /* Frameworks */, 229 | 3207F46726C494E500D90D50 /* Resources */, 230 | ); 231 | buildRules = ( 232 | ); 233 | dependencies = ( 234 | 3207F46B26C494E500D90D50 /* PBXTargetDependency */, 235 | ); 236 | name = "HTTPS ResponsesTests"; 237 | productName = "S ResponsesTests"; 238 | productReference = 3207F46926C494E500D90D50 /* HTTPS ResponsesTests.xctest */; 239 | productType = "com.apple.product-type.bundle.unit-test"; 240 | }; 241 | 3207F47326C494E500D90D50 /* HTTPS ResponsesUITests */ = { 242 | isa = PBXNativeTarget; 243 | buildConfigurationList = 3207F48326C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS ResponsesUITests" */; 244 | buildPhases = ( 245 | 3207F47026C494E500D90D50 /* Sources */, 246 | 3207F47126C494E500D90D50 /* Frameworks */, 247 | 3207F47226C494E500D90D50 /* Resources */, 248 | ); 249 | buildRules = ( 250 | ); 251 | dependencies = ( 252 | 3207F47626C494E500D90D50 /* PBXTargetDependency */, 253 | ); 254 | name = "HTTPS ResponsesUITests"; 255 | productName = "S ResponsesUITests"; 256 | productReference = 3207F47426C494E500D90D50 /* HTTPS ResponsesUITests.xctest */; 257 | productType = "com.apple.product-type.bundle.ui-testing"; 258 | }; 259 | /* End PBXNativeTarget section */ 260 | 261 | /* Begin PBXProject section */ 262 | 3207F45026C494E300D90D50 /* Project object */ = { 263 | isa = PBXProject; 264 | attributes = { 265 | BuildIndependentTargetsInParallel = YES; 266 | LastSwiftUpdateCheck = 1250; 267 | LastUpgradeCheck = 1500; 268 | TargetAttributes = { 269 | 3207F45726C494E300D90D50 = { 270 | CreatedOnToolsVersion = 12.5.1; 271 | }; 272 | 3207F46826C494E500D90D50 = { 273 | CreatedOnToolsVersion = 12.5.1; 274 | TestTargetID = 3207F45726C494E300D90D50; 275 | }; 276 | 3207F47326C494E500D90D50 = { 277 | CreatedOnToolsVersion = 12.5.1; 278 | TestTargetID = 3207F45726C494E300D90D50; 279 | }; 280 | }; 281 | }; 282 | buildConfigurationList = 3207F45326C494E300D90D50 /* Build configuration list for PBXProject "HTTPS Responses" */; 283 | compatibilityVersion = "Xcode 9.3"; 284 | developmentRegion = en; 285 | hasScannedForEncodings = 0; 286 | knownRegions = ( 287 | en, 288 | Base, 289 | ); 290 | mainGroup = 3207F44F26C494E300D90D50; 291 | packageReferences = ( 292 | ); 293 | productRefGroup = 3207F45926C494E300D90D50 /* Products */; 294 | projectDirPath = ""; 295 | projectRoot = ""; 296 | targets = ( 297 | 3207F45726C494E300D90D50 /* HTTPS Responses */, 298 | 3207F46826C494E500D90D50 /* HTTPS ResponsesTests */, 299 | 3207F47326C494E500D90D50 /* HTTPS ResponsesUITests */, 300 | ); 301 | }; 302 | /* End PBXProject section */ 303 | 304 | /* Begin PBXResourcesBuildPhase section */ 305 | 3207F45626C494E300D90D50 /* Resources */ = { 306 | isa = PBXResourcesBuildPhase; 307 | buildActionMask = 2147483647; 308 | files = ( 309 | 3207F46326C494E500D90D50 /* Preview Assets.xcassets in Resources */, 310 | 3207F46026C494E500D90D50 /* Assets.xcassets in Resources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | 3207F46726C494E500D90D50 /* Resources */ = { 315 | isa = PBXResourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | 3207F47226C494E500D90D50 /* Resources */ = { 322 | isa = PBXResourcesBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | }; 328 | /* End PBXResourcesBuildPhase section */ 329 | 330 | /* Begin PBXSourcesBuildPhase section */ 331 | 3207F45426C494E300D90D50 /* Sources */ = { 332 | isa = PBXSourcesBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | 32A19B812AA7FC0B000433A8 /* SubView.swift in Sources */, 336 | 32A19B7D2AA7E9DA000433A8 /* ResponsesEnum.swift in Sources */, 337 | 32A19B862AA85FDD000433A8 /* SettingsView.swift in Sources */, 338 | 32A19B7F2AA7F746000433A8 /* MainView.swift in Sources */, 339 | 3207F45C26C494E300D90D50 /* S_ResponsesApp.swift in Sources */, 340 | 32A19B832AA7FEB2000433A8 /* GlossaryView.swift in Sources */, 341 | ); 342 | runOnlyForDeploymentPostprocessing = 0; 343 | }; 344 | 3207F46526C494E500D90D50 /* Sources */ = { 345 | isa = PBXSourcesBuildPhase; 346 | buildActionMask = 2147483647; 347 | files = ( 348 | 3207F46E26C494E500D90D50 /* S_ResponsesTests.swift in Sources */, 349 | 32A19B842AA85E8A000433A8 /* ResponsesEnum.swift in Sources */, 350 | ); 351 | runOnlyForDeploymentPostprocessing = 0; 352 | }; 353 | 3207F47026C494E500D90D50 /* Sources */ = { 354 | isa = PBXSourcesBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | 3207F47926C494E500D90D50 /* S_ResponsesUITests.swift in Sources */, 358 | ); 359 | runOnlyForDeploymentPostprocessing = 0; 360 | }; 361 | /* End PBXSourcesBuildPhase section */ 362 | 363 | /* Begin PBXTargetDependency section */ 364 | 3207F46B26C494E500D90D50 /* PBXTargetDependency */ = { 365 | isa = PBXTargetDependency; 366 | target = 3207F45726C494E300D90D50 /* HTTPS Responses */; 367 | targetProxy = 3207F46A26C494E500D90D50 /* PBXContainerItemProxy */; 368 | }; 369 | 3207F47626C494E500D90D50 /* PBXTargetDependency */ = { 370 | isa = PBXTargetDependency; 371 | target = 3207F45726C494E300D90D50 /* HTTPS Responses */; 372 | targetProxy = 3207F47526C494E500D90D50 /* PBXContainerItemProxy */; 373 | }; 374 | /* End PBXTargetDependency section */ 375 | 376 | /* Begin XCBuildConfiguration section */ 377 | 3207F47B26C494E500D90D50 /* Debug */ = { 378 | isa = XCBuildConfiguration; 379 | buildSettings = { 380 | ALWAYS_SEARCH_USER_PATHS = NO; 381 | CLANG_ANALYZER_NONNULL = YES; 382 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 383 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 384 | CLANG_CXX_LIBRARY = "libc++"; 385 | CLANG_ENABLE_MODULES = YES; 386 | CLANG_ENABLE_OBJC_ARC = YES; 387 | CLANG_ENABLE_OBJC_WEAK = YES; 388 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 389 | CLANG_WARN_BOOL_CONVERSION = YES; 390 | CLANG_WARN_COMMA = YES; 391 | CLANG_WARN_CONSTANT_CONVERSION = YES; 392 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 393 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 394 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 395 | CLANG_WARN_EMPTY_BODY = YES; 396 | CLANG_WARN_ENUM_CONVERSION = YES; 397 | CLANG_WARN_INFINITE_RECURSION = YES; 398 | CLANG_WARN_INT_CONVERSION = YES; 399 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 400 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 401 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 403 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 404 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 405 | CLANG_WARN_STRICT_PROTOTYPES = YES; 406 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 407 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 408 | CLANG_WARN_UNREACHABLE_CODE = YES; 409 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 410 | COPY_PHASE_STRIP = NO; 411 | DEBUG_INFORMATION_FORMAT = dwarf; 412 | ENABLE_STRICT_OBJC_MSGSEND = YES; 413 | ENABLE_TESTABILITY = YES; 414 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 415 | GCC_C_LANGUAGE_STANDARD = gnu11; 416 | GCC_DYNAMIC_NO_PIC = NO; 417 | GCC_NO_COMMON_BLOCKS = YES; 418 | GCC_OPTIMIZATION_LEVEL = 0; 419 | GCC_PREPROCESSOR_DEFINITIONS = ( 420 | "DEBUG=1", 421 | "$(inherited)", 422 | ); 423 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 424 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 425 | GCC_WARN_UNDECLARED_SELECTOR = YES; 426 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 427 | GCC_WARN_UNUSED_FUNCTION = YES; 428 | GCC_WARN_UNUSED_VARIABLE = YES; 429 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 430 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 431 | MTL_FAST_MATH = YES; 432 | ONLY_ACTIVE_ARCH = YES; 433 | SDKROOT = iphoneos; 434 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 435 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 436 | }; 437 | name = Debug; 438 | }; 439 | 3207F47C26C494E500D90D50 /* Release */ = { 440 | isa = XCBuildConfiguration; 441 | buildSettings = { 442 | ALWAYS_SEARCH_USER_PATHS = NO; 443 | CLANG_ANALYZER_NONNULL = YES; 444 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 445 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 446 | CLANG_CXX_LIBRARY = "libc++"; 447 | CLANG_ENABLE_MODULES = YES; 448 | CLANG_ENABLE_OBJC_ARC = YES; 449 | CLANG_ENABLE_OBJC_WEAK = YES; 450 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 451 | CLANG_WARN_BOOL_CONVERSION = YES; 452 | CLANG_WARN_COMMA = YES; 453 | CLANG_WARN_CONSTANT_CONVERSION = YES; 454 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 455 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 456 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 457 | CLANG_WARN_EMPTY_BODY = YES; 458 | CLANG_WARN_ENUM_CONVERSION = YES; 459 | CLANG_WARN_INFINITE_RECURSION = YES; 460 | CLANG_WARN_INT_CONVERSION = YES; 461 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 462 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 463 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 464 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 465 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 466 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 467 | CLANG_WARN_STRICT_PROTOTYPES = YES; 468 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 469 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 470 | CLANG_WARN_UNREACHABLE_CODE = YES; 471 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 472 | COPY_PHASE_STRIP = NO; 473 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 474 | ENABLE_NS_ASSERTIONS = NO; 475 | ENABLE_STRICT_OBJC_MSGSEND = YES; 476 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 477 | GCC_C_LANGUAGE_STANDARD = gnu11; 478 | GCC_NO_COMMON_BLOCKS = YES; 479 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 480 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 481 | GCC_WARN_UNDECLARED_SELECTOR = YES; 482 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 483 | GCC_WARN_UNUSED_FUNCTION = YES; 484 | GCC_WARN_UNUSED_VARIABLE = YES; 485 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 486 | MTL_ENABLE_DEBUG_INFO = NO; 487 | MTL_FAST_MATH = YES; 488 | SDKROOT = iphoneos; 489 | SWIFT_COMPILATION_MODE = wholemodule; 490 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 491 | VALIDATE_PRODUCT = YES; 492 | }; 493 | name = Release; 494 | }; 495 | 3207F47E26C494E500D90D50 /* Debug */ = { 496 | isa = XCBuildConfiguration; 497 | buildSettings = { 498 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 499 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 500 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 501 | CODE_SIGN_ENTITLEMENTS = "S Responses/S Responses.entitlements"; 502 | CODE_SIGN_STYLE = Automatic; 503 | CURRENT_PROJECT_VERSION = 10; 504 | DEVELOPMENT_ASSET_PATHS = "\"S Responses/Preview Content\""; 505 | DEVELOPMENT_TEAM = G9WS4QC5DH; 506 | ENABLE_PREVIEWS = YES; 507 | INFOPLIST_FILE = "S Responses/Info.plist"; 508 | INFOPLIST_KEY_CFBundleDisplayName = HTTPS; 509 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 510 | LD_RUNPATH_SEARCH_PATHS = ( 511 | "$(inherited)", 512 | "@executable_path/Frameworks", 513 | ); 514 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-Responses"; 515 | PRODUCT_NAME = "$(TARGET_NAME)"; 516 | SWIFT_VERSION = 5.0; 517 | TARGETED_DEVICE_FAMILY = "1,2"; 518 | }; 519 | name = Debug; 520 | }; 521 | 3207F47F26C494E500D90D50 /* Release */ = { 522 | isa = XCBuildConfiguration; 523 | buildSettings = { 524 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 525 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 526 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 527 | CODE_SIGN_ENTITLEMENTS = "S Responses/S Responses.entitlements"; 528 | CODE_SIGN_STYLE = Automatic; 529 | CURRENT_PROJECT_VERSION = 10; 530 | DEVELOPMENT_ASSET_PATHS = "\"S Responses/Preview Content\""; 531 | DEVELOPMENT_TEAM = G9WS4QC5DH; 532 | ENABLE_PREVIEWS = YES; 533 | INFOPLIST_FILE = "S Responses/Info.plist"; 534 | INFOPLIST_KEY_CFBundleDisplayName = HTTPS; 535 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 536 | LD_RUNPATH_SEARCH_PATHS = ( 537 | "$(inherited)", 538 | "@executable_path/Frameworks", 539 | ); 540 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-Responses"; 541 | PRODUCT_NAME = "$(TARGET_NAME)"; 542 | SWIFT_VERSION = 5.0; 543 | TARGETED_DEVICE_FAMILY = "1,2"; 544 | }; 545 | name = Release; 546 | }; 547 | 3207F48126C494E500D90D50 /* Debug */ = { 548 | isa = XCBuildConfiguration; 549 | buildSettings = { 550 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 551 | BUNDLE_LOADER = "$(TEST_HOST)"; 552 | CODE_SIGN_STYLE = Automatic; 553 | DEVELOPMENT_TEAM = G9WS4QC5DH; 554 | INFOPLIST_FILE = "S ResponsesTests/Info.plist"; 555 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 556 | LD_RUNPATH_SEARCH_PATHS = ( 557 | "$(inherited)", 558 | "@executable_path/Frameworks", 559 | "@loader_path/Frameworks", 560 | ); 561 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-ResponsesTests"; 562 | PRODUCT_NAME = "$(TARGET_NAME)"; 563 | SWIFT_VERSION = 5.0; 564 | TARGETED_DEVICE_FAMILY = "1,2"; 565 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HTTPS Responses.app/HTTPS Responses"; 566 | }; 567 | name = Debug; 568 | }; 569 | 3207F48226C494E500D90D50 /* Release */ = { 570 | isa = XCBuildConfiguration; 571 | buildSettings = { 572 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 573 | BUNDLE_LOADER = "$(TEST_HOST)"; 574 | CODE_SIGN_STYLE = Automatic; 575 | DEVELOPMENT_TEAM = G9WS4QC5DH; 576 | INFOPLIST_FILE = "S ResponsesTests/Info.plist"; 577 | IPHONEOS_DEPLOYMENT_TARGET = 14.0; 578 | LD_RUNPATH_SEARCH_PATHS = ( 579 | "$(inherited)", 580 | "@executable_path/Frameworks", 581 | "@loader_path/Frameworks", 582 | ); 583 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-ResponsesTests"; 584 | PRODUCT_NAME = "$(TARGET_NAME)"; 585 | SWIFT_VERSION = 5.0; 586 | TARGETED_DEVICE_FAMILY = "1,2"; 587 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HTTPS Responses.app/HTTPS Responses"; 588 | }; 589 | name = Release; 590 | }; 591 | 3207F48426C494E500D90D50 /* Debug */ = { 592 | isa = XCBuildConfiguration; 593 | buildSettings = { 594 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 595 | CODE_SIGN_STYLE = Automatic; 596 | DEVELOPMENT_TEAM = G9WS4QC5DH; 597 | INFOPLIST_FILE = "S ResponsesUITests/Info.plist"; 598 | LD_RUNPATH_SEARCH_PATHS = ( 599 | "$(inherited)", 600 | "@executable_path/Frameworks", 601 | "@loader_path/Frameworks", 602 | ); 603 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-ResponsesUITests"; 604 | PRODUCT_NAME = "$(TARGET_NAME)"; 605 | SWIFT_VERSION = 5.0; 606 | TARGETED_DEVICE_FAMILY = "1,2"; 607 | TEST_TARGET_NAME = "S Responses"; 608 | }; 609 | name = Debug; 610 | }; 611 | 3207F48526C494E500D90D50 /* Release */ = { 612 | isa = XCBuildConfiguration; 613 | buildSettings = { 614 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 615 | CODE_SIGN_STYLE = Automatic; 616 | DEVELOPMENT_TEAM = G9WS4QC5DH; 617 | INFOPLIST_FILE = "S ResponsesUITests/Info.plist"; 618 | LD_RUNPATH_SEARCH_PATHS = ( 619 | "$(inherited)", 620 | "@executable_path/Frameworks", 621 | "@loader_path/Frameworks", 622 | ); 623 | PRODUCT_BUNDLE_IDENTIFIER = "com.person2099.HTTP-S-ResponsesUITests"; 624 | PRODUCT_NAME = "$(TARGET_NAME)"; 625 | SWIFT_VERSION = 5.0; 626 | TARGETED_DEVICE_FAMILY = "1,2"; 627 | TEST_TARGET_NAME = "S Responses"; 628 | }; 629 | name = Release; 630 | }; 631 | /* End XCBuildConfiguration section */ 632 | 633 | /* Begin XCConfigurationList section */ 634 | 3207F45326C494E300D90D50 /* Build configuration list for PBXProject "HTTPS Responses" */ = { 635 | isa = XCConfigurationList; 636 | buildConfigurations = ( 637 | 3207F47B26C494E500D90D50 /* Debug */, 638 | 3207F47C26C494E500D90D50 /* Release */, 639 | ); 640 | defaultConfigurationIsVisible = 0; 641 | defaultConfigurationName = Release; 642 | }; 643 | 3207F47D26C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS Responses" */ = { 644 | isa = XCConfigurationList; 645 | buildConfigurations = ( 646 | 3207F47E26C494E500D90D50 /* Debug */, 647 | 3207F47F26C494E500D90D50 /* Release */, 648 | ); 649 | defaultConfigurationIsVisible = 0; 650 | defaultConfigurationName = Release; 651 | }; 652 | 3207F48026C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS ResponsesTests" */ = { 653 | isa = XCConfigurationList; 654 | buildConfigurations = ( 655 | 3207F48126C494E500D90D50 /* Debug */, 656 | 3207F48226C494E500D90D50 /* Release */, 657 | ); 658 | defaultConfigurationIsVisible = 0; 659 | defaultConfigurationName = Release; 660 | }; 661 | 3207F48326C494E500D90D50 /* Build configuration list for PBXNativeTarget "HTTPS ResponsesUITests" */ = { 662 | isa = XCConfigurationList; 663 | buildConfigurations = ( 664 | 3207F48426C494E500D90D50 /* Debug */, 665 | 3207F48526C494E500D90D50 /* Release */, 666 | ); 667 | defaultConfigurationIsVisible = 0; 668 | defaultConfigurationName = Release; 669 | }; 670 | /* End XCConfigurationList section */ 671 | }; 672 | rootObject = 3207F45026C494E300D90D50 /* Project object */; 673 | } 674 | -------------------------------------------------------------------------------- /S Responses/Views/Helpers/ResponsesEnum.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResponsesEnum.swift 3 | // HTTPS Responses 4 | // 5 | // Created by Sebastian Keet on 6/9/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | enum ResponsesEnum: String, CaseIterable, Identifiable { 11 | case r100 12 | case r101 13 | case r102 14 | case r200 15 | case r201 16 | case r202 17 | case r203 18 | case r204 19 | case r205 20 | case r206 21 | case r207 22 | case r208 23 | case r226 24 | case r300 25 | case r301 26 | case r302 27 | case r303 28 | case r304 29 | case r305 30 | case r306 31 | case r307 32 | case r308 33 | case r400 34 | case r401 35 | case r402 36 | case r403 37 | case r404 38 | case r405 39 | case r406 40 | case r407 41 | case r408 42 | case r409 43 | case r410 44 | case r411 45 | case r412 46 | case r413 47 | case r414 48 | case r415 49 | case r416 50 | case r417 51 | case r418 52 | case r420 53 | case r422 54 | case r423 55 | case r424 56 | case r425 57 | case r426 58 | case r428 59 | case r429 60 | case r431 61 | case r444 62 | case r449 63 | case r450 64 | case r451 65 | case r499 66 | case r500 67 | case r501 68 | case r502 69 | case r503 70 | case r504 71 | case r505 72 | case r506 73 | case r507 74 | case r508 75 | case r509 76 | case r510 77 | case r511 78 | case r598 79 | case r599 80 | var id: String { 81 | return responseCode 82 | } 83 | 84 | var responseCode: String { 85 | return self.rawValue.replacingOccurrences(of: "r", with: "") 86 | } 87 | 88 | var responseCodeTitle: String { 89 | switch self { 90 | case .r100: 91 | return "Continue" 92 | case .r101: 93 | return "Switching Protocols" 94 | case .r102: 95 | return "Processing (WebDAV)" 96 | case .r200: 97 | return "OK" 98 | case .r201: 99 | return "Created" 100 | case .r202: 101 | return "Accepted" 102 | case .r203: 103 | return "Non-Authoritative Information" 104 | case .r204: 105 | return "No Content" 106 | case .r205: 107 | return "Reset Content" 108 | case .r206: 109 | return "Partial Content" 110 | case .r207: 111 | return "Multi-Status (WebDAV)" 112 | case .r208: 113 | return "Already Reported (WebDAV)" 114 | case .r226: 115 | return "IM Used" 116 | case .r300: 117 | return "Multiple Choices" 118 | case .r301: 119 | return "Moved Permanently" 120 | case .r302: 121 | return "Found" 122 | case .r303: 123 | return "See Other" 124 | case .r304: 125 | return "Not Modified" 126 | case .r305: 127 | return "Use Proxy" 128 | case .r306: 129 | return "(Unused)" 130 | case .r307: 131 | return "Temporary Redirect" 132 | case .r308: 133 | return "Permanent Redirect (experimental)" 134 | case .r400: 135 | return "Bad Request" 136 | case .r401: 137 | return "Unauthorised" 138 | case .r402: 139 | return "Payment Required" 140 | case .r403: 141 | return "Forbidden" 142 | case .r404: 143 | return "Not Found" 144 | case .r405: 145 | return "Method Not Allowed" 146 | case .r406: 147 | return "Not Acceptable" 148 | case .r407: 149 | return "Proxy Authentication Required" 150 | case .r408: 151 | return "Request Timeout" 152 | case .r409: 153 | return "Conflict" 154 | case .r410: 155 | return "Gone" 156 | case .r411: 157 | return "Length Required" 158 | case .r412: 159 | return "Precondition Failed" 160 | case .r413: 161 | return "Request Entity Too Large" 162 | case .r414: 163 | return "Request-URI Too Long" 164 | case .r415: 165 | return "Unsupported Media Type" 166 | case .r416: 167 | return "Requested Range Not Satisfiable" 168 | case .r417: 169 | return "Expectation Failed" 170 | case .r418: 171 | return "I'm A Teapot (RFC 2324)" 172 | case .r420: 173 | return "Enhance Your Calm (Twitter/X)" 174 | case .r422: 175 | return "Unprocessable Entity (WebDAV)" 176 | case .r423: 177 | return "Locked (WebDAV)" 178 | case .r424: 179 | return "Failed Dependency (WebDAV)" 180 | case .r425: 181 | return "Reserved for WebDAV" 182 | case .r426: 183 | return "Upgrade Required" 184 | case .r428: 185 | return "Precondition Required" 186 | case .r429: 187 | return "Too Many Requests" 188 | case .r431: 189 | return "Request Header Fields Too Large" 190 | case .r444: 191 | return "No Response (Nginx)" 192 | case .r449: 193 | return "Retry With (Microsoft)" 194 | case .r450: 195 | return "Blocked by Windows Parental Controls (Microsoft)" 196 | case .r451: 197 | return "Unavailable For Legal Reasons" 198 | case .r499: 199 | return "Client Closed Request (Nginx)" 200 | case .r500: 201 | return "Internal Server Error" 202 | case .r501: 203 | return "Not Implemented" 204 | case .r502: 205 | return "Bad Gateway" 206 | case .r503: 207 | return "Service Unavailable" 208 | case .r504: 209 | return "Gateway Timeout" 210 | case .r505: 211 | return "HTTP Version Not Supported" 212 | case .r506: 213 | return "Variant Also Negotiates (Experimental)" 214 | case .r507: 215 | return "Insufficient Storage (WebDAV)" 216 | case .r508: 217 | return "Loop Detected (WebDAV)" 218 | case .r509: 219 | return "Bandwidth Limit Exceeded (Apache)" 220 | case .r510: 221 | return "Not Extended" 222 | case .r511: 223 | return "Network Authentication Required" 224 | case .r598: 225 | return "Network read timeout error" 226 | case .r599: 227 | return "Network connect timeout error" 228 | } 229 | } 230 | 231 | var simplifiedDef: String { 232 | switch self { 233 | case .r100: 234 | return "The request should be continued. This response indicates that the first part of the request is being processed and the rest of the request should be completed." 235 | case .r101: 236 | return "The client has asked the server to switch protocols and the server is acknowledging that it will do so." 237 | case .r102: 238 | return "As a WebDAV request may contain many sub-requests involving file operations, it may take a long time to complete the request. This code indicates that the server has received and is processing the request, but no response is available yet." 239 | case .r200: 240 | return "The request has succeeded. This response may also contain information based on the request." 241 | case .r201: 242 | return "The request has been fulfilled and resulted in a new resource being created." 243 | case .r202: 244 | return "The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it may be disallowed when processing actually takes place." 245 | case .r203: 246 | return "The provided response includes third party content and is not directly provided by the entity it was requested from. The set presented MAY be a subset or superset of the original version." 247 | case .r204: 248 | return "The server successfully processed the request, but is not returning any content." 249 | case .r205: 250 | return "The server has fulfilled the request and is recomending that the document view which caused the request to be sent is reset." 251 | case .r206: 252 | return "The server is delivering only part of the resource due to a range header sent by the client." 253 | case .r207: 254 | return "This response contains status' for multiple operations." 255 | case .r208: 256 | return "The members of a DAV binding have already been enumerated in a previous reply to this request, and are not being included again." 257 | case .r226: 258 | return "The server has fulfilled a GET request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance." 259 | case .r300: 260 | return "This response indicates that there are multiple versions, or choices, of the requested data and is providing the client with the ability to choose which one to use." 261 | case .r301: 262 | return "This and all future requests should be directed to the given URI." 263 | case .r302: 264 | return "The requested resource resides temporarily under a different URI." 265 | case .r303: 266 | return "The response to the request can be found under another URI." 267 | case .r304: 268 | return "Indicates the resource has not been modified since last requested." 269 | case .r305: 270 | return "The requested resource MUST be accessed through the proxy given by the Location field." 271 | case .r306: 272 | return "The 306 status code is no longer used, and the code is reserved." 273 | case .r307: 274 | return "The requested resource resides temporarily under a different URI." 275 | case .r308: 276 | return "The request, and all future requests should be repeated using another URI." 277 | case .r400: 278 | return "The request could not be understood by the server." 279 | case .r401: 280 | return "The request requires user authentication" 281 | case .r402: 282 | return "This code is reserved for future use." 283 | case .r403: 284 | return "The server understood the request but is refusing to fulfill it." 285 | case .r404: 286 | return "The server has not found anything matching the Request." 287 | case .r405: 288 | return "The method specified in the Request-Line is not allowed." 289 | case .r406: 290 | return "The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request." 291 | case .r407: 292 | return "The client must first authenticate itself with the proxy." 293 | case .r408: 294 | return "The server timed out waiting for the request." 295 | case .r409: 296 | return "This response code indicates that the request could not be processed because of conflict in the request." 297 | case .r410: 298 | return "The resource that was requested is no longer avaliable at the location specified." 299 | case .r411: 300 | return "The request was denied due to the content-length header field being missing." 301 | case .r412: 302 | return "The condition defined by the If-Unmodified-Since or If-None-Match headers is not fulfilled." 303 | case .r413: 304 | return "The server denied the request as the request was too large in size." 305 | case .r414: 306 | return "The URI provided was too long for the server to process." 307 | case .r415: 308 | return "The request entity has a media type which the server or resource does not support." 309 | case .r416: 310 | return "The client has asked for a portion of the file, but the server cannot supply that portion." 311 | case .r417: 312 | return "The server cannot meet the requirements of the Expect request-header field." 313 | case .r418: 314 | return "This response code was defined in 1998 as an April Fools' Joke" 315 | case .r420: 316 | return "This response code is a reference to 'Demolition Man' and is used exclusively by twitter API's when the client is being rate limited. (Similar to 429)" 317 | case .r422: 318 | return "The request was well-formed however the server was unable to process the contained instructions." 319 | case .r423: 320 | return "The resource that was requested is locked." 321 | case .r424: 322 | return "The request failed due to failure of a previous request which it depended on." 323 | case .r425: 324 | return "This status code is reserved for use by WebDAV but is not yet in use." 325 | case .r426: 326 | return "The client should switch to a different protocol such as TLS/1.0." 327 | case .r428: 328 | return "The origin server requires the request to be conditional." 329 | case .r429: 330 | return "The client has sent too many requests in a given amount of time." 331 | case .r431: 332 | return "The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large." 333 | case .r444: 334 | return "The server closed the connection with no explination." 335 | case .r449: 336 | return "The request should be retried after completing the indicated action" 337 | case .r450: 338 | return "Blocked by Windows Parental Controls (Microsoft)" 339 | case .r451: 340 | return "Unavailable For Legal Reasons" 341 | case .r499: 342 | return "Client Closed Request (Nginx)" 343 | case .r500: 344 | return "The server encountered an error and could not complete the request." 345 | case .r501: 346 | return "The server has not implemented the functionality to process the request." 347 | case .r502: 348 | return "The server received an invalid response from the server it was accessing." 349 | case .r503: 350 | return "The service requested of the server is unavaliable temporarily." 351 | case .r504: 352 | return "The server timed out while acting as a gateway for the client." 353 | case .r505: 354 | return "The server does not support the HTTP protocol version used in the request." 355 | case .r506: 356 | return "The chosen variant resource is configured to engage in transparent content negotiation itself." 357 | case .r507: 358 | return "The server has insufficient storage to hold the data required to complete the request." 359 | case .r508: 360 | return "The server detected an infinite loop while processing the request." 361 | case .r509: 362 | return "This status code is not specified in any RFCs and is therefore not required to signify any particular response." 363 | case .r510: 364 | return "Further extensions to the request are required for the server to fulfill it." 365 | case .r511: 366 | return """ 367 | The client needs to authenticate to gain network access.\nIntended for use by intercepting proxies used to control access to the network (e.g., 'captive portals' used to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot) 368 | """ 369 | case .r598: 370 | return "This response is used by some HTTP proxies to signal a network read timeout." 371 | case .r599: 372 | return "This response is used by some HTTP proxies to signal a network connect timeout." 373 | } 374 | } 375 | 376 | var responseCodeType: String { 377 | let char = responseCode.first 378 | if char == "1" { 379 | return "Informational" 380 | } else if char == "2" { 381 | return "Success" 382 | } else if char == "3" { 383 | return "Redirection" 384 | } else if char == "4" { 385 | return "Client Error" 386 | } else if char == "5" { 387 | return "Server Error" 388 | } else { 389 | //logger.fault("char not a responseCodeType") 390 | return "That's not supposed to happen!" 391 | } 392 | } 393 | 394 | var responseCodeTypeGramaticalAnA: String { 395 | let char = responseCode.first 396 | if char == "1" { 397 | return "an" 398 | } else { 399 | return "a" 400 | } 401 | } 402 | 403 | var responseCodeColour: Color { 404 | let char = responseCode.first 405 | if char == "1" { 406 | return .gray 407 | } else if char == "2" { 408 | return .green 409 | } else if char == "3" { 410 | return .blue 411 | } else if char == "4" { 412 | return .red 413 | } else if char == "5" { 414 | return .orange 415 | } else { 416 | return .red 417 | } 418 | } 419 | 420 | var detailedDef: String { 421 | switch self { 422 | case .r100: 423 | return "The client SHOULD continue with its request. This interim response is used to inform the client that the initial part of the request has been received and has not yet been rejected by the server. The client SHOULD continue by sending the remainder of the request or, if the request has already been completed, ignore this response. The server MUST send a final response after the request has been completed." 424 | case .r101: 425 | return "The server understands and is willing to comply with the client's request, for a change in the application protocol being used on this connection. The server will switch protocols to those defined by the response's.\nThe protocol SHOULD be switched only when it is advantageous to do so. For example, switching to a newer version of HTTP is advantageous over older versions, and switching to a real-time, synchronous protocol might be advantageous when delivering resources that use such features." 426 | case .r102: 427 | return "The 102 (Processing) status code is an interim response used to inform the client that the server has accepted the complete request, but has not yet completed it. This status code SHOULD only be sent when the server has a reasonable expectation that the request will take significant time to complete. As guidance, if a method is taking longer than 20 seconds (a reasonable, but arbitrary value) to process the server SHOULD return a 102 (Processing) response. The server MUST send a final response after the request has been completed." 428 | case .r200: 429 | return "The request has succeeded. The information returned with the response is dependent on the method used in the request, for example:\n• GET an entity corresponding to the requested resource is sent in the response;\n• HEAD the entity-header fields corresponding to the requested resource are sent in the response without any message-body;\n• POST an entity describing or containing the result of the action;\n• TRACE an entity containing the request message as received by the end server." 430 | case .r201: 431 | return "The request has been fulfilled and resulted in a new resource being created. The response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate. . The origin server MUST create the resource before returning the 201 status code. If the action cannot be carried out immediately, the server SHOULD respond with 202 (Accepted) response instead." 432 | case .r202: 433 | return "The request has been accepted for processing, but the processing has not been completed. The request might or might not eventually be acted upon, as it might be disallowed when processing actually takes place.\nThe 202 response is intentionally non-committal. Its purpose is to allow a server to accept a request for some other process without requiring that the user agent's connection to the server persist until the process is completed. The entity returned with this response SHOULD include an indication of the request's current status." 434 | case .r203: 435 | return "The returned metainformation in the entity-header is not the definitive set as available from the origin server, but is gathered from a local or a third-party copy. The set presented MAY be a subset or superset of the original version. For example, including local annotation information about the resource might result in a superset of the metainformation known by the origin server. Use of this response code is not required and is only appropriate when the response would otherwise be 200 (OK)." 436 | case .r204: 437 | return "The server has fulfilled the request but does not need to return an entity-body, and might want to return updated metainformation. The response MAY include new or updated metainformation in the form of entity-headers, which if present SHOULD be associated with the requested variant.\nIf the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent's active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent's active view.\nThe 204 response MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields." 438 | case .r205: 439 | return "The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action. The response MUST NOT include an entity." 440 | case .r206: 441 | return "The server has fulfilled the partial GET request for the resource. The request MUST have included a Range header field indicating the desired range, and MAY have included an If-Range header field to make the request conditional.\nThe response MUST include the following header fields:\n• Either a Content-Range header field indicating the range included with this response, or a multipart/byteranges Content-Type including Content-Range fields for each part. If a Content-Length header field is present in the response, its value MUST match the actual number of OCTETs transmitted in the message-body.\n• Date\n• ETag and/or Content-Location, if the header would have been sent in a 200 response to the same request\n• Expires, Cache-Control, and/or Vary, if the field-value might differ from that sent in any previous response for the same variant\nIf the 206 response is the result of an If-Range request that used a strong cache validator, the response SHOULD NOT include other entity-headers. If the response is the result of an If-Range request that used a weak validator, the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers. Otherwise, the response MUST include all of the entity-headers that would have been returned with a 200 (OK) response to the same request.\nA cache MUST NOT combine a 206 response with other previously cached content if the ETag or Last-Modified headers do not match exactly.\nA cache that does not support the Range and Content-Range headers MUST NOT cache 206 (Partial) responses." 442 | case .r207: 443 | return "The 207 (Multi-Status) status code provides status for multiple independent operations (see section 11 for more information)." 444 | case .r208: 445 | return "The 208 (Already Reported) status code can be used inside a DAV: propstat response element to avoid enumerating the internal members of multiple bindings to the same collection repeatedly. For each binding to a collection inside the request's scope, only one will be reported with a 200 status, while subsequent DAV:response elements for all other bindings will use the 208 status, and no DAV:response elements for their descendants are included." 446 | case .r226: 447 | return "The server has fulfilled a GET request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance. The actual current instance might not be available except by combining this response with other previous or future responses, as appropriate for the specific instance-manipulation(s). If so, the headers of the resulting instance are the result of combining the headers from the status-226 response and the other instances, following the rules in the HTTP/1.1 specification.\nThe request MUST have included an A-IM header field listing at least one instance-manipulation. The response MUST include an Etag header field giving the entity tag of the current instance.\nA response received with a status code of 226 MAY be stored by a cache and used in reply to a subsequent request, subject to the HTTP expiration mechanism and any Cache-Control headers.\nA response received with a status code of 226 MAY be used by a cache, in conjunction with a cache entry for the base instance, to create a cache entry for the current instance." 448 | case .r300: 449 | return "The requested resource corresponds to any one of a set of representations, each with its own specific location, and agent- driven negotiation information (section 12) is being provided so that the user (or user agent) can select a preferred representation and redirect its request to that location.\nUnless it was a HEAD request, the response SHOULD include an entity containing a list of resource characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content- Type header field. Depending upon the format and the capabilities of the user agent, selection of the most appropriate choice MAY be performed automatically. However, this specification does not define any standard for such automatic selection.\nIf the server has a preferred choice of representation, it SHOULD include the specific URI for that representation in the Location field; user agents MAY use the Location field value for automatic redirection. This response is cacheable unless indicated otherwise." 450 | case .r301: 451 | return "The requested resource has been assigned a new permanent URI and any future references to this resource SHOULD use one of the returned URIs. Clients with link editing capabilities ought to automatically re-link references to the Request-URI to one or more of the new references returned by the server, where possible. This response is cacheable unless indicated otherwise.\nThe new permanent URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).\nIf the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.\nNote: When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request." 452 | case .r302: 453 | return "The requested resource resides temporarily under a different URI. Since the redirection might be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.\nThe temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).\nIf the 302-status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued." 454 | case .r303: 455 | return "The response to the request can be found under a different URI and SHOULD be retrieved using a GET method on that resource. This method exists primarily to allow the output of a POST-activated script to redirect the user agent to a selected resource. The new URI is not a substitute reference for the originally requested resource. The 303 response MUST NOT be cached, but the response to the second (redirected) request might be cacheable.\nThe different URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s).\nNote: Many pre-HTTP/1.1 user agents do not understand the 303 status. When interoperability with such clients is a concern, the 302 status code may be used instead, since most user agents react to a 302 response as described here for 303." 456 | case .r304: 457 | return "If the client has performed a conditional GET request and access is allowed, but the document has not been modified, the server SHOULD respond with this status code. The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields.\nThe response MUST include the following header fields:\nDate, unless its omission is required by section 14.18.1\nIf a clockless origin server obeys these rules, and proxies and clients add their own Date to any response received without one (as already specified by [RFC 2068], section 14.19), caches will operate correctly.\nETag and/or Content-Location, if the header would have been sent in a 200 response to the same request\nExpires, Cache-Control, and/or Vary, if the field-value might differ from that sent in any previous response for the same variant\nIf the conditional GET used a strong cache validator (see section 13.3.3), the response SHOULD NOT include other entity-headers. Otherwise (i.e., the conditional GET used a weak validator), the response MUST NOT include other entity-headers; this prevents inconsistencies between cached entity-bodies and updated headers.\nIf a 304 response indicates an entity not currently cached, then the cache MUST disregard the response and repeat the request without the conditional.\nIf a cache uses a received 304 response to update a cache entry, the cache MUST update the entry to reflect any new field values given in the response." 458 | case .r305: 459 | return "The requested resource MUST be accessed through the proxy given by the Location field. The Location field gives the URI of the proxy. The recipient is expected to repeat this single request via the proxy. 305 responses MUST only be generated by origin servers.\nNote: RFC 2068 was not clear that 305 was intended to redirect a single request, and to be generated by origin servers only. Not observing these limitations has significant security consequences." 460 | case .r306: 461 | return "The 306 status code was used in a previous version of the specification, is no longer used, and the code is reserved." 462 | case .r307: 463 | return "The requested resource resides temporarily under a different URI. Since the redirection MAY be altered on occasion, the client SHOULD continue to use the Request-URI for future requests. This response is only cacheable if indicated by a Cache-Control or Expires header field.\nThe temporary URI SHOULD be given by the Location field in the response. Unless the request method was HEAD, the entity of the response SHOULD contain a short hypertext note with a hyperlink to the new URI(s) , since many pre-HTTP/1.1 user agents do not understand the 307 status. Therefore, the note SHOULD contain the information necessary for a user to repeat the original request on the new URI.\nIf the 307 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued." 464 | case .r308: 465 | return "The request, and all future requests should be repeated using another URI. 307 and 308 (as proposed) parallel the behaviours of 302 and 301, but do not require the HTTP method to change. So, for example, submitting a form to a permanently redirected resource may continue smoothly. This response code is considered experimental." 466 | case .r400: 467 | return "The request could not be understood by the server due to malformed syntax. The client SHOULD NOT repeat the request without modifications." 468 | case .r401: 469 | return "The request requires user authentication. The response MUST include a WWW-Authenticate header field (section 14.47) containing a challenge applicable to the requested resource. The client MAY repeat the request with a suitable Authorization header field (section 14.8). If the request already included Authorization credentials, then the 401 response indicates that authorization has been refused for those credentials. If the 401 response contains the same challenge as the prior response, and the user agent has already attempted authentication at least once, then the user SHOULD be presented the entity that was given in the response, since that entity might include relevant diagnostic information." 470 | case .r402: 471 | return "Reserved for future use. The original intention was that this code might be used as part of some form of digital cash or micropayment scheme, but that has not happened, and this code is not usually used." 472 | case .r403: 473 | return "The server understood the request but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead." 474 | case .r404: 475 | return "The server has not found anything matching the Request-URI. No indication is given of whether the condition is temporary or permanent. The 410 (Gone) status code SHOULD be used if the server knows, through some internally configurable mechanism, that an old resource is permanently unavailable and has no forwarding address. This status code is commonly used when the server does not wish to reveal exactly why the request has been refused, or when no other response is applicable." 476 | case .r405: 477 | return "The method specified in the Request-Line is not allowed for the resource identified by the Request-URI. The response MUST include an Allow header containing a list of valid methods for the requested resource." 478 | case .r406: 479 | return "The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request.\nUnless it was a HEAD request, the response SHOULD include an entity containing a list of available entity characteristics and location(s) from which the user or user agent can choose the one most appropriate. The entity format is specified by the media type given in the Content-Type header field. Depending upon the format and the capabilities of the user agent, selection of the most appropriate choice MAY be performed automatically. However, this specification does not define any standard for such automatic selection." 480 | case .r407: 481 | return "This code is similar to 401 (Unauthorized), but indicates that the client must first authenticate itself with the proxy. The proxy MUST return a Proxy-Authenticate header field (section 14.33) containing a challenge applicable to the proxy for the requested resource. The client MAY repeat the request with a suitable Proxy-Authorization header field (section 14.34). HTTP access authentication is explained in 'HTTP Authentication: Basic and Digest Access Authentication'." 482 | case .r408: 483 | return "The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time." 484 | case .r409: 485 | return "The request could not be completed due to a conflict with the current state of the resource. This code is only allowed in situations where it is expected that the user might be able to resolve the conflict and resubmit the request. The response body SHOULD include enough information for the user to recognize the source of the conflict. Ideally, the response entity would include enough information for the user or user agent to fix the problem; however, that might not be possible and is not required.\nConflicts are most likely to occur in response to a PUT request. For example, if versioning were being used and the entity being PUT included changes to a resource which conflict with those made by an earlier (third-party) request, the server might use the 409 response to indicate that it can't complete the request. In this case, the response entity would likely contain a list of the differences between the two versions in a format defined by the response Content-Type." 486 | case .r410: 487 | return "The requested resource is no longer available at the server and no forwarding address is known. This condition is expected to be considered permanent. Clients with link editing capabilities SHOULD delete references to the Request-URI after user approval. If the server does not know, or has no facility to determine, whether or not the condition is permanent, the status code 404 (Not Found) SHOULD be used instead. This response is cacheable unless indicated otherwise.\nThe 410 response is primarily intended to assist the task of web maintenance by notifying the recipient that the resource is intentionally unavailable and that the server owners desire that remote links to that resource be removed. Such an event is common for limited-time, promotional services and for resources belonging to individuals no longer working at the server's site. It is not necessary to mark all permanently unavailable resources as 'gone' or to keep the mark for any length of time -- that is left to the discretion of the server owner." 488 | case .r411: 489 | return "The server refuses to accept the request without a defined Content- Length. The client MAY repeat the request if it adds a valid Content-Length header field containing the length of the message-body in the request message." 490 | case .r412: 491 | return "The precondition given in one or more of the request-header fields evaluated to false when it was tested on the server. This response code allows the client to place preconditions on the current resource metainformation (header field data) and thus prevent the requested method from being applied to a resource other than the one intended." 492 | case .r413: 493 | return "The server is refusing to process a request because the request entity is larger than the server is willing or able to process. The server MAY close the connection to prevent the client from continuing the request.\nIf the condition is temporary, the server SHOULD include a Retry- After header field to indicate that it is temporary and after what time the client MAY try again." 494 | case .r414: 495 | return "The server is refusing to service the request because the Request-URI is longer than the server is willing to interpret. This rare condition is only likely to occur when a client has improperly converted a POST request to a GET request with long query information, when the client has descended into a URI 'black hole' of redirection (e.g., a redirected URI prefix that points to a suffix of itself), or when the server is under attack by a client attempting to exploit security holes present in some servers using fixed-length buffers for reading or manipulating the Request-URI." 496 | case .r415: 497 | return "The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method." 498 | case .r416: 499 | return "A server SHOULD return a response with this status code if a request included a Range request-header field (section 14.35), and none of the range-specifier values in this field overlap the current extent of the selected resource, and the request did not include an If-Range request-header field. (For byte-ranges, this means that the first- byte-pos of all of the byte-range-spec values were greater than the current length of the selected resource.)\nWhen this status code is returned for a byte-range request, the response SHOULD include a Content-Range entity-header field specifying the current length of the selected resource (see section 14.16). This response MUST NOT use the multipart/byteranges content- type." 500 | case .r417: 501 | return "The expectation given in an Expect request-header field (see section 14.20) could not be met by this server, or, if the server is a proxy, the server has unambiguous evidence that the request could not be met by the next-hop server." 502 | case .r418: 503 | return "This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol, and is not expected to be implemented by actual HTTP servers. However, known implementations do exist. An Nginx HTTP server uses this code to simulate goto-like behaviour in its configuration." 504 | case .r420: 505 | return "Returned by the Twitter Search and Trends API when the client is being rate limited. The text is a quote from 'Demolition Man' and the '420' code is likely a reference to this number's association with marijuana. Other services may wish to implement the 429 Too Many Requests response code instead." 506 | case .r422: 507 | return "The 422 (Unprocessable Entity) status code means the server understands the content type of the request entity (hence a 415(Unsupported Media Type) status code is inappropriate), and the syntax of the request entity is correct (thus a 400 (Bad Request) status code is inappropriate) but was unable to process the contained instructions. For example, this error condition may occur if an XML request body contains well-formed (i.e., syntactically correct), but semantically erroneous, XML instructions." 508 | case .r423: 509 | return "The 423 (Locked) status code means the source or destination resource of a method is locked. This response SHOULD contain an appropriate precondition or postcondition code, such as 'lock-token-submitted' or 'no-conflicting-lock'." 510 | case .r424: 511 | return "The 424 (Failed Dependency) status code means that the method could not be performed on the resource because the requested action depended on another action and that action failed. For example, if a command in a PROPPATCH method fails, then, at minimum, the rest of the commands will also fail with 424 (Failed Dependency)." 512 | case .r425: 513 | return "Defined in drafts of 'WebDAV Advanced Collections Protocol', but not present in 'Web Distributed Authoring and Versioning (WebDAV) Ordered Collections Protocol'." 514 | case .r426: 515 | return "Reliable, interoperable negotiation of Upgrade features requires an unambiguous failure signal. The 426 Upgrade Required status code allows a server to definitively state the precise protocol extensions a given resource must be served with." 516 | case .r428: 517 | return "The 428 status code indicates that the origin server requires the request to be conditional.\nIts typical use is to avoid the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict. By requiring requests to be conditional, the server can assure that clients are working with the correct copies.\nResponses using this status code SHOULD explain how to resubmit the request successfully.\nThe 428 status code is optional; clients cannot rely upon its use to prevent 'lost update' conflicts." 518 | case .r429: 519 | return "The 429 status code indicates that the user has sent too many requests in a given amount of time ('rate limiting').\nThe response representations SHOULD include details explaining the condition, and MAY include a Retry-After header indicating how long to wait before making a new request.\nWhen a server is under attack or just receiving a very large number of requests from a single party, responding to each with a 429 status code will consume resources.\nTherefore, servers are not required to use the 429 status code; when limiting resource usage, it may be more appropriate to just drop connections, or take other steps." 520 | case .r431: 521 | return "The 431 status code indicates that the server is unwilling to process the request because its header fields are too large. The request MAY be resubmitted after reducing the size of the request header fields.\nIt can be used both when the set of request header fields in total are too large, and when a single header field is at fault. In the latter case, the response representation SHOULD specify which header field was too large.\nServers are not required to use the 431 status code; when under attack, it may be more appropriate to just drop connections, or take other steps." 522 | case .r444: 523 | return "An Nginx HTTP server extension. The server returns no information to the client and closes the connection (useful as a deterrent for malware)." 524 | case .r449: 525 | return "A Microsoft extension. The request should be retried after performing the appropriate action." 526 | case .r450: 527 | return "A Microsoft extension. This error is given when Windows Parental Controls are turned on and are blocking access to the given webpage." 528 | case .r451: 529 | return "Intended to be used when resource access is denied for legal reasons, e.g. censorship or government-mandated blocked access. A reference to the 1953 dystopian novel Fahrenheit 451, where books are outlawed, and the autoignition temperature of paper, 451°F." 530 | case .r499: 531 | return "An Nginx HTTP server extension. This code is introduced to log the case when the connection is closed by client while HTTP server is processing its request, making server unable to send the HTTP header back." 532 | case .r500: 533 | return "The server encountered an unexpected condition which prevented it from fulfilling the request." 534 | case .r501: 535 | return "The server does not support the functionality required to fulfill the request. This is the appropriate response when the server does not recognize the request method and is not capable of supporting it for any resource." 536 | case .r502: 537 | return "The server, while acting as a gateway or proxy, received an invalid response from the upstream server it accessed in attempting to fulfill the request." 538 | case .r503: 539 | return "The server is currently unable to handle the request due to a temporary overloading or maintenance of the server. The implication is that this is a temporary condition which will be alleviated after some delay. If known, the length of the delay MAY be indicated in a Retry-After header. If no Retry-After is given, the client SHOULD handle the response as it would for a 500 response.\nNote: The existence of the 503 status code does not imply that a server must use it when becoming overloaded. Some servers may wish to simply refuse the connection." 540 | case .r504: 541 | return "The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed to access in attempting to complete the request.\nNote: Note to implementors: some deployed proxies are known to return 400 or 500 when DNS lookups time out." 542 | case .r505: 543 | return "The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URI (e.g. HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed to access in attempting to complete the request.\nNote: Note to implementors: some deployed proxies are known to return 400 or 500 when DNS lookups time out." 544 | case .r506: 545 | return "The 506 status code indicates that the server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process." 546 | case .r507: 547 | return "The 507 (Insufficient Storage) status code means the method could not be performed on the resource because the server is unable to store the representation needed to successfully complete the request. This condition is considered to be temporary. If the request that received this status code was the result of a user action, the request MUST NOT be repeated until it is requested by a separate user action." 548 | case .r508: 549 | return "The 508 (Loop Detected) status code indicates that the server terminated an operation because it encountered an infinite loop while processing a request with 'Depth: infinity'. This status indicates that the entire operation failed." 550 | case .r509: 551 | return "This status code, while used by many servers, is not specified in any RFCs." 552 | case .r510: 553 | return "The policy for accessing the resource has not been met in the request. The server should send back all the information necessary for the client to issue an extended request. It is outside the scope of this specification to specify how the extensions inform the client.\nIf the 510 response contains information about extensions that were not present in the initial request then the client MAY repeat the request if it has reason to believe it can fulfil the extension policy by modifying the request according to the information provided in the 510 response. Otherwise the client MAY present any entity included in the 510 response to the user, since that entity may include relevant diagnostic information." 554 | case .r511: 555 | return "The 511 status code indicates that the client needs to authenticate to gain network access.\nThe response representation SHOULD contain a link to a resource that allows the user to submit credentials (e.g. with a HTML form).\nNote that the 511 response SHOULD NOT contain a challenge or the login interface itself, because browsers would show the login interface as being associated with the originally requested URL, which may cause confusion.\nThe 511 status SHOULD NOT be generated by origin servers; it is intended for use by intercepting proxies that are interposed as a means of controlling access to the network.\nResponses with the 511 status code MUST NOT be stored by a cache.\nThe 511 status code is designed to mitigate problems caused by 'captive portals' to software (especially non-browser agents) that is expecting a response from the server that a request was made to, not the intervening network infrastructure. It is not intended to encouraged deployment of captive portals, only to limit the damage caused by them.\nA network operator wishing to require some authentication, acceptance of terms or other user interaction before granting access usually does so by identifing clients who have not done so ('unknown clients') using their MAC addresses.\nUnknown clients then have all traffic blocked, except for that on TCP port 80, which is sent to a HTTP server (the 'login server') dedicated to 'logging in' unknown clients, and of course traffic to the login server itself.\nIn common use, a response carrying the 511 status code will not come from the origin server indicated in the request's URL. This presents many security issues; e.g., an attacking intermediary may be inserting cookies into the original domain's name space, may be observing cookies or HTTP authentication credentials sent from the user agent, and so on.\nHowever, these risks are not unique to the 511 status code; in other words, a captive portal that is not using this status code introduces the same issues.\nAlso, note that captive portals using this status code on an SSL or TLS connection (commonly, port 443) will generate a certificate error on the client." 556 | case .r598: 557 | return "This status code is not specified in any RFCs, but is used by some HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy." 558 | case .r599: 559 | return "This status code is not specified in any RFCs, but is used by some HTTP proxies to signal a network connect timeout behind the proxy to a client in front of the proxy." 560 | } 561 | } 562 | } 563 | 564 | --------------------------------------------------------------------------------