mirror of
https://github.com/silkimen/cordova-plugin-advanced-http.git
synced 2026-07-26 00:00:14 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f5b0f5b49 | ||
|
|
af5e06902e | ||
|
|
73f37d6a35 | ||
|
|
3678f5f6e1 | ||
|
|
41861aa2ec | ||
|
|
91573159e3 | ||
|
|
b4ff7735de | ||
|
|
60c042164a | ||
|
|
342022d3a7 | ||
|
|
dbe28b284f | ||
|
|
fe1a0fdbf7 | ||
|
|
32a250fbd5 | ||
|
|
cb84860bb1 | ||
|
|
7f5345eafd | ||
|
|
54cbb840e2 | ||
|
|
866034ea18 | ||
|
|
6615f1bf53 | ||
|
|
3ee42a41e4 | ||
|
|
8acefd2791 | ||
|
|
f6adf1e920 | ||
|
|
0c26ada847 | ||
|
|
3d20ab6b8c | ||
|
|
6fc8a7e06d | ||
|
|
00dc85cdac | ||
|
|
c86874a01a | ||
|
|
86fc3892a4 | ||
|
|
469ace48b5 | ||
|
|
b1ad996585 | ||
|
|
1218a57e5f | ||
|
|
320ed35022 | ||
|
|
845f90d43f | ||
|
|
f6c3ea7f66 | ||
|
|
d52eb08982 | ||
|
|
57c87db5a1 | ||
|
|
8ea1f3aed6 | ||
|
|
e41684cc79 | ||
|
|
d393d3ca78 | ||
|
|
479c644b1d | ||
|
|
bfa446c7fd | ||
|
|
c92f07775b | ||
|
|
9870dde50a | ||
|
|
ed08534cf3 | ||
|
|
ea15617fae | ||
|
|
87c915f7c0 | ||
|
|
1f4ccd37b4 | ||
|
|
343c536a3b | ||
|
|
38da25bb75 | ||
|
|
42175e27ad | ||
|
|
43b65fa887 | ||
|
|
48445786b6 | ||
|
|
08ec3203e9 | ||
|
|
9684c03685 | ||
|
|
8f3cfb11d0 | ||
|
|
d48512c8df | ||
|
|
ee2d727c2b | ||
|
|
0ae3756a74 | ||
|
|
935e7d6ba3 | ||
|
|
5b8f20e1c4 | ||
|
|
b3b97306f4 | ||
|
|
6a9a22f81e | ||
|
|
36d7e1813c |
@@ -0,0 +1,6 @@
|
|||||||
|
node_modules
|
||||||
|
temp
|
||||||
|
platforms
|
||||||
|
**/*.min.js
|
||||||
|
www/umd-tough-cookie.js
|
||||||
|
www/lodash.js
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"node": true,
|
||||||
|
"es2020": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended"
|
||||||
|
],
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2020,
|
||||||
|
"sourceType": "script"
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"test/**/*.js",
|
||||||
|
"www/**/*.js"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"mocha": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+149
-48
@@ -1,65 +1,166 @@
|
|||||||
name: Cordova HTTP Plugin CI
|
name: Cordova HTTP Plugin CI
|
||||||
|
|
||||||
on: [push]
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
ci_reason:
|
||||||
|
description: "Optional note for manual runs"
|
||||||
|
required: false
|
||||||
|
|
||||||
env:
|
env:
|
||||||
nodejs: '10.x'
|
node_version: "22.x"
|
||||||
|
java_distribution: "zulu"
|
||||||
|
java_version: "17"
|
||||||
|
gradle_version: "7.6.1"
|
||||||
|
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
|
||||||
|
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Install node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.node_version }}
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: package-lock.json
|
||||||
|
- name: Install node modules
|
||||||
|
run: npm ci
|
||||||
|
- name: Run ESLint
|
||||||
|
run: npm run lint
|
||||||
|
|
||||||
test-www-interface:
|
test-www-interface:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- name: Install Node.js ${{ env.nodejs }}
|
- name: Install node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.nodejs }}
|
node-version: ${{ env.node_version }}
|
||||||
- name: Install node modules
|
cache: npm
|
||||||
run: npm ci
|
cache-dependency-path: package-lock.json
|
||||||
- name: Run WWW interface tests
|
- name: Install node modules
|
||||||
run: npm run testjs
|
run: npm ci
|
||||||
|
- name: Run WWW interface tests
|
||||||
|
run: npm run test:js
|
||||||
|
|
||||||
build-ios:
|
build-ios:
|
||||||
runs-on: macOS-latest
|
runs-on: macOS-latest
|
||||||
|
outputs:
|
||||||
|
run-tests: ${{ steps.should-run-tests.outputs.run_tests }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- name: Install Node.js ${{ env.nodejs }}
|
- name: Install node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.nodejs }}
|
node-version: ${{ env.node_version }}
|
||||||
- name: Install node modules
|
cache: npm
|
||||||
run: npm ci
|
cache-dependency-path: package-lock.json
|
||||||
- name: Update test cert for httpbin.org
|
- id: should-run-tests
|
||||||
run: npm run updatecert
|
# need to find a solution for signing iOS App so we can build for device target instead simulator
|
||||||
- name: Build test app
|
# for now we skip iOS tests on BrowserStack
|
||||||
run: scripts/build-test-app.sh --ios --emulator
|
run: echo "run_tests=false" >> "$GITHUB_OUTPUT"
|
||||||
|
- name: Install node modules
|
||||||
|
run: npm ci
|
||||||
|
- name: Update test cert for httpbin.org
|
||||||
|
run: npm run update:cert
|
||||||
|
- name: Build test app
|
||||||
|
run: scripts/build-test-app.sh --ios --emulator
|
||||||
|
- name: Upload artifact to BrowserStack
|
||||||
|
if: steps.should-run-tests.outputs.run_tests == 'true'
|
||||||
|
run: scripts/upload-browserstack.sh --ios
|
||||||
|
|
||||||
|
test-ios:
|
||||||
|
needs: build-ios
|
||||||
|
if: needs.build-ios.outputs.run-tests == 'true'
|
||||||
|
runs-on: macOS-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Install node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.node_version }}
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: package-lock.json
|
||||||
|
- name: Install node modules
|
||||||
|
run: npm ci
|
||||||
|
- name: Run e2e tests (iOS)
|
||||||
|
run: scripts/test-app.sh --ios --device
|
||||||
|
|
||||||
build-android:
|
build-android:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
outputs:
|
||||||
BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }}
|
run-tests: ${{ steps.should-run-tests.outputs.run_tests }}
|
||||||
BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
- name: Install Node.js ${{ env.nodejs }}
|
- name: Install node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.nodejs }}
|
node-version: ${{ env.node_version }}
|
||||||
- name: Install node modules
|
cache: npm
|
||||||
run: npm ci
|
cache-dependency-path: package-lock.json
|
||||||
- name: Install JDK 1.8
|
- id: should-run-tests
|
||||||
uses: actions/setup-java@v1
|
run: |
|
||||||
with:
|
if [ -n "${BROWSERSTACK_USERNAME}" ]; then
|
||||||
java-version: 1.8
|
echo "run_tests=true" >> "$GITHUB_OUTPUT"
|
||||||
- name: Update test cert for httpbin.org
|
else
|
||||||
run: npm run updatecert
|
echo "run_tests=false" >> "$GITHUB_OUTPUT"
|
||||||
- name: Add workaround for missing DX files in build-tools 31 (https://stackoverflow.com/a/68430992)
|
fi
|
||||||
run: ln -s $ANDROID_HOME/build-tools/31.0.0/d8 $ANDROID_HOME/build-tools/31.0.0/dx && ln -s $ANDROID_HOME/build-tools/31.0.0/lib/d8.jar $ANDROID_HOME/build-tools/31.0.0/lib/dx.jar
|
- name: Install node modules
|
||||||
- name: Build test app
|
run: npm ci
|
||||||
run: scripts/build-test-app.sh --android --device
|
- name: Install JDK
|
||||||
- name: Upload artifact to BrowserStack
|
uses: actions/setup-java@v2
|
||||||
if: env.BROWSERSTACK_USERNAME != ''
|
with:
|
||||||
run: scripts/upload-browserstack.sh --android
|
distribution: ${{ env.java_distribution }}
|
||||||
- name: Run e2e tests
|
java-version: ${{ env.java_version }}
|
||||||
if: env.BROWSERSTACK_USERNAME != ''
|
java-package: jdk
|
||||||
run: scripts/test-app.sh --android --device
|
- name: Ensure Android build-tools 33.0.2
|
||||||
|
run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" "build-tools;33.0.2"
|
||||||
|
- name: Install Gradle
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
curl -sSL "https://services.gradle.org/distributions/gradle-${{ env.gradle_version }}-bin.zip" -o gradle.zip
|
||||||
|
unzip -q gradle.zip -d "$HOME/gradle"
|
||||||
|
echo "$HOME/gradle/gradle-${{ env.gradle_version }}/bin" >> "$GITHUB_PATH"
|
||||||
|
rm gradle.zip
|
||||||
|
- name: Update test cert for httpbin.org
|
||||||
|
run: npm run update:cert
|
||||||
|
- name: Shim missing DX binaries (https://stackoverflow.com/a/68430992)
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
BUILD_TOOLS_PATH="$(ls -d $ANDROID_HOME/build-tools/*/ | sort -V | tail -n 1)"
|
||||||
|
D8_BIN="${BUILD_TOOLS_PATH}d8"
|
||||||
|
DX_BIN="${BUILD_TOOLS_PATH}dx"
|
||||||
|
D8_JAR="${BUILD_TOOLS_PATH}lib/d8.jar"
|
||||||
|
DX_JAR="${BUILD_TOOLS_PATH}lib/dx.jar"
|
||||||
|
if [ -f "$D8_BIN" ] && [ ! -e "$DX_BIN" ]; then
|
||||||
|
ln -s "$D8_BIN" "$DX_BIN"
|
||||||
|
fi
|
||||||
|
if [ -f "$D8_JAR" ] && [ ! -e "$DX_JAR" ]; then
|
||||||
|
ln -s "$D8_JAR" "$DX_JAR"
|
||||||
|
fi
|
||||||
|
- name: Build test app
|
||||||
|
run: scripts/build-test-app.sh --android --device
|
||||||
|
- name: Upload artifact to BrowserStack
|
||||||
|
if: steps.should-run-tests.outputs.run_tests == 'true'
|
||||||
|
run: scripts/upload-browserstack.sh --android
|
||||||
|
|
||||||
|
test-android:
|
||||||
|
needs: build-android
|
||||||
|
if: needs.build-android.outputs.run-tests == 'true'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Install node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ env.node_version }}
|
||||||
|
cache: npm
|
||||||
|
cache-dependency-path: package-lock.json
|
||||||
|
- name: Install node modules
|
||||||
|
run: npm ci
|
||||||
|
- name: Run e2e tests (Android)
|
||||||
|
run: scripts/test-app.sh --android --device
|
||||||
|
|||||||
@@ -3,60 +3,101 @@
|
|||||||
#
|
#
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
# or to provide custom queries or build logic.
|
# or to provide custom queries or build logic.
|
||||||
name: "CodeQL"
|
#
|
||||||
|
# ******** NOTE ********
|
||||||
|
# We have attempted to detect the languages in your repository. Please check
|
||||||
|
# the `language` matrix defined below to confirm you have the correct set of
|
||||||
|
# supported CodeQL languages.
|
||||||
|
#
|
||||||
|
name: "CodeQL Advanced"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master]
|
branches: ["master"]
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
branches: ["master"]
|
||||||
branches: [master]
|
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 20 * * 3'
|
- cron: "0 0 * * 0"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
name: Analyze
|
name: Analyze (${{ matrix.language }})
|
||||||
runs-on: ubuntu-latest
|
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
||||||
|
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
||||||
|
# - https://gh.io/supported-runners-and-hardware-resources
|
||||||
|
# - https://gh.io/using-larger-runners (GitHub.com only)
|
||||||
|
# Consider using larger runners or machines with greater resources for possible analysis time improvements.
|
||||||
|
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
||||||
|
permissions:
|
||||||
|
# required for all workflows
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
# required to fetch internal or private CodeQL packs
|
||||||
|
packages: read
|
||||||
|
|
||||||
|
# only required for workflows in private repositories
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
# Override automatic language detection by changing the below list
|
include:
|
||||||
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
|
- language: actions
|
||||||
language: ['javascript']
|
build-mode: none
|
||||||
# Learn more...
|
- language: java-kotlin
|
||||||
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
|
build-mode: none # This mode only analyzes Java. Set this to 'autobuild' or 'manual' to analyze Kotlin too.
|
||||||
|
- language: javascript-typescript
|
||||||
|
build-mode: none
|
||||||
|
# CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
|
||||||
|
# Use `c-cpp` to analyze code written in C, C++ or both
|
||||||
|
# Use 'java-kotlin' to analyze code written in Java, Kotlin or both
|
||||||
|
# Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
|
||||||
|
# To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
|
||||||
|
# see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
|
||||||
|
# If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
|
||||||
|
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Add any setup steps before running the `github/codeql-action/init` action.
|
||||||
- name: Initialize CodeQL
|
# This includes steps like installing compilers or runtimes (`actions/setup-node`
|
||||||
uses: github/codeql-action/init@v1
|
# or others). This is typically only required for manual builds.
|
||||||
with:
|
# - name: Setup runtime (example)
|
||||||
languages: ${{ matrix.language }}
|
# uses: actions/setup-example@v1
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
||||||
# By default, queries listed here will override any specified in a config file.
|
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Initializes the CodeQL tools for scanning.
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
- name: Initialize CodeQL
|
||||||
- name: Autobuild
|
uses: github/codeql-action/init@v4
|
||||||
uses: github/codeql-action/autobuild@v1
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
build-mode: ${{ matrix.build-mode }}
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||||
# 📚 https://git.io/JvXDl
|
# queries: security-extended,security-and-quality
|
||||||
|
|
||||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
# If the analyze step fails for one of the languages you are analyzing with
|
||||||
# and modify them (or add more) to build your code if your project
|
# "We were unable to automatically build your code", modify the matrix above
|
||||||
# uses a compiled language
|
# to set the build mode to "manual" for that language. Then modify this step
|
||||||
|
# to build your code.
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
- name: Run manual build steps
|
||||||
|
if: matrix.build-mode == 'manual'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo 'If you are using a "manual" build mode for one or more of the' \
|
||||||
|
'languages you are analyzing, replace this with the commands to build' \
|
||||||
|
'your code, for example:'
|
||||||
|
echo ' make bootstrap'
|
||||||
|
echo ' make release'
|
||||||
|
exit 1
|
||||||
|
|
||||||
#- run: |
|
- name: Perform CodeQL Analysis
|
||||||
# make bootstrap
|
uses: github/codeql-action/analyze@v4
|
||||||
# make release
|
with:
|
||||||
|
category: "/language:${{matrix.language}}"
|
||||||
- name: Perform CodeQL Analysis
|
|
||||||
uses: github/codeql-action/analyze@v1
|
|
||||||
|
|||||||
-58
@@ -1,58 +0,0 @@
|
|||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
addons:
|
|
||||||
sauce_connect: true
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- name: "iOS Build & Test"
|
|
||||||
language: objective-c
|
|
||||||
sudo: false
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode12.5
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- export LANG=en_US.UTF-8 &&
|
|
||||||
nvm use 14
|
|
||||||
|
|
||||||
install:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
script:
|
|
||||||
- npm run testjs &&
|
|
||||||
npm run updatecert &&
|
|
||||||
scripts/build-test-app.sh --ios --emulator &&
|
|
||||||
scripts/upload-saucelabs.sh --ios &&
|
|
||||||
scripts/test-app.sh --ios --emulator;
|
|
||||||
|
|
||||||
- name: "Android Build & Test"
|
|
||||||
language: android
|
|
||||||
sudo : required
|
|
||||||
|
|
||||||
android:
|
|
||||||
components:
|
|
||||||
- tools
|
|
||||||
- platform-tools
|
|
||||||
- build-tools-28.0.3
|
|
||||||
- android-28
|
|
||||||
- extra-android-support
|
|
||||||
- extra-android-m2repository
|
|
||||||
- extra-google-m2repository
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- export LANG=en_US.UTF-8 &&
|
|
||||||
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - &&
|
|
||||||
sudo apt-get install -y nodejs
|
|
||||||
- yes | sdkmanager --update
|
|
||||||
|
|
||||||
install:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
script:
|
|
||||||
- npm run testjs &&
|
|
||||||
npm run updatecert &&
|
|
||||||
scripts/build-test-app.sh --android --emulator &&
|
|
||||||
scripts/upload-saucelabs.sh --android &&
|
|
||||||
scripts/test-app.sh --android --emulator;
|
|
||||||
@@ -1,5 +1,21 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
# 3.3.1
|
||||||
|
|
||||||
|
- Fixed #427: missing connection check on Android (thanks moshe5745)
|
||||||
|
- Fixed #459: namespace collision on iOS when another plugin is also using AFNetworking (thanks zafirskthelifehacker)
|
||||||
|
- Fixed #429: intermediate CA certs are not respected on iOS when using client certs (thanks pavrda)
|
||||||
|
- Fixed #444: errors are not handled when invalid header values are applied on browser (thanks @MobisysGmbH)
|
||||||
|
- Fixed #441: sensible data can be cached in cache.db on iOS (thanks dtarnawsky)
|
||||||
|
|
||||||
|
# 3.3.0
|
||||||
|
|
||||||
|
- Feature #451: expose response object on `downloadFile()` (thanks to @MobisysGmbH)
|
||||||
|
|
||||||
|
# 3.2.2
|
||||||
|
|
||||||
|
- Fixed #438: requests not working correctly on browser platform because request options are not processed correctly
|
||||||
|
|
||||||
## 3.2.1
|
## 3.2.1
|
||||||
|
|
||||||
- Fixed #425: plugin crashes on Android SDK levels < 24
|
- Fixed #425: plugin crashes on Android SDK levels < 24
|
||||||
|
|||||||
+1
-6
@@ -73,10 +73,5 @@ If we suggest changes or the [CI build fails](#cibuild), then:
|
|||||||
That's it! Thank you for your contribution!
|
That's it! Thank you for your contribution!
|
||||||
|
|
||||||
### <a name="cibuild"></a> Pull Request Feedback
|
### <a name="cibuild"></a> Pull Request Feedback
|
||||||
You can always check the results of the latest CI builds on
|
You can always check the results of the latest CI builds on [Github Actions](https://github.com/silkimen/cordova-plugin-advanced-http/actions).
|
||||||
[Travis CI](https://travis-ci.org/silkimen/cordova-plugin-advanced-http/).
|
|
||||||
You can use this information to inspect failing tests in your PR.
|
You can use this information to inspect failing tests in your PR.
|
||||||
|
|
||||||
## Attribution
|
|
||||||
This document is adapted from
|
|
||||||
[AngularJS' Contribution Guidelines](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md)
|
|
||||||
|
|||||||
@@ -3,10 +3,7 @@ Cordova Advanced HTTP
|
|||||||
[](https://www.npmjs.com/package/cordova-plugin-advanced-http?activeTab=versions)
|
[](https://www.npmjs.com/package/cordova-plugin-advanced-http?activeTab=versions)
|
||||||
[](https://opensource.org/licenses/mit-license.php)
|
[](https://opensource.org/licenses/mit-license.php)
|
||||||
[](https://www.npmjs.com/package/cordova-plugin-advanced-http)
|
[](https://www.npmjs.com/package/cordova-plugin-advanced-http)
|
||||||
|
[](https://github.com/silkimen/cordova-plugin-advanced-http/actions)
|
||||||
[](https://app.travis-ci.com/silkimen/cordova-plugin-advanced-http)
|
|
||||||
[](https://github.com/silkimen/cordova-plugin-advanced-http/actions)
|
|
||||||
|
|
||||||
|
|
||||||
Cordova / Phonegap plugin for communicating with HTTP servers. Supports iOS, Android and [Browser](#browserSupport).
|
Cordova / Phonegap plugin for communicating with HTTP servers. Supports iOS, Android and [Browser](#browserSupport).
|
||||||
|
|
||||||
@@ -129,8 +126,9 @@ This defaults to `urlencoded`. You can also override the default content type he
|
|||||||
|
|
||||||
### setRequestTimeout
|
### setRequestTimeout
|
||||||
Set how long to wait for a request to respond, in seconds.
|
Set how long to wait for a request to respond, in seconds.
|
||||||
For Android, this will set both [connectTimeout](https://developer.android.com/reference/java/net/URLConnection#getConnectTimeout()) and [readTimeout](https://developer.android.com/reference/java/net/URLConnection#setReadTimeout(int))
|
For Android, this will set both [connectTimeout](https://developer.android.com/reference/java/net/URLConnection#getConnectTimeout()) and [readTimeout](https://developer.android.com/reference/java/net/URLConnection#setReadTimeout(int)).
|
||||||
For iOS, this will set [timeout interval](https://developer.apple.com/documentation/foundation/nsmutableurlrequest/1414063-timeoutinterval)
|
For iOS, this will set [timeout interval](https://developer.apple.com/documentation/foundation/nsmutableurlrequest/1414063-timeoutinterval).
|
||||||
|
For browser platform, this will set [timeout](https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest/timeout).
|
||||||
```js
|
```js
|
||||||
cordova.plugin.http.setRequestTimeout(5.0);
|
cordova.plugin.http.setRequestTimeout(5.0);
|
||||||
```
|
```
|
||||||
@@ -162,7 +160,7 @@ cordova.plugin.http.getCookieString(url);
|
|||||||
```
|
```
|
||||||
|
|
||||||
### setCookie
|
### setCookie
|
||||||
Add a custom cookie. Takes a URL, a cookie string and an options object. See [ToughCookie documentation](https://github.com/salesforce/tough-cookie#setcookiecookieorstring-currenturl-options-cberrcookie) for allowed options.
|
Add a custom cookie. Takes a URL, a cookie string and an options object. See [ToughCookie documentation](https://github.com/salesforce/tough-cookie#setcookiecookieorstring-currenturl-options-cberrcookie) for allowed options. Cookie will persist until removed with [removeCookies](#removecookies) or [clearCookies](#clearcookies).
|
||||||
|
|
||||||
```js
|
```js
|
||||||
cordova.plugin.http.setCookie(url, cookie, options);
|
cordova.plugin.http.setCookie(url, cookie, options);
|
||||||
@@ -413,21 +411,32 @@ cordova.plugin.http.uploadFile("https://google.com/", {
|
|||||||
```
|
```
|
||||||
|
|
||||||
### downloadFile<a name="downloadFile"></a>
|
### downloadFile<a name="downloadFile"></a>
|
||||||
Downloads a file and saves it to the device. Takes a URL, parameters, headers, and a filePath. See [post](#post) documentation for details on what is returned on failure. On success this function returns a cordova [FileEntry object](http://cordova.apache.org/docs/en/3.3.0/cordova_file_file.md.html#FileEntry).
|
Downloads a file and saves it to the device. Takes a URL, parameters, headers, and a filePath. See [post](#post) documentation for details on what is returned on failure. On success this function returns a cordova [FileEntry object](http://cordova.apache.org/docs/en/3.3.0/cordova_file_file.md.html#FileEntry) as first and the response object as second parameter.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
cordova.plugin.http.downloadFile("https://google.com/", {
|
cordova.plugin.http.downloadFile(
|
||||||
id: '12',
|
"https://google.com/",
|
||||||
message: 'test'
|
{ id: '12', message: 'test' },
|
||||||
}, { Authorization: 'OAuth2: token' }, 'file:///somepicture.jpg', function(entry) {
|
{ Authorization: 'OAuth2: token' },
|
||||||
// prints the filename
|
'file:///somepicture.jpg',
|
||||||
console.log(entry.name);
|
// success callback
|
||||||
|
function(entry, response) {
|
||||||
|
// prints the filename
|
||||||
|
console.log(entry.name);
|
||||||
|
|
||||||
// prints the filePath
|
// prints the filePath
|
||||||
console.log(entry.fullPath);
|
console.log(entry.fullPath);
|
||||||
}, function(response) {
|
|
||||||
console.error(response.error);
|
// prints all header key/value pairs
|
||||||
});
|
Object.keys(response.headers).forEach(function (key) {
|
||||||
|
console.log(key, response.headers[key]);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// error callback
|
||||||
|
function(response) {
|
||||||
|
console.error(response.error);
|
||||||
|
}
|
||||||
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
### abort<a name="abort"></a>
|
### abort<a name="abort"></a>
|
||||||
@@ -444,12 +453,15 @@ If the request is still in progress, the request's `failure` callback will be in
|
|||||||
var requestId = cordova.plugin.http.downloadFile("https://google.com/", {
|
var requestId = cordova.plugin.http.downloadFile("https://google.com/", {
|
||||||
id: '12',
|
id: '12',
|
||||||
message: 'test'
|
message: 'test'
|
||||||
}, { Authorization: 'OAuth2: token' }, 'file:///somepicture.jpg', function(entry) {
|
}, { Authorization: 'OAuth2: token' }, 'file:///somepicture.jpg', function(entry, response) {
|
||||||
// prints the filename
|
// prints the filename
|
||||||
console.log(entry.name);
|
console.log(entry.name);
|
||||||
|
|
||||||
// prints the filePath
|
// prints the filePath
|
||||||
console.log(entry.fullPath);
|
console.log(entry.fullPath);
|
||||||
|
|
||||||
|
// prints the status code
|
||||||
|
console.log(response.status);
|
||||||
}, function(response) {
|
}, function(response) {
|
||||||
// if request was actually aborted, failure callback with status -8 will be invoked
|
// if request was actually aborted, failure callback with status -8 will be invoked
|
||||||
if(response.status === -8){
|
if(response.status === -8){
|
||||||
@@ -499,7 +511,6 @@ We made a few modifications to the networking libraries.
|
|||||||
This plugin uses amazing cloud services to maintain quality. CI Builds and E2E testing are powered by:
|
This plugin uses amazing cloud services to maintain quality. CI Builds and E2E testing are powered by:
|
||||||
|
|
||||||
* [GitHub Actions](https://github.com/features/actions)
|
* [GitHub Actions](https://github.com/features/actions)
|
||||||
* [Travis CI](https://travis-ci.org/)
|
|
||||||
* [BrowserStack](https://www.browserstack.com/)
|
* [BrowserStack](https://www.browserstack.com/)
|
||||||
* [Sauce Labs](https://saucelabs.com/)
|
* [Sauce Labs](https://saucelabs.com/)
|
||||||
* [httpbin.org](https://httpbin.org/)
|
* [httpbin.org](https://httpbin.org/)
|
||||||
@@ -511,7 +522,7 @@ First, install current package with `npm install` to fetch dev dependencies.
|
|||||||
|
|
||||||
Then, to execute Javascript tests:
|
Then, to execute Javascript tests:
|
||||||
```shell
|
```shell
|
||||||
npm run testjs
|
npm run test:js
|
||||||
```
|
```
|
||||||
|
|
||||||
And, to execute E2E tests:
|
And, to execute E2E tests:
|
||||||
@@ -522,8 +533,8 @@ And, to execute E2E tests:
|
|||||||
- run
|
- run
|
||||||
- updating client and server certificates, building test app, and running e2e tests
|
- updating client and server certificates, building test app, and running e2e tests
|
||||||
```shell
|
```shell
|
||||||
npm run testandroid
|
npm run test:android
|
||||||
npm run testios
|
npm run test:ios
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contribute & Develop
|
## Contribute & Develop
|
||||||
|
|||||||
Generated
+4510
-3925
File diff suppressed because it is too large
Load Diff
+18
-16
@@ -1,17 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "cordova-plugin-advanced-http",
|
"name": "cordova-plugin-advanced-http",
|
||||||
"version": "3.2.1",
|
"version": "3.3.1",
|
||||||
"description": "Cordova / Phonegap plugin for communicating with HTTP servers using SSL pinning",
|
"description": "Cordova / Phonegap plugin for communicating with HTTP servers using SSL pinning",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"updatecert": "node ./scripts/update-e2e-server-cert.js && node ./scripts/update-e2e-client-cert.js",
|
"update:cert": "node ./scripts/update-e2e-server-cert.js && node ./scripts/update-e2e-client-cert.js",
|
||||||
"buildbrowser": "./scripts/build-test-app.sh --browser",
|
"build:browser": "./scripts/build-test-app.sh --browser",
|
||||||
"buildandroid": "./scripts/build-test-app.sh --android --emulator",
|
"build:android": "./scripts/build-test-app.sh --android --emulator",
|
||||||
"buildios": "./scripts/build-test-app.sh --ios --emulator",
|
"build:ios": "./scripts/build-test-app.sh --ios --emulator",
|
||||||
"testandroid": "npm run updatecert && npm run buildandroid && ./scripts/test-app.sh --android --emulator",
|
"lint": "eslint . --ext .js",
|
||||||
"testios": "npm run updatecert && npm run buildios && ./scripts/test-app.sh --ios --emulator",
|
"test:android": "npm run update:cert && npm run build:android && ./scripts/test-app.sh --android --emulator",
|
||||||
"testapp": "npm run testandroid && npm run testios",
|
"test:ios": "npm run update:cert && npm run build:ios && ./scripts/test-app.sh --ios --emulator",
|
||||||
"testjs": "mocha ./test/js-specs.js",
|
"test:app": "npm run test:android && npm run test:ios",
|
||||||
"test": "npm run testjs && npm run testapp",
|
"test:js": "mocha ./test/js-specs.js",
|
||||||
|
"test": "npm run test:js && npm run test:app",
|
||||||
"release": "npm run test && ./scripts/release.sh"
|
"release": "npm run test && ./scripts/release.sh"
|
||||||
},
|
},
|
||||||
"cordova": {
|
"cordova": {
|
||||||
@@ -58,12 +59,13 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/silkimen/cordova-plugin-advanced-http#readme",
|
"homepage": "https://github.com/silkimen/cordova-plugin-advanced-http#readme",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"chai": "4.2.0",
|
"chai": "4.3.6",
|
||||||
"colors": "1.4.0",
|
"colors": "1.4.0",
|
||||||
"cordova": "10.0.0",
|
"cordova": "11.0.0",
|
||||||
"mocha": "8.2.0",
|
"eslint": "^8.57.0",
|
||||||
"umd-tough-cookie": "2.4.3",
|
"mocha": "9.2.2",
|
||||||
"wd": "1.12.1",
|
"umd-tough-cookie": "3.0.0",
|
||||||
"xml2js": "0.4.23"
|
"wd": "1.14.0",
|
||||||
|
"xml2js": "0.5.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-advanced-http" version="3.2.1">
|
<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android" id="cordova-plugin-advanced-http" version="3.3.1">
|
||||||
<name>Advanced HTTP plugin</name>
|
<name>Advanced HTTP plugin</name>
|
||||||
<description>
|
<description>
|
||||||
Cordova / Phonegap plugin for communicating with HTTP servers using SSL pinning
|
Cordova / Phonegap plugin for communicating with HTTP servers using SSL pinning
|
||||||
@@ -67,6 +67,7 @@
|
|||||||
</config-file>
|
</config-file>
|
||||||
<config-file target="AndroidManifest.xml" parent="/manifest">
|
<config-file target="AndroidManifest.xml" parent="/manifest">
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
</config-file>
|
</config-file>
|
||||||
<source-file src="src/android/com/silkimen/cordovahttp/CordovaClientAuth.java" target-dir="src/com/silkimen/cordovahttp"/>
|
<source-file src="src/android/com/silkimen/cordovahttp/CordovaClientAuth.java" target-dir="src/com/silkimen/cordovahttp"/>
|
||||||
<source-file src="src/android/com/silkimen/cordovahttp/CordovaHttpBase.java" target-dir="src/com/silkimen/cordovahttp"/>
|
<source-file src="src/android/com/silkimen/cordovahttp/CordovaHttpBase.java" target-dir="src/com/silkimen/cordovahttp"/>
|
||||||
|
|||||||
@@ -17,13 +17,20 @@ if [ $PLATFORM = "android" ]; then
|
|||||||
-F "file=@$TEMP/platforms/android/app/build/outputs/apk/debug/app-debug.apk" \
|
-F "file=@$TEMP/platforms/android/app/build/outputs/apk/debug/app-debug.apk" \
|
||||||
-F "data={\"custom_id\": \"HttpTestAppAndroid\"}"
|
-F "data={\"custom_id\": \"HttpTestAppAndroid\"}"
|
||||||
else
|
else
|
||||||
rm -rf $TEMP/HttpDemo.ipa
|
rm -rf "$TEMP/HttpDemo.ipa"
|
||||||
pushd $TEMP/platforms/ios/build/emulator
|
IOS_BUILD_DIR="$TEMP/platforms/ios/build/Debug-iphonesimulator"
|
||||||
rm -rf ./Payload
|
APP_PATH="$IOS_BUILD_DIR/HttpDemo.app"
|
||||||
mkdir -p ./Payload
|
if [ ! -d "$APP_PATH" ]; then
|
||||||
cp -r ./HttpDemo.app ./Payload/HttpDemo.app
|
echo "Unable to locate $APP_PATH" >&2
|
||||||
zip -r $TEMP/HttpDemo.ipa ./Payload
|
exit 1
|
||||||
popd
|
fi
|
||||||
|
|
||||||
|
PAYLOAD_DIR="$TEMP/Payload"
|
||||||
|
rm -rf "$PAYLOAD_DIR"
|
||||||
|
mkdir -p "$PAYLOAD_DIR"
|
||||||
|
cp -R "$APP_PATH" "$PAYLOAD_DIR/HttpDemo.app"
|
||||||
|
(cd "$TEMP" && zip -qr HttpDemo.ipa Payload)
|
||||||
|
rm -rf "$PAYLOAD_DIR"
|
||||||
|
|
||||||
curl -u $BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY \
|
curl -u $BROWSERSTACK_USERNAME:$BROWSERSTACK_ACCESS_KEY \
|
||||||
-X POST \
|
-X POST \
|
||||||
|
|||||||
@@ -133,7 +133,6 @@ abstract class CordovaHttpBase implements Runnable {
|
|||||||
request.followRedirects(this.followRedirects);
|
request.followRedirects(this.followRedirects);
|
||||||
request.connectTimeout(this.connectTimeout);
|
request.connectTimeout(this.connectTimeout);
|
||||||
request.readTimeout(this.readTimeout);
|
request.readTimeout(this.readTimeout);
|
||||||
request.acceptCharset("UTF-8");
|
|
||||||
request.uncompress(true);
|
request.uncompress(true);
|
||||||
|
|
||||||
if (this.tlsConfiguration.getHostnameVerifier() != null) {
|
if (this.tlsConfiguration.getHostnameVerifier() != null) {
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ import org.json.JSONArray;
|
|||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.NetworkInfo;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
|
|
||||||
@@ -67,6 +70,23 @@ public class CordovaHttpPlugin extends CordovaPlugin implements Observer {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ("setServerTrustMode".equals(action)) {
|
||||||
|
return this.setServerTrustMode(args, callbackContext);
|
||||||
|
} else if ("setClientAuthMode".equals(action)) {
|
||||||
|
return this.setClientAuthMode(args, callbackContext);
|
||||||
|
} else if ("abort".equals(action)) {
|
||||||
|
return this.abort(args, callbackContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNetworkAvailable()) {
|
||||||
|
CordovaHttpResponse response = new CordovaHttpResponse();
|
||||||
|
response.setStatus(-6);
|
||||||
|
response.setErrorMessage("No network connection available");
|
||||||
|
callbackContext.error(response.toJSON());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if ("get".equals(action)) {
|
if ("get".equals(action)) {
|
||||||
return this.executeHttpRequestWithoutData(action, args, callbackContext);
|
return this.executeHttpRequestWithoutData(action, args, callbackContext);
|
||||||
} else if ("head".equals(action)) {
|
} else if ("head".equals(action)) {
|
||||||
@@ -85,12 +105,6 @@ public class CordovaHttpPlugin extends CordovaPlugin implements Observer {
|
|||||||
return this.uploadFiles(args, callbackContext);
|
return this.uploadFiles(args, callbackContext);
|
||||||
} else if ("downloadFile".equals(action)) {
|
} else if ("downloadFile".equals(action)) {
|
||||||
return this.downloadFile(args, callbackContext);
|
return this.downloadFile(args, callbackContext);
|
||||||
} else if ("setServerTrustMode".equals(action)) {
|
|
||||||
return this.setServerTrustMode(args, callbackContext);
|
|
||||||
} else if ("setClientAuthMode".equals(action)) {
|
|
||||||
return this.setClientAuthMode(args, callbackContext);
|
|
||||||
} else if ("abort".equals(action)) {
|
|
||||||
return this.abort(args, callbackContext);
|
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -249,4 +263,11 @@ public class CordovaHttpPlugin extends CordovaPlugin implements Observer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isNetworkAvailable() {
|
||||||
|
ConnectivityManager connectivityManager = (ConnectivityManager) cordova.getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
|
||||||
|
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class CordovaServerTrust implements Runnable {
|
|||||||
this.tlsConfiguration.setTrustManagers(this.noOpTrustManagers);
|
this.tlsConfiguration.setTrustManagers(this.noOpTrustManagers);
|
||||||
} else if ("pinned".equals(this.mode)) {
|
} else if ("pinned".equals(this.mode)) {
|
||||||
this.tlsConfiguration.setHostnameVerifier(null);
|
this.tlsConfiguration.setHostnameVerifier(null);
|
||||||
this.tlsConfiguration.setTrustManagers(this.getTrustManagers(this.getCertsFromBundle("www/certificates")));
|
this.tlsConfiguration.setTrustManagers(this.getTrustManagers(this.getCertsFromBundle(getWebAssetDir() + "/certificates")));
|
||||||
} else {
|
} else {
|
||||||
this.tlsConfiguration.setHostnameVerifier(null);
|
this.tlsConfiguration.setHostnameVerifier(null);
|
||||||
this.tlsConfiguration.setTrustManagers(this.getTrustManagers(this.getCertsFromKeyStore("AndroidCAStore")));
|
this.tlsConfiguration.setTrustManagers(this.getTrustManagers(this.getCertsFromKeyStore("AndroidCAStore")));
|
||||||
@@ -84,6 +84,14 @@ class CordovaServerTrust implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getWebAssetDir() {
|
||||||
|
return isRunningOnCapacitor()? "public" : "www";
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRunningOnCapacitor() {
|
||||||
|
return this.activity.getClass().getSuperclass().getName().contains("com.getcapacitor");
|
||||||
|
}
|
||||||
|
|
||||||
private TrustManager[] getTrustManagers(KeyStore store) throws GeneralSecurityException {
|
private TrustManager[] getTrustManagers(KeyStore store) throws GeneralSecurityException {
|
||||||
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
||||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
|
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
|
||||||
|
|||||||
Vendored
+43
-22
@@ -151,23 +151,27 @@ function setHeaders(xhr, headers) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sendRequest(method, withData, opts, success, failure) {
|
function sendRequest(method, withData, opts, success, failure) {
|
||||||
var data, serializer, headers, timeout, followRedirect, responseType, reqId;
|
var data, serializer, headers, readTimeout, followRedirect, responseType, reqId;
|
||||||
var url = opts[0];
|
var url = opts[0];
|
||||||
|
|
||||||
if (withData) {
|
if (withData) {
|
||||||
data = opts[1];
|
data = opts[1];
|
||||||
serializer = opts[2];
|
serializer = opts[2];
|
||||||
headers = opts[3];
|
headers = opts[3];
|
||||||
timeout = opts[4];
|
// connect timeout not applied
|
||||||
followRedirect = opts[5];
|
// connectTimeout = opts[4];
|
||||||
responseType = opts[6];
|
readTimeout = opts[5];
|
||||||
reqId = opts[7];
|
followRedirect = opts[6];
|
||||||
|
responseType = opts[7];
|
||||||
|
reqId = opts[8];
|
||||||
} else {
|
} else {
|
||||||
headers = opts[1];
|
headers = opts[1];
|
||||||
timeout = opts[2];
|
// connect timeout not applied
|
||||||
followRedirect = opts[3];
|
// connectTimeout = opts[2];
|
||||||
responseType = opts[4];
|
readTimeout = opts[3];
|
||||||
reqId = opts[5];
|
followRedirect = opts[4];
|
||||||
|
responseType = opts[5];
|
||||||
|
reqId = opts[6];
|
||||||
}
|
}
|
||||||
|
|
||||||
var onSuccess = injectRequestIdHandler(reqId, success);
|
var onSuccess = injectRequestIdHandler(reqId, success);
|
||||||
@@ -189,7 +193,7 @@ function sendRequest(method, withData, opts, success, failure) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (serializer) {
|
switch (serializer) {
|
||||||
case 'json':
|
case 'json': {
|
||||||
setDefaultContentType(headers, 'application/json; charset=utf8');
|
setDefaultContentType(headers, 'application/json; charset=utf8');
|
||||||
processedData = serializeJsonData(data);
|
processedData = serializeJsonData(data);
|
||||||
|
|
||||||
@@ -198,18 +202,21 @@ function sendRequest(method, withData, opts, success, failure) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'utf8':
|
case 'utf8': {
|
||||||
setDefaultContentType(headers, 'text/plain; charset=utf8');
|
setDefaultContentType(headers, 'text/plain; charset=utf8');
|
||||||
processedData = data.text;
|
processedData = data.text;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'urlencoded':
|
case 'urlencoded': {
|
||||||
setDefaultContentType(headers, 'application/x-www-form-urlencoded');
|
setDefaultContentType(headers, 'application/x-www-form-urlencoded');
|
||||||
processedData = serializeParams(data);
|
processedData = serializeParams(data);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'multipart':
|
case 'multipart': {
|
||||||
const contentType = getHeaderValue(headers, 'Content-Type');
|
const contentType = getHeaderValue(headers, 'Content-Type');
|
||||||
|
|
||||||
// intentionally don't set a default content type
|
// intentionally don't set a default content type
|
||||||
@@ -220,17 +227,31 @@ function sendRequest(method, withData, opts, success, failure) {
|
|||||||
|
|
||||||
processedData = processMultipartData(data);
|
processedData = processMultipartData(data);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'raw':
|
case 'raw': {
|
||||||
setDefaultContentType(headers, 'application/octet-stream');
|
setDefaultContentType(headers, 'application/octet-stream');
|
||||||
processedData = data;
|
processedData = data;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// requesting text instead of JSON because it's parsed in the response handler
|
// requesting text instead of JSON because it's parsed in the response handler
|
||||||
xhr.responseType = responseType === 'json' ? 'text' : responseType;
|
xhr.responseType = responseType === 'json' ? 'text' : responseType;
|
||||||
xhr.timeout = timeout * 1000;
|
|
||||||
setHeaders(xhr, headers);
|
// we can't set connect timeout and read timeout separately on browser platform
|
||||||
|
xhr.timeout = readTimeout * 1000;
|
||||||
|
|
||||||
|
try {
|
||||||
|
setHeaders(xhr, headers);
|
||||||
|
} catch(error) {
|
||||||
|
return onFail({
|
||||||
|
status: -1,
|
||||||
|
error: error,
|
||||||
|
url: url,
|
||||||
|
headers: headers
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
xhr.onerror = function () {
|
xhr.onerror = function () {
|
||||||
return onFail(createXhrFailureObject(xhr));
|
return onFail(createXhrFailureObject(xhr));
|
||||||
@@ -267,7 +288,7 @@ function sendRequest(method, withData, opts, success, failure) {
|
|||||||
xhr.send(processedData);
|
xhr.send(processedData);
|
||||||
}
|
}
|
||||||
|
|
||||||
function abort(opts, success, failure) {
|
function abort(opts, success) {
|
||||||
var reqId = opts[0];
|
var reqId = opts[0];
|
||||||
var result = false;
|
var result = false;
|
||||||
|
|
||||||
@@ -302,19 +323,19 @@ var browserInterface = {
|
|||||||
abort: function (success, failure, opts) {
|
abort: function (success, failure, opts) {
|
||||||
return abort(opts, success, failure);
|
return abort(opts, success, failure);
|
||||||
},
|
},
|
||||||
uploadFile: function (success, failure, opts) {
|
uploadFile: function (success, failure) {
|
||||||
return failure('advanced-http: function "uploadFile" not supported on browser platform');
|
return failure('advanced-http: function "uploadFile" not supported on browser platform');
|
||||||
},
|
},
|
||||||
uploadFiles: function (success, failure, opts) {
|
uploadFiles: function (success, failure) {
|
||||||
return failure('advanced-http: function "uploadFiles" not supported on browser platform');
|
return failure('advanced-http: function "uploadFiles" not supported on browser platform');
|
||||||
},
|
},
|
||||||
downloadFile: function (success, failure, opts) {
|
downloadFile: function (success, failure) {
|
||||||
return failure('advanced-http: function "downloadFile" not supported on browser platform');
|
return failure('advanced-http: function "downloadFile" not supported on browser platform');
|
||||||
},
|
},
|
||||||
setServerTrustMode: function (success, failure, opts) {
|
setServerTrustMode: function (success, failure) {
|
||||||
return failure('advanced-http: function "setServerTrustMode" not supported on browser platform');
|
return failure('advanced-http: function "setServerTrustMode" not supported on browser platform');
|
||||||
},
|
},
|
||||||
setClientAuthMode: function (success, failure, opts) {
|
setClientAuthMode: function (success, failure) {
|
||||||
return failure('advanced-http: function "setClientAuthMode" not supported on browser platform');
|
return failure('advanced-http: function "setClientAuthMode" not supported on browser platform');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import "SM_AFURLRequestSerialization.h"
|
#import "SM_AFURLRequestSerialization.h"
|
||||||
|
|
||||||
@interface BinaryRequestSerializer : AFHTTPRequestSerializer
|
@interface BinaryRequestSerializer : SM_AFHTTPRequestSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer;
|
+ (instancetype)serializer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import "SM_AFURLResponseSerialization.h"
|
#import "SM_AFURLResponseSerialization.h"
|
||||||
|
|
||||||
@interface BinaryResponseSerializer : AFHTTPResponseSerializer
|
@interface BinaryResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer;
|
+ (instancetype)serializer;
|
||||||
|
|
||||||
|
|||||||
@@ -42,13 +42,13 @@
|
|||||||
|
|
||||||
- (void)setRequestSerializer:(NSString*)serializerName forManager:(SM_AFHTTPSessionManager*)manager {
|
- (void)setRequestSerializer:(NSString*)serializerName forManager:(SM_AFHTTPSessionManager*)manager {
|
||||||
if ([serializerName isEqualToString:@"json"]) {
|
if ([serializerName isEqualToString:@"json"]) {
|
||||||
manager.requestSerializer = [AFJSONRequestSerializer serializer];
|
manager.requestSerializer = [SM_AFJSONRequestSerializer serializer];
|
||||||
} else if ([serializerName isEqualToString:@"utf8"]) {
|
} else if ([serializerName isEqualToString:@"utf8"]) {
|
||||||
manager.requestSerializer = [TextRequestSerializer serializer];
|
manager.requestSerializer = [TextRequestSerializer serializer];
|
||||||
} else if ([serializerName isEqualToString:@"raw"]) {
|
} else if ([serializerName isEqualToString:@"raw"]) {
|
||||||
manager.requestSerializer = [BinaryRequestSerializer serializer];
|
manager.requestSerializer = [BinaryRequestSerializer serializer];
|
||||||
} else {
|
} else {
|
||||||
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
|
manager.requestSerializer = [SM_AFHTTPRequestSerializer serializer];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,8 +404,18 @@
|
|||||||
} else {
|
} else {
|
||||||
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
|
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
|
||||||
SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
|
SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
|
||||||
|
SecTrustRef trust = (SecTrustRef)CFDictionaryGetValue(identityDict, kSecImportItemTrust);
|
||||||
|
|
||||||
self->x509Credential = [NSURLCredential credentialWithIdentity:identity certificates: nil persistence:NSURLCredentialPersistenceForSession];
|
int count = (int)SecTrustGetCertificateCount(trust);
|
||||||
|
NSMutableArray* trustCertificates = nil;
|
||||||
|
if (count > 1) {
|
||||||
|
trustCertificates = [NSMutableArray arrayWithCapacity:SecTrustGetCertificateCount(trust)];
|
||||||
|
for (int i=1;i<count; ++i) {
|
||||||
|
[trustCertificates addObject:(id)SecTrustGetCertificateAtIndex(trust, i)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self->x509Credential = [NSURLCredential credentialWithIdentity:identity certificates: trustCertificates persistence:NSURLCredentialPersistenceForSession];
|
||||||
CFRelease(items);
|
CFRelease(items);
|
||||||
|
|
||||||
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
|
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
|
||||||
@@ -513,7 +523,7 @@
|
|||||||
|
|
||||||
- (void)downloadFile:(CDVInvokedUrlCommand*)command {
|
- (void)downloadFile:(CDVInvokedUrlCommand*)command {
|
||||||
SM_AFHTTPSessionManager *manager = [SM_AFHTTPSessionManager manager];
|
SM_AFHTTPSessionManager *manager = [SM_AFHTTPSessionManager manager];
|
||||||
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
|
manager.responseSerializer = [SM_AFHTTPResponseSerializer serializer];
|
||||||
|
|
||||||
NSString *url = [command.arguments objectAtIndex:0];
|
NSString *url = [command.arguments objectAtIndex:0];
|
||||||
NSDictionary *headers = [command.arguments objectAtIndex:1];
|
NSDictionary *headers = [command.arguments objectAtIndex:1];
|
||||||
|
|||||||
@@ -81,18 +81,18 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (readonly, nonatomic, strong, nullable) NSURL *baseURL;
|
@property (readonly, nonatomic, strong, nullable) NSURL *baseURL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies.
|
Requests created with `requestWithMethod:URLString:parameters:` & `multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:` are constructed with a set of default headers using a parameter serialization specified by this property. By default, this is set to an instance of `SM_AFHTTPRequestSerializer`, which serializes query string parameters for `GET`, `HEAD`, and `DELETE` requests, or otherwise URL-form-encodes HTTP message bodies.
|
||||||
|
|
||||||
@warning `requestSerializer` must not be `nil`.
|
@warning `requestSerializer` must not be `nil`.
|
||||||
*/
|
*/
|
||||||
@property (nonatomic, strong) AFHTTPRequestSerializer <SM_AFURLRequestSerialization> * requestSerializer;
|
@property (nonatomic, strong) SM_AFHTTPRequestSerializer <SM_AFURLRequestSerialization> * requestSerializer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`.
|
Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `SM_AFJSONResponseSerializer`.
|
||||||
|
|
||||||
@warning `responseSerializer` must not be `nil`.
|
@warning `responseSerializer` must not be `nil`.
|
||||||
*/
|
*/
|
||||||
@property (nonatomic, strong) AFHTTPResponseSerializer <SM_AFURLResponseSerialization> * responseSerializer;
|
@property (nonatomic, strong) SM_AFHTTPResponseSerializer <SM_AFURLResponseSerialization> * responseSerializer;
|
||||||
|
|
||||||
///---------------------
|
///---------------------
|
||||||
/// @name Initialization
|
/// @name Initialization
|
||||||
|
|||||||
@@ -78,21 +78,21 @@
|
|||||||
|
|
||||||
self.baseURL = url;
|
self.baseURL = url;
|
||||||
|
|
||||||
self.requestSerializer = [AFHTTPRequestSerializer serializer];
|
self.requestSerializer = [SM_AFHTTPRequestSerializer serializer];
|
||||||
self.responseSerializer = [AFJSONResponseSerializer serializer];
|
self.responseSerializer = [SM_AFJSONResponseSerializer serializer];
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
- (void)setRequestSerializer:(AFHTTPRequestSerializer <SM_AFURLRequestSerialization> *)requestSerializer {
|
- (void)setRequestSerializer:(SM_AFHTTPRequestSerializer <SM_AFURLRequestSerialization> *)requestSerializer {
|
||||||
NSParameterAssert(requestSerializer);
|
NSParameterAssert(requestSerializer);
|
||||||
|
|
||||||
_requestSerializer = requestSerializer;
|
_requestSerializer = requestSerializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setResponseSerializer:(AFHTTPResponseSerializer <SM_AFURLResponseSerialization> *)responseSerializer {
|
- (void)setResponseSerializer:(SM_AFHTTPResponseSerializer <SM_AFURLResponseSerialization> *)responseSerializer {
|
||||||
NSParameterAssert(responseSerializer);
|
NSParameterAssert(responseSerializer);
|
||||||
|
|
||||||
[super setResponseSerializer:responseSerializer];
|
[super setResponseSerializer:responseSerializer];
|
||||||
@@ -426,8 +426,8 @@
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requestSerializer = [decoder decodeObjectOfClass:[AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))];
|
self.requestSerializer = [decoder decodeObjectOfClass:[SM_AFHTTPRequestSerializer class] forKey:NSStringFromSelector(@selector(requestSerializer))];
|
||||||
self.responseSerializer = [decoder decodeObjectOfClass:[AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))];
|
self.responseSerializer = [decoder decodeObjectOfClass:[SM_AFHTTPResponseSerializer class] forKey:NSStringFromSelector(@selector(responseSerializer))];
|
||||||
SM_AFSecurityPolicy *decodedPolicy = [decoder decodeObjectOfClass:[SM_AFSecurityPolicy class] forKey:NSStringFromSelector(@selector(securityPolicy))];
|
SM_AFSecurityPolicy *decodedPolicy = [decoder decodeObjectOfClass:[SM_AFSecurityPolicy class] forKey:NSStringFromSelector(@selector(securityPolicy))];
|
||||||
if (decodedPolicy) {
|
if (decodedPolicy) {
|
||||||
self.securityPolicy = decodedPolicy;
|
self.securityPolicy = decodedPolicy;
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ FOUNDATION_EXPORT NSString * const SM_AFNetworkingReachabilityNotificationStatus
|
|||||||
/**
|
/**
|
||||||
Returns a localized string representation of an `AFNetworkReachabilityStatus` value.
|
Returns a localized string representation of an `AFNetworkReachabilityStatus` value.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status);
|
FOUNDATION_EXPORT NSString * SM_AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status);
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ NSString * const SM_AFNetworkingReachabilityNotificationStatusItem = @"SM_AFNetw
|
|||||||
|
|
||||||
typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status);
|
typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status);
|
||||||
|
|
||||||
NSString * AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) {
|
NSString * SM_AFStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus status) {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case AFNetworkReachabilityStatusNotReachable:
|
case AFNetworkReachabilityStatusNotReachable:
|
||||||
return NSLocalizedStringFromTable(@"Not Reachable", @"SM_AFNetworking", nil);
|
return NSLocalizedStringFromTable(@"Not Reachable", @"SM_AFNetworking", nil);
|
||||||
@@ -240,7 +240,7 @@ static void AFNetworkReachabilityReleaseCallback(const void *info) {
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
- (NSString *)localizedNetworkReachabilityStatusString {
|
- (NSString *)localizedNetworkReachabilityStatusString {
|
||||||
return AFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus);
|
return SM_AFStringFromNetworkReachabilityStatus(self.networkReachabilityStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|||||||
@@ -155,8 +155,18 @@ static NSArray * AFPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) {
|
|||||||
|
|
||||||
@implementation SM_AFSecurityPolicy
|
@implementation SM_AFSecurityPolicy
|
||||||
|
|
||||||
|
+(BOOL) isRunningOnCapacitor {
|
||||||
|
return NSClassFromString(@"CAPPlugin") != nil;
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSSet *)certificatesInBundle:(NSBundle *)bundle {
|
+ (NSSet *)certificatesInBundle:(NSBundle *)bundle {
|
||||||
NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"www/certificates"];
|
NSString* assetDir = @"www";
|
||||||
|
if([self isRunningOnCapacitor]) {
|
||||||
|
// we are running on capacitor and its assets dir is 'public'
|
||||||
|
assetDir = @"public";
|
||||||
|
}
|
||||||
|
|
||||||
|
NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory: [NSString stringWithFormat:@"%@/certificates", assetDir]];
|
||||||
NSMutableSet *certificates = [NSMutableSet setWithCapacity:[paths count]];
|
NSMutableSet *certificates = [NSMutableSet setWithCapacity:[paths count]];
|
||||||
|
|
||||||
for (NSString *path in paths) {
|
for (NSString *path in paths) {
|
||||||
@@ -171,7 +181,7 @@ static NSArray * AFPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) {
|
|||||||
static NSSet *_defaultPinnedCertificates = nil;
|
static NSSet *_defaultPinnedCertificates = nil;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
|
NSBundle *bundle = [self isRunningOnCapacitor] ? [NSBundle mainBundle] : [NSBundle bundleForClass:[self class]];
|
||||||
_defaultPinnedCertificates = [self certificatesInBundle:bundle];
|
_defaultPinnedCertificates = [self certificatesInBundle:bundle];
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
@return The percent-escaped string.
|
@return The percent-escaped string.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString * AFPercentEscapedStringFromString(NSString *string);
|
FOUNDATION_EXPORT NSString * SM_AFPercentEscapedStringFromString(NSString *string);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A helper method to generate encoded url query parameters for appending to the end of a URL.
|
A helper method to generate encoded url query parameters for appending to the end of a URL.
|
||||||
@@ -53,7 +53,7 @@ FOUNDATION_EXPORT NSString * AFPercentEscapedStringFromString(NSString *string);
|
|||||||
|
|
||||||
@return A url encoded query string
|
@return A url encoded query string
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString * AFQueryStringFromParameters(NSDictionary *parameters);
|
FOUNDATION_EXPORT NSString * SM_AFQueryStringFromParameters(NSDictionary *parameters);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `SM_AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary.
|
The `SM_AFURLRequestSerialization` protocol is adopted by an object that encodes parameters for a specified HTTP requests. Request serializers may encode parameters as query strings, HTTP bodies, setting the appropriate HTTP header fields as necessary.
|
||||||
@@ -89,11 +89,11 @@ typedef NS_ENUM(NSUInteger, AFHTTPRequestQueryStringSerializationStyle) {
|
|||||||
@protocol AFMultipartFormData;
|
@protocol AFMultipartFormData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFHTTPRequestSerializer` conforms to the `SM_AFURLRequestSerialization` & `SM_AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation.
|
`SM_AFHTTPRequestSerializer` conforms to the `SM_AFURLRequestSerialization` & `SM_AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation.
|
||||||
|
|
||||||
Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPRequestSerializer` in order to ensure consistent default behavior.
|
Any request or response serializer dealing with HTTP is encouraged to subclass `SM_AFHTTPRequestSerializer` in order to ensure consistent default behavior.
|
||||||
*/
|
*/
|
||||||
@interface AFHTTPRequestSerializer : NSObject <SM_AFURLRequestSerialization>
|
@interface SM_AFHTTPRequestSerializer : NSObject <SM_AFURLRequestSerialization>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default.
|
The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default.
|
||||||
@@ -278,7 +278,7 @@ forHTTPHeaderField:(NSString *)field;
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`.
|
The `AFMultipartFormData` protocol defines the methods supported by the parameter in the block argument of `SM_AFHTTPRequestSerializer -multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:`.
|
||||||
*/
|
*/
|
||||||
@protocol AFMultipartFormData
|
@protocol AFMultipartFormData
|
||||||
|
|
||||||
@@ -365,7 +365,7 @@ forHTTPHeaderField:(NSString *)field;
|
|||||||
/**
|
/**
|
||||||
Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream.
|
Throttles request bandwidth by limiting the packet size and adding a delay for each chunk read from the upload stream.
|
||||||
|
|
||||||
When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`kAFUploadStream3GSuggestedPacketSize` and `kAFUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, there is no definite way to distinguish between a 3G, EDGE, or LTE connection over `NSURLConnection`. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth.
|
When uploading over a 3G or EDGE connection, requests may fail with "request body stream exhausted". Setting a maximum packet size and delay according to the recommended values (`SM_kAFUploadStream3GSuggestedPacketSize` and `SM_kAFUploadStream3GSuggestedDelay`) lowers the risk of the input stream exceeding its allocated bandwidth. Unfortunately, there is no definite way to distinguish between a 3G, EDGE, or LTE connection over `NSURLConnection`. As such, it is not recommended that you throttle bandwidth based solely on network reachability. Instead, you should consider checking for the "request body stream exhausted" in a failure block, and then retrying the request with throttled bandwidth.
|
||||||
|
|
||||||
@param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 16kb.
|
@param numberOfBytes Maximum packet size, in number of bytes. The default packet size for an input stream is 16kb.
|
||||||
@param delay Duration of delay each time a packet is read. By default, no delay is set.
|
@param delay Duration of delay each time a packet is read. By default, no delay is set.
|
||||||
@@ -378,9 +378,9 @@ forHTTPHeaderField:(NSString *)field;
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`.
|
`SM_AFJSONRequestSerializer` is a subclass of `SM_AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`.
|
||||||
*/
|
*/
|
||||||
@interface AFJSONRequestSerializer : AFHTTPRequestSerializer
|
@interface SM_AFJSONRequestSerializer : SM_AFHTTPRequestSerializer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Options for writing the request JSON data from Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONWritingOptions". `0` by default.
|
Options for writing the request JSON data from Foundation objects. For possible values, see the `NSJSONSerialization` documentation section "NSJSONWritingOptions". `0` by default.
|
||||||
@@ -399,9 +399,9 @@ forHTTPHeaderField:(NSString *)field;
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFPropertyListRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`.
|
`SM_AFPropertyListRequestSerializer` is a subclass of `SM_AFHTTPRequestSerializer` that encodes parameters as JSON using `NSPropertyListSerializer`, setting the `Content-Type` of the encoded request to `application/x-plist`.
|
||||||
*/
|
*/
|
||||||
@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer
|
@interface SM_AFPropertyListRequestSerializer : SM_AFHTTPRequestSerializer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The property list format. Possible values are described in "NSPropertyListFormat".
|
The property list format. Possible values are described in "NSPropertyListFormat".
|
||||||
@@ -467,13 +467,13 @@ FOUNDATION_EXPORT NSString * const SM_AFNetworkingOperationFailingURLRequestErro
|
|||||||
|
|
||||||
### Constants
|
### Constants
|
||||||
|
|
||||||
`kAFUploadStream3GSuggestedPacketSize`
|
`SM_kAFUploadStream3GSuggestedPacketSize`
|
||||||
Maximum packet size, in number of bytes. Equal to 16kb.
|
Maximum packet size, in number of bytes. Equal to 16kb.
|
||||||
|
|
||||||
`kAFUploadStream3GSuggestedDelay`
|
`SM_kAFUploadStream3GSuggestedDelay`
|
||||||
Duration of delay each time a packet is read. Equal to 0.2 seconds.
|
Duration of delay each time a packet is read. Equal to 0.2 seconds.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSUInteger const kAFUploadStream3GSuggestedPacketSize;
|
FOUNDATION_EXPORT NSUInteger const SM_kAFUploadStream3GSuggestedPacketSize;
|
||||||
FOUNDATION_EXPORT NSTimeInterval const kAFUploadStream3GSuggestedDelay;
|
FOUNDATION_EXPORT NSTimeInterval const SM_kAFUploadStream3GSuggestedDelay;
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ typedef NSString * (^AFQueryStringSerializationBlock)(NSURLRequest *request, id
|
|||||||
- parameter string: The string to be percent-escaped.
|
- parameter string: The string to be percent-escaped.
|
||||||
- returns: The percent-escaped string.
|
- returns: The percent-escaped string.
|
||||||
*/
|
*/
|
||||||
NSString * AFPercentEscapedStringFromString(NSString *string) {
|
NSString * SM_AFPercentEscapedStringFromString(NSString *string) {
|
||||||
static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4
|
static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4
|
||||||
static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;=";
|
static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;=";
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ NSString * AFPercentEscapedStringFromString(NSString *string) {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@interface AFQueryStringPair : NSObject
|
@interface SM_AFQueryStringPair : NSObject
|
||||||
@property (readwrite, nonatomic, strong) id field;
|
@property (readwrite, nonatomic, strong) id field;
|
||||||
@property (readwrite, nonatomic, strong) id value;
|
@property (readwrite, nonatomic, strong) id value;
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ NSString * AFPercentEscapedStringFromString(NSString *string) {
|
|||||||
- (NSString *)URLEncodedStringValue;
|
- (NSString *)URLEncodedStringValue;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFQueryStringPair
|
@implementation SM_AFQueryStringPair
|
||||||
|
|
||||||
- (instancetype)initWithField:(id)field value:(id)value {
|
- (instancetype)initWithField:(id)field value:(id)value {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
@@ -103,9 +103,9 @@ NSString * AFPercentEscapedStringFromString(NSString *string) {
|
|||||||
|
|
||||||
- (NSString *)URLEncodedStringValue {
|
- (NSString *)URLEncodedStringValue {
|
||||||
if (!self.value || [self.value isEqual:[NSNull null]]) {
|
if (!self.value || [self.value isEqual:[NSNull null]]) {
|
||||||
return AFPercentEscapedStringFromString([self.field description]);
|
return SM_AFPercentEscapedStringFromString([self.field description]);
|
||||||
} else {
|
} else {
|
||||||
return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
|
return [NSString stringWithFormat:@"%@=%@", SM_AFPercentEscapedStringFromString([self.field description]), SM_AFPercentEscapedStringFromString([self.value description])];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,23 +113,23 @@ NSString * AFPercentEscapedStringFromString(NSString *string) {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary);
|
FOUNDATION_EXPORT NSArray * SM_AFQueryStringPairsFromDictionary(NSDictionary *dictionary);
|
||||||
FOUNDATION_EXPORT NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value);
|
FOUNDATION_EXPORT NSArray * SM_AFQueryStringPairsFromKeyAndValue(NSString *key, id value);
|
||||||
|
|
||||||
NSString * AFQueryStringFromParameters(NSDictionary *parameters) {
|
NSString * SM_AFQueryStringFromParameters(NSDictionary *parameters) {
|
||||||
NSMutableArray *mutablePairs = [NSMutableArray array];
|
NSMutableArray *mutablePairs = [NSMutableArray array];
|
||||||
for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
|
for (SM_AFQueryStringPair *pair in SM_AFQueryStringPairsFromDictionary(parameters)) {
|
||||||
[mutablePairs addObject:[pair URLEncodedStringValue]];
|
[mutablePairs addObject:[pair URLEncodedStringValue]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [mutablePairs componentsJoinedByString:@"&"];
|
return [mutablePairs componentsJoinedByString:@"&"];
|
||||||
}
|
}
|
||||||
|
|
||||||
NSArray * AFQueryStringPairsFromDictionary(NSDictionary *dictionary) {
|
NSArray * SM_AFQueryStringPairsFromDictionary(NSDictionary *dictionary) {
|
||||||
return AFQueryStringPairsFromKeyAndValue(nil, dictionary);
|
return SM_AFQueryStringPairsFromKeyAndValue(nil, dictionary);
|
||||||
}
|
}
|
||||||
|
|
||||||
NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
|
NSArray * SM_AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
|
||||||
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
|
NSMutableArray *mutableQueryStringComponents = [NSMutableArray array];
|
||||||
|
|
||||||
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];
|
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)];
|
||||||
@@ -140,21 +140,21 @@ NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
|
|||||||
for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
|
for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
|
||||||
id nestedValue = dictionary[nestedKey];
|
id nestedValue = dictionary[nestedKey];
|
||||||
if (nestedValue) {
|
if (nestedValue) {
|
||||||
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
|
[mutableQueryStringComponents addObjectsFromArray:SM_AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ([value isKindOfClass:[NSArray class]]) {
|
} else if ([value isKindOfClass:[NSArray class]]) {
|
||||||
NSArray *array = value;
|
NSArray *array = value;
|
||||||
for (id nestedValue in array) {
|
for (id nestedValue in array) {
|
||||||
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
|
[mutableQueryStringComponents addObjectsFromArray:SM_AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
|
||||||
}
|
}
|
||||||
} else if ([value isKindOfClass:[NSSet class]]) {
|
} else if ([value isKindOfClass:[NSSet class]]) {
|
||||||
NSSet *set = value;
|
NSSet *set = value;
|
||||||
for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
|
for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) {
|
||||||
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)];
|
[mutableQueryStringComponents addObjectsFromArray:SM_AFQueryStringPairsFromKeyAndValue(key, obj)];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
[mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]];
|
[mutableQueryStringComponents addObject:[[SM_AFQueryStringPair alloc] initWithField:key value:value]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return mutableQueryStringComponents;
|
return mutableQueryStringComponents;
|
||||||
@@ -162,7 +162,7 @@ NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@interface AFStreamingMultipartFormData : NSObject <AFMultipartFormData>
|
@interface SM_AFStreamingMultipartFormData : NSObject <AFMultipartFormData>
|
||||||
- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest
|
- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest
|
||||||
stringEncoding:(NSStringEncoding)encoding;
|
stringEncoding:(NSStringEncoding)encoding;
|
||||||
|
|
||||||
@@ -171,26 +171,26 @@ NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
static NSArray * AFHTTPRequestSerializerObservedKeyPaths() {
|
static NSArray * SM_AFHTTPRequestSerializerObservedKeyPaths() {
|
||||||
static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil;
|
static NSArray *_SM_AFHTTPRequestSerializerObservedKeyPaths = nil;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
_AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
|
_SM_AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
|
||||||
});
|
});
|
||||||
|
|
||||||
return _AFHTTPRequestSerializerObservedKeyPaths;
|
return _SM_AFHTTPRequestSerializerObservedKeyPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerObserverContext;
|
static void *SM_AFHTTPRequestSerializerObserverContext = &SM_AFHTTPRequestSerializerObserverContext;
|
||||||
|
|
||||||
@interface AFHTTPRequestSerializer ()
|
@interface SM_AFHTTPRequestSerializer ()
|
||||||
@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths;
|
@property (readwrite, nonatomic, strong) NSMutableSet *mutableObservedChangedKeyPaths;
|
||||||
@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders;
|
@property (readwrite, nonatomic, strong) NSMutableDictionary *mutableHTTPRequestHeaders;
|
||||||
@property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle;
|
@property (readwrite, nonatomic, assign) AFHTTPRequestQueryStringSerializationStyle queryStringSerializationStyle;
|
||||||
@property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization;
|
@property (readwrite, nonatomic, copy) AFQueryStringSerializationBlock queryStringSerialization;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFHTTPRequestSerializer
|
@implementation SM_AFHTTPRequestSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [[self alloc] init];
|
return [[self alloc] init];
|
||||||
@@ -239,9 +239,9 @@ static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerOb
|
|||||||
self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil];
|
self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil];
|
||||||
|
|
||||||
self.mutableObservedChangedKeyPaths = [NSMutableSet set];
|
self.mutableObservedChangedKeyPaths = [NSMutableSet set];
|
||||||
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
|
for (NSString *keyPath in SM_AFHTTPRequestSerializerObservedKeyPaths()) {
|
||||||
if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
|
if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
|
||||||
[self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:AFHTTPRequestSerializerObserverContext];
|
[self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:SM_AFHTTPRequestSerializerObserverContext];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,9 +249,9 @@ static void *AFHTTPRequestSerializerObserverContext = &AFHTTPRequestSerializerOb
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)dealloc {
|
- (void)dealloc {
|
||||||
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
|
for (NSString *keyPath in SM_AFHTTPRequestSerializerObservedKeyPaths()) {
|
||||||
if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
|
if ([self respondsToSelector:NSSelectorFromString(keyPath)]) {
|
||||||
[self removeObserver:self forKeyPath:keyPath context:AFHTTPRequestSerializerObserverContext];
|
[self removeObserver:self forKeyPath:keyPath context:SM_AFHTTPRequestSerializerObserverContext];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -353,7 +353,7 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
|
NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
|
||||||
mutableRequest.HTTPMethod = method;
|
mutableRequest.HTTPMethod = method;
|
||||||
|
|
||||||
for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
|
for (NSString *keyPath in SM_AFHTTPRequestSerializerObservedKeyPaths()) {
|
||||||
if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
|
if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
|
||||||
[mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
|
[mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
|
||||||
}
|
}
|
||||||
@@ -375,10 +375,10 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
|
|
||||||
NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error];
|
NSMutableURLRequest *mutableRequest = [self requestWithMethod:method URLString:URLString parameters:nil error:error];
|
||||||
|
|
||||||
__block AFStreamingMultipartFormData *formData = [[AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding];
|
__block SM_AFStreamingMultipartFormData *formData = [[SM_AFStreamingMultipartFormData alloc] initWithURLRequest:mutableRequest stringEncoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
if (parameters) {
|
if (parameters) {
|
||||||
for (AFQueryStringPair *pair in AFQueryStringPairsFromDictionary(parameters)) {
|
for (SM_AFQueryStringPair *pair in SM_AFQueryStringPairsFromDictionary(parameters)) {
|
||||||
NSData *data = nil;
|
NSData *data = nil;
|
||||||
if ([pair.value isKindOfClass:[NSData class]]) {
|
if ([pair.value isKindOfClass:[NSData class]]) {
|
||||||
data = pair.value;
|
data = pair.value;
|
||||||
@@ -487,7 +487,7 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
} else {
|
} else {
|
||||||
switch (self.queryStringSerializationStyle) {
|
switch (self.queryStringSerializationStyle) {
|
||||||
case AFHTTPRequestQueryStringDefaultStyle:
|
case AFHTTPRequestQueryStringDefaultStyle:
|
||||||
query = AFQueryStringFromParameters(parameters);
|
query = SM_AFQueryStringFromParameters(parameters);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -514,7 +514,7 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
#pragma mark - NSKeyValueObserving
|
#pragma mark - NSKeyValueObserving
|
||||||
|
|
||||||
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
|
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
|
||||||
if ([AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) {
|
if ([SM_AFHTTPRequestSerializerObservedKeyPaths() containsObject:key]) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -526,7 +526,7 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
change:(NSDictionary *)change
|
change:(NSDictionary *)change
|
||||||
context:(void *)context
|
context:(void *)context
|
||||||
{
|
{
|
||||||
if (context == AFHTTPRequestSerializerObserverContext) {
|
if (context == SM_AFHTTPRequestSerializerObserverContext) {
|
||||||
if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
|
if ([change[NSKeyValueChangeNewKey] isEqual:[NSNull null]]) {
|
||||||
[self.mutableObservedChangedKeyPaths removeObject:keyPath];
|
[self.mutableObservedChangedKeyPaths removeObject:keyPath];
|
||||||
} else {
|
} else {
|
||||||
@@ -561,7 +561,7 @@ forHTTPHeaderField:(NSString *)field
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFHTTPRequestSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFHTTPRequestSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone];
|
serializer.mutableHTTPRequestHeaders = [self.mutableHTTPRequestHeaders mutableCopyWithZone:zone];
|
||||||
serializer.queryStringSerializationStyle = self.queryStringSerializationStyle;
|
serializer.queryStringSerializationStyle = self.queryStringSerializationStyle;
|
||||||
serializer.queryStringSerialization = self.queryStringSerialization;
|
serializer.queryStringSerialization = self.queryStringSerialization;
|
||||||
@@ -601,10 +601,10 @@ static inline NSString * AFContentTypeForPathExtension(NSString *extension) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NSUInteger const kAFUploadStream3GSuggestedPacketSize = 1024 * 16;
|
NSUInteger const SM_kAFUploadStream3GSuggestedPacketSize = 1024 * 16;
|
||||||
NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
NSTimeInterval const SM_kAFUploadStream3GSuggestedDelay = 0.2;
|
||||||
|
|
||||||
@interface AFHTTPBodyPart : NSObject
|
@interface SM_AFHTTPBodyPart : NSObject
|
||||||
@property (nonatomic, assign) NSStringEncoding stringEncoding;
|
@property (nonatomic, assign) NSStringEncoding stringEncoding;
|
||||||
@property (nonatomic, strong) NSDictionary *headers;
|
@property (nonatomic, strong) NSDictionary *headers;
|
||||||
@property (nonatomic, copy) NSString *boundary;
|
@property (nonatomic, copy) NSString *boundary;
|
||||||
@@ -622,7 +622,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
maxLength:(NSUInteger)length;
|
maxLength:(NSUInteger)length;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface AFMultipartBodyStream : NSInputStream <NSStreamDelegate>
|
@interface SM_AFMultipartBodyStream : NSInputStream <NSStreamDelegate>
|
||||||
@property (nonatomic, assign) NSUInteger numberOfBytesInPacket;
|
@property (nonatomic, assign) NSUInteger numberOfBytesInPacket;
|
||||||
@property (nonatomic, assign) NSTimeInterval delay;
|
@property (nonatomic, assign) NSTimeInterval delay;
|
||||||
@property (nonatomic, strong) NSInputStream *inputStream;
|
@property (nonatomic, strong) NSInputStream *inputStream;
|
||||||
@@ -631,19 +631,19 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
|
|
||||||
- (instancetype)initWithStringEncoding:(NSStringEncoding)encoding;
|
- (instancetype)initWithStringEncoding:(NSStringEncoding)encoding;
|
||||||
- (void)setInitialAndFinalBoundaries;
|
- (void)setInitialAndFinalBoundaries;
|
||||||
- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart;
|
- (void)appendHTTPBodyPart:(SM_AFHTTPBodyPart *)bodyPart;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@interface AFStreamingMultipartFormData ()
|
@interface SM_AFStreamingMultipartFormData ()
|
||||||
@property (readwrite, nonatomic, copy) NSMutableURLRequest *request;
|
@property (readwrite, nonatomic, copy) NSMutableURLRequest *request;
|
||||||
@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding;
|
@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding;
|
||||||
@property (readwrite, nonatomic, copy) NSString *boundary;
|
@property (readwrite, nonatomic, copy) NSString *boundary;
|
||||||
@property (readwrite, nonatomic, strong) AFMultipartBodyStream *bodyStream;
|
@property (readwrite, nonatomic, strong) SM_AFMultipartBodyStream *bodyStream;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFStreamingMultipartFormData
|
@implementation SM_AFStreamingMultipartFormData
|
||||||
|
|
||||||
- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest
|
- (instancetype)initWithURLRequest:(NSMutableURLRequest *)urlRequest
|
||||||
stringEncoding:(NSStringEncoding)encoding
|
stringEncoding:(NSStringEncoding)encoding
|
||||||
@@ -656,7 +656,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
self.request = urlRequest;
|
self.request = urlRequest;
|
||||||
self.stringEncoding = encoding;
|
self.stringEncoding = encoding;
|
||||||
self.boundary = AFCreateMultipartFormBoundary();
|
self.boundary = AFCreateMultipartFormBoundary();
|
||||||
self.bodyStream = [[AFMultipartBodyStream alloc] initWithStringEncoding:encoding];
|
self.bodyStream = [[SM_AFMultipartBodyStream alloc] initWithStringEncoding:encoding];
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@@ -710,7 +710,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
[mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
|
[mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
|
||||||
[mutableHeaders setValue:mimeType forKey:@"Content-Type"];
|
[mutableHeaders setValue:mimeType forKey:@"Content-Type"];
|
||||||
|
|
||||||
AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init];
|
SM_AFHTTPBodyPart *bodyPart = [[SM_AFHTTPBodyPart alloc] init];
|
||||||
bodyPart.stringEncoding = self.stringEncoding;
|
bodyPart.stringEncoding = self.stringEncoding;
|
||||||
bodyPart.headers = mutableHeaders;
|
bodyPart.headers = mutableHeaders;
|
||||||
bodyPart.boundary = self.boundary;
|
bodyPart.boundary = self.boundary;
|
||||||
@@ -735,7 +735,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
[mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
|
[mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
|
||||||
[mutableHeaders setValue:mimeType forKey:@"Content-Type"];
|
[mutableHeaders setValue:mimeType forKey:@"Content-Type"];
|
||||||
|
|
||||||
AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init];
|
SM_AFHTTPBodyPart *bodyPart = [[SM_AFHTTPBodyPart alloc] init];
|
||||||
bodyPart.stringEncoding = self.stringEncoding;
|
bodyPart.stringEncoding = self.stringEncoding;
|
||||||
bodyPart.headers = mutableHeaders;
|
bodyPart.headers = mutableHeaders;
|
||||||
bodyPart.boundary = self.boundary;
|
bodyPart.boundary = self.boundary;
|
||||||
@@ -778,7 +778,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
{
|
{
|
||||||
NSParameterAssert(body);
|
NSParameterAssert(body);
|
||||||
|
|
||||||
AFHTTPBodyPart *bodyPart = [[AFHTTPBodyPart alloc] init];
|
SM_AFHTTPBodyPart *bodyPart = [[SM_AFHTTPBodyPart alloc] init];
|
||||||
bodyPart.stringEncoding = self.stringEncoding;
|
bodyPart.stringEncoding = self.stringEncoding;
|
||||||
bodyPart.headers = headers;
|
bodyPart.headers = headers;
|
||||||
bodyPart.boundary = self.boundary;
|
bodyPart.boundary = self.boundary;
|
||||||
@@ -819,16 +819,16 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
@property (readwrite, copy) NSError *streamError;
|
@property (readwrite, copy) NSError *streamError;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface AFMultipartBodyStream () <NSCopying>
|
@interface SM_AFMultipartBodyStream () <NSCopying>
|
||||||
@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding;
|
@property (readwrite, nonatomic, assign) NSStringEncoding stringEncoding;
|
||||||
@property (readwrite, nonatomic, strong) NSMutableArray *HTTPBodyParts;
|
@property (readwrite, nonatomic, strong) NSMutableArray *HTTPBodyParts;
|
||||||
@property (readwrite, nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator;
|
@property (readwrite, nonatomic, strong) NSEnumerator *HTTPBodyPartEnumerator;
|
||||||
@property (readwrite, nonatomic, strong) AFHTTPBodyPart *currentHTTPBodyPart;
|
@property (readwrite, nonatomic, strong) SM_AFHTTPBodyPart *currentHTTPBodyPart;
|
||||||
@property (readwrite, nonatomic, strong) NSOutputStream *outputStream;
|
@property (readwrite, nonatomic, strong) NSOutputStream *outputStream;
|
||||||
@property (readwrite, nonatomic, strong) NSMutableData *buffer;
|
@property (readwrite, nonatomic, strong) NSMutableData *buffer;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFMultipartBodyStream
|
@implementation SM_AFMultipartBodyStream
|
||||||
#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100)
|
#if (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000) || (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 1100)
|
||||||
@synthesize delegate;
|
@synthesize delegate;
|
||||||
#endif
|
#endif
|
||||||
@@ -850,7 +850,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
|
|
||||||
- (void)setInitialAndFinalBoundaries {
|
- (void)setInitialAndFinalBoundaries {
|
||||||
if ([self.HTTPBodyParts count] > 0) {
|
if ([self.HTTPBodyParts count] > 0) {
|
||||||
for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
for (SM_AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
||||||
bodyPart.hasInitialBoundary = NO;
|
bodyPart.hasInitialBoundary = NO;
|
||||||
bodyPart.hasFinalBoundary = NO;
|
bodyPart.hasFinalBoundary = NO;
|
||||||
}
|
}
|
||||||
@@ -860,7 +860,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)appendHTTPBodyPart:(AFHTTPBodyPart *)bodyPart {
|
- (void)appendHTTPBodyPart:(SM_AFHTTPBodyPart *)bodyPart {
|
||||||
[self.HTTPBodyParts addObject:bodyPart];
|
[self.HTTPBodyParts addObject:bodyPart];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -950,7 +950,7 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
|
|
||||||
- (unsigned long long)contentLength {
|
- (unsigned long long)contentLength {
|
||||||
unsigned long long length = 0;
|
unsigned long long length = 0;
|
||||||
for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
for (SM_AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
||||||
length += [bodyPart contentLength];
|
length += [bodyPart contentLength];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -976,9 +976,9 @@ NSTimeInterval const kAFUploadStream3GSuggestedDelay = 0.2;
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding];
|
SM_AFMultipartBodyStream *bodyStreamCopy = [[[self class] allocWithZone:zone] initWithStringEncoding:self.stringEncoding];
|
||||||
|
|
||||||
for (AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
for (SM_AFHTTPBodyPart *bodyPart in self.HTTPBodyParts) {
|
||||||
[bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]];
|
[bodyStreamCopy appendHTTPBodyPart:[bodyPart copy]];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -996,10 +996,10 @@ typedef enum {
|
|||||||
AFHeaderPhase = 2,
|
AFHeaderPhase = 2,
|
||||||
AFBodyPhase = 3,
|
AFBodyPhase = 3,
|
||||||
AFFinalBoundaryPhase = 4,
|
AFFinalBoundaryPhase = 4,
|
||||||
} AFHTTPBodyPartReadPhase;
|
} SM_AFHTTPBodyPartReadPhase;
|
||||||
|
|
||||||
@interface AFHTTPBodyPart () <NSCopying> {
|
@interface SM_AFHTTPBodyPart () <NSCopying> {
|
||||||
AFHTTPBodyPartReadPhase _phase;
|
SM_AFHTTPBodyPartReadPhase _phase;
|
||||||
NSInputStream *_inputStream;
|
NSInputStream *_inputStream;
|
||||||
unsigned long long _phaseReadOffset;
|
unsigned long long _phaseReadOffset;
|
||||||
}
|
}
|
||||||
@@ -1010,7 +1010,7 @@ typedef enum {
|
|||||||
maxLength:(NSUInteger)length;
|
maxLength:(NSUInteger)length;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFHTTPBodyPart
|
@implementation SM_AFHTTPBodyPart
|
||||||
|
|
||||||
- (instancetype)init {
|
- (instancetype)init {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
@@ -1182,7 +1182,7 @@ typedef enum {
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init];
|
SM_AFHTTPBodyPart *bodyPart = [[[self class] allocWithZone:zone] init];
|
||||||
|
|
||||||
bodyPart.stringEncoding = self.stringEncoding;
|
bodyPart.stringEncoding = self.stringEncoding;
|
||||||
bodyPart.headers = self.headers;
|
bodyPart.headers = self.headers;
|
||||||
@@ -1197,7 +1197,7 @@ typedef enum {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@implementation AFJSONRequestSerializer
|
@implementation SM_AFJSONRequestSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [self serializerWithWritingOptions:(NSJSONWritingOptions)0];
|
return [self serializerWithWritingOptions:(NSJSONWritingOptions)0];
|
||||||
@@ -1205,7 +1205,7 @@ typedef enum {
|
|||||||
|
|
||||||
+ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions
|
+ (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions
|
||||||
{
|
{
|
||||||
AFJSONRequestSerializer *serializer = [[self alloc] init];
|
SM_AFJSONRequestSerializer *serializer = [[self alloc] init];
|
||||||
serializer.writingOptions = writingOptions;
|
serializer.writingOptions = writingOptions;
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
@@ -1264,7 +1264,7 @@ typedef enum {
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFJSONRequestSerializer *serializer = [super copyWithZone:zone];
|
SM_AFJSONRequestSerializer *serializer = [super copyWithZone:zone];
|
||||||
serializer.writingOptions = self.writingOptions;
|
serializer.writingOptions = self.writingOptions;
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
@@ -1274,7 +1274,7 @@ typedef enum {
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@implementation AFPropertyListRequestSerializer
|
@implementation SM_AFPropertyListRequestSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 writeOptions:0];
|
return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 writeOptions:0];
|
||||||
@@ -1283,7 +1283,7 @@ typedef enum {
|
|||||||
+ (instancetype)serializerWithFormat:(NSPropertyListFormat)format
|
+ (instancetype)serializerWithFormat:(NSPropertyListFormat)format
|
||||||
writeOptions:(NSPropertyListWriteOptions)writeOptions
|
writeOptions:(NSPropertyListWriteOptions)writeOptions
|
||||||
{
|
{
|
||||||
AFPropertyListRequestSerializer *serializer = [[self alloc] init];
|
SM_AFPropertyListRequestSerializer *serializer = [[self alloc] init];
|
||||||
serializer.format = format;
|
serializer.format = format;
|
||||||
serializer.writeOptions = writeOptions;
|
serializer.writeOptions = writeOptions;
|
||||||
|
|
||||||
@@ -1345,7 +1345,7 @@ typedef enum {
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFPropertyListRequestSerializer *serializer = [super copyWithZone:zone];
|
SM_AFPropertyListRequestSerializer *serializer = [super copyWithZone:zone];
|
||||||
serializer.format = self.format;
|
serializer.format = self.format;
|
||||||
serializer.writeOptions = self.writeOptions;
|
serializer.writeOptions = self.writeOptions;
|
||||||
|
|
||||||
|
|||||||
@@ -49,11 +49,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFHTTPResponseSerializer` conforms to the `SM_AFURLRequestSerialization` & `SM_AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation.
|
`SM_AFHTTPResponseSerializer` conforms to the `SM_AFURLRequestSerialization` & `SM_AFURLResponseSerialization` protocols, offering a concrete base implementation of query string / URL form-encoded parameter serialization and default request headers, as well as response status code and content type validation.
|
||||||
|
|
||||||
Any request or response serializer dealing with HTTP is encouraged to subclass `AFHTTPResponseSerializer` in order to ensure consistent default behavior.
|
Any request or response serializer dealing with HTTP is encouraged to subclass `SM_AFHTTPResponseSerializer` in order to ensure consistent default behavior.
|
||||||
*/
|
*/
|
||||||
@interface AFHTTPResponseSerializer : NSObject <SM_AFURLResponseSerialization>
|
@interface SM_AFHTTPResponseSerializer : NSObject <SM_AFURLResponseSerialization>
|
||||||
|
|
||||||
- (instancetype)init;
|
- (instancetype)init;
|
||||||
|
|
||||||
@@ -104,15 +104,15 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFJSONResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes JSON responses.
|
`SM_AFJSONResponseSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that validates and decodes JSON responses.
|
||||||
|
|
||||||
By default, `AFJSONResponseSerializer` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types:
|
By default, `SM_AFJSONResponseSerializer` accepts the following MIME types, which includes the official standard, `application/json`, as well as other commonly-used types:
|
||||||
|
|
||||||
- `application/json`
|
- `application/json`
|
||||||
- `text/json`
|
- `text/json`
|
||||||
- `text/javascript`
|
- `text/javascript`
|
||||||
*/
|
*/
|
||||||
@interface AFJSONResponseSerializer : AFHTTPResponseSerializer
|
@interface SM_AFJSONResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
- (instancetype)init;
|
- (instancetype)init;
|
||||||
|
|
||||||
@@ -138,14 +138,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFXMLParserResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects.
|
`SM_AFXMLParserResponseSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLParser` objects.
|
||||||
|
|
||||||
By default, `AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types:
|
By default, `SM_AFXMLParserResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types:
|
||||||
|
|
||||||
- `application/xml`
|
- `application/xml`
|
||||||
- `text/xml`
|
- `text/xml`
|
||||||
*/
|
*/
|
||||||
@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer
|
@interface SM_AFXMLParserResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -154,14 +154,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
|
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFXMLDocumentResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects.
|
`AFXMLDocumentResponseSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects.
|
||||||
|
|
||||||
By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types:
|
By default, `AFXMLDocumentResponseSerializer` accepts the following MIME types, which includes the official standard, `application/xml`, as well as other commonly-used types:
|
||||||
|
|
||||||
- `application/xml`
|
- `application/xml`
|
||||||
- `text/xml`
|
- `text/xml`
|
||||||
*/
|
*/
|
||||||
@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer
|
@interface AFXMLDocumentResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
- (instancetype)init;
|
- (instancetype)init;
|
||||||
|
|
||||||
@@ -184,13 +184,13 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFPropertyListResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects.
|
`SM_AFPropertyListResponseSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that validates and decodes XML responses as an `NSXMLDocument` objects.
|
||||||
|
|
||||||
By default, `AFPropertyListResponseSerializer` accepts the following MIME types:
|
By default, `SM_AFPropertyListResponseSerializer` accepts the following MIME types:
|
||||||
|
|
||||||
- `application/x-plist`
|
- `application/x-plist`
|
||||||
*/
|
*/
|
||||||
@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer
|
@interface SM_AFPropertyListResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
- (instancetype)init;
|
- (instancetype)init;
|
||||||
|
|
||||||
@@ -218,9 +218,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFImageResponseSerializer` is a subclass of `AFHTTPResponseSerializer` that validates and decodes image responses.
|
`SM_AFImageResponseSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that validates and decodes image responses.
|
||||||
|
|
||||||
By default, `AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage:
|
By default, `SM_AFImageResponseSerializer` accepts the following MIME types, which correspond to the image formats supported by UIImage or NSImage:
|
||||||
|
|
||||||
- `image/tiff`
|
- `image/tiff`
|
||||||
- `image/jpeg`
|
- `image/jpeg`
|
||||||
@@ -233,7 +233,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
- `image/x-xbitmap`
|
- `image/x-xbitmap`
|
||||||
- `image/x-win-bitmap`
|
- `image/x-win-bitmap`
|
||||||
*/
|
*/
|
||||||
@interface AFImageResponseSerializer : AFHTTPResponseSerializer
|
@interface SM_AFImageResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH
|
#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH
|
||||||
/**
|
/**
|
||||||
@@ -252,9 +252,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
/**
|
/**
|
||||||
`AFCompoundSerializer` is a subclass of `AFHTTPResponseSerializer` that delegates the response serialization to the first `AFHTTPResponseSerializer` object that returns an object for `responseObjectForResponse:data:error:`, falling back on the default behavior of `AFHTTPResponseSerializer`. This is useful for supporting multiple potential types and structures of server responses with a single serializer.
|
`AFCompoundSerializer` is a subclass of `SM_AFHTTPResponseSerializer` that delegates the response serialization to the first `SM_AFHTTPResponseSerializer` object that returns an object for `responseObjectForResponse:data:error:`, falling back on the default behavior of `SM_AFHTTPResponseSerializer`. This is useful for supporting multiple potential types and structures of server responses with a single serializer.
|
||||||
*/
|
*/
|
||||||
@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer
|
@interface SM_AFCompoundResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The component response serializers.
|
The component response serializers.
|
||||||
@@ -264,7 +264,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
/**
|
/**
|
||||||
Creates and returns a compound serializer comprised of the specified response serializers.
|
Creates and returns a compound serializer comprised of the specified response serializers.
|
||||||
|
|
||||||
@warning Each response serializer specified must be a subclass of `AFHTTPResponseSerializer`, and response to `-validateResponse:data:error:`.
|
@warning Each response serializer specified must be a subclass of `SM_AFHTTPResponseSerializer`, and response to `-validateResponse:data:error:`.
|
||||||
*/
|
*/
|
||||||
+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray <id<SM_AFURLResponseSerialization>> *)responseSerializers;
|
+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray <id<SM_AFURLResponseSerialization>> *)responseSerializers;
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
return JSONObject;
|
return JSONObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@implementation AFHTTPResponseSerializer
|
@implementation SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [[self alloc] init];
|
return [[self alloc] init];
|
||||||
@@ -196,7 +196,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFHTTPResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFHTTPResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
serializer.acceptableStatusCodes = [self.acceptableStatusCodes copyWithZone:zone];
|
serializer.acceptableStatusCodes = [self.acceptableStatusCodes copyWithZone:zone];
|
||||||
serializer.acceptableContentTypes = [self.acceptableContentTypes copyWithZone:zone];
|
serializer.acceptableContentTypes = [self.acceptableContentTypes copyWithZone:zone];
|
||||||
|
|
||||||
@@ -207,14 +207,14 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@implementation AFJSONResponseSerializer
|
@implementation SM_AFJSONResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [self serializerWithReadingOptions:(NSJSONReadingOptions)0];
|
return [self serializerWithReadingOptions:(NSJSONReadingOptions)0];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions {
|
+ (instancetype)serializerWithReadingOptions:(NSJSONReadingOptions)readingOptions {
|
||||||
AFJSONResponseSerializer *serializer = [[self alloc] init];
|
SM_AFJSONResponseSerializer *serializer = [[self alloc] init];
|
||||||
serializer.readingOptions = readingOptions;
|
serializer.readingOptions = readingOptions;
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
@@ -289,7 +289,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFJSONResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
serializer.readingOptions = self.readingOptions;
|
serializer.readingOptions = self.readingOptions;
|
||||||
serializer.removesKeysWithNullValues = self.removesKeysWithNullValues;
|
serializer.removesKeysWithNullValues = self.removesKeysWithNullValues;
|
||||||
|
|
||||||
@@ -300,10 +300,10 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@implementation AFXMLParserResponseSerializer
|
@implementation SM_AFXMLParserResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
AFXMLParserResponseSerializer *serializer = [[self alloc] init];
|
SM_AFXMLParserResponseSerializer *serializer = [[self alloc] init];
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
}
|
}
|
||||||
@@ -420,7 +420,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@implementation AFPropertyListResponseSerializer
|
@implementation SM_AFPropertyListResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer {
|
+ (instancetype)serializer {
|
||||||
return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 readOptions:0];
|
return [self serializerWithFormat:NSPropertyListXMLFormat_v1_0 readOptions:0];
|
||||||
@@ -429,7 +429,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
+ (instancetype)serializerWithFormat:(NSPropertyListFormat)format
|
+ (instancetype)serializerWithFormat:(NSPropertyListFormat)format
|
||||||
readOptions:(NSPropertyListReadOptions)readOptions
|
readOptions:(NSPropertyListReadOptions)readOptions
|
||||||
{
|
{
|
||||||
AFPropertyListResponseSerializer *serializer = [[self alloc] init];
|
SM_AFPropertyListResponseSerializer *serializer = [[self alloc] init];
|
||||||
serializer.format = format;
|
serializer.format = format;
|
||||||
serializer.readOptions = readOptions;
|
serializer.readOptions = readOptions;
|
||||||
|
|
||||||
@@ -497,7 +497,7 @@ static id AFJSONObjectByRemovingKeysWithNullValues(id JSONObject, NSJSONReadingO
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFPropertyListResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFPropertyListResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
serializer.format = self.format;
|
serializer.format = self.format;
|
||||||
serializer.readOptions = self.readOptions;
|
serializer.readOptions = self.readOptions;
|
||||||
|
|
||||||
@@ -638,7 +638,7 @@ static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *r
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@implementation AFImageResponseSerializer
|
@implementation SM_AFImageResponseSerializer
|
||||||
|
|
||||||
- (instancetype)init {
|
- (instancetype)init {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
@@ -723,7 +723,7 @@ static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *r
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFImageResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFImageResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
|
|
||||||
#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH
|
#if TARGET_OS_IOS || TARGET_OS_TV || TARGET_OS_WATCH
|
||||||
serializer.imageScale = self.imageScale;
|
serializer.imageScale = self.imageScale;
|
||||||
@@ -737,14 +737,14 @@ static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *r
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
@interface AFCompoundResponseSerializer ()
|
@interface SM_AFCompoundResponseSerializer ()
|
||||||
@property (readwrite, nonatomic, copy) NSArray *responseSerializers;
|
@property (readwrite, nonatomic, copy) NSArray *responseSerializers;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation AFCompoundResponseSerializer
|
@implementation SM_AFCompoundResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers {
|
+ (instancetype)compoundSerializerWithResponseSerializers:(NSArray *)responseSerializers {
|
||||||
AFCompoundResponseSerializer *serializer = [[self alloc] init];
|
SM_AFCompoundResponseSerializer *serializer = [[self alloc] init];
|
||||||
serializer.responseSerializers = responseSerializers;
|
serializer.responseSerializers = responseSerializers;
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
@@ -757,7 +757,7 @@ static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *r
|
|||||||
error:(NSError *__autoreleasing *)error
|
error:(NSError *__autoreleasing *)error
|
||||||
{
|
{
|
||||||
for (id <SM_AFURLResponseSerialization> serializer in self.responseSerializers) {
|
for (id <SM_AFURLResponseSerialization> serializer in self.responseSerializers) {
|
||||||
if (![serializer isKindOfClass:[AFHTTPResponseSerializer class]]) {
|
if (![serializer isKindOfClass:[SM_AFHTTPResponseSerializer class]]) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -797,7 +797,7 @@ static UIImage * AFInflatedImageFromResponseWithDataAtScale(NSHTTPURLResponse *r
|
|||||||
#pragma mark - NSCopying
|
#pragma mark - NSCopying
|
||||||
|
|
||||||
- (instancetype)copyWithZone:(NSZone *)zone {
|
- (instancetype)copyWithZone:(NSZone *)zone {
|
||||||
AFCompoundResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
SM_AFCompoundResponseSerializer *serializer = [[[self class] allocWithZone:zone] init];
|
||||||
serializer.responseSerializers = self.responseSerializers;
|
serializer.responseSerializers = self.responseSerializers;
|
||||||
|
|
||||||
return serializer;
|
return serializer;
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
|
@property (readonly, nonatomic, strong) NSOperationQueue *operationQueue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `AFJSONResponseSerializer`.
|
Responses sent from the server in data tasks created with `dataTaskWithRequest:success:failure:` and run using the `GET` / `POST` / et al. convenience methods are automatically validated and serialized by the response serializer. By default, this property is set to an instance of `SM_AFJSONResponseSerializer`.
|
||||||
|
|
||||||
@warning `responseSerializer` must not be `nil`.
|
@warning `responseSerializer` must not be `nil`.
|
||||||
*/
|
*/
|
||||||
@@ -423,7 +423,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
/**
|
/**
|
||||||
Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`.
|
Sets a block to be executed when a download task has completed a download, as handled by the `NSURLSessionDownloadDelegate` method `URLSession:downloadTask:didFinishDownloadingToURL:`.
|
||||||
|
|
||||||
@param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error.
|
@param block A block object to be executed when a download task has completed. The block returns the URL the download should be moved to, and takes three arguments: the session, the download task, and the temporary location of the downloaded file. If the file manager encounters an error while attempting to move the temporary file to the destination, an `SM_AFURLSessionDownloadTaskDidFailToMoveFileNotification` will be posted, with the download task as its object, and the user info of the error.
|
||||||
*/
|
*/
|
||||||
- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * _Nullable (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
|
- (void)setDownloadTaskDidFinishDownloadingBlock:(nullable NSURL * _Nullable (^)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location))block;
|
||||||
|
|
||||||
@@ -465,12 +465,12 @@ FOUNDATION_EXPORT NSString * const SM_AFNetworkingTaskDidSuspendNotification;
|
|||||||
/**
|
/**
|
||||||
Posted when a session is invalidated.
|
Posted when a session is invalidated.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString * const AFURLSessionDidInvalidateNotification;
|
FOUNDATION_EXPORT NSString * const SM_AFURLSessionDidInvalidateNotification;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Posted when a session download task encountered an error when moving the temporary download file to a specified destination.
|
Posted when a session download task encountered an error when moving the temporary download file to a specified destination.
|
||||||
*/
|
*/
|
||||||
FOUNDATION_EXPORT NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification;
|
FOUNDATION_EXPORT NSString * const SM_AFURLSessionDownloadTaskDidFailToMoveFileNotification;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The raw response data of the task. Included in the userInfo dictionary of the `SM_AFNetworkingTaskDidCompleteNotification` if response data exists for the task.
|
The raw response data of the task. Included in the userInfo dictionary of the `SM_AFNetworkingTaskDidCompleteNotification` if response data exists for the task.
|
||||||
|
|||||||
@@ -72,8 +72,8 @@ static dispatch_group_t url_session_manager_completion_group() {
|
|||||||
NSString * const SM_AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";
|
NSString * const SM_AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";
|
||||||
NSString * const SM_AFNetworkingTaskDidCompleteNotification = @"com.alamofire.networking.task.complete";
|
NSString * const SM_AFNetworkingTaskDidCompleteNotification = @"com.alamofire.networking.task.complete";
|
||||||
NSString * const SM_AFNetworkingTaskDidSuspendNotification = @"com.alamofire.networking.task.suspend";
|
NSString * const SM_AFNetworkingTaskDidSuspendNotification = @"com.alamofire.networking.task.suspend";
|
||||||
NSString * const AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate";
|
NSString * const SM_AFURLSessionDidInvalidateNotification = @"com.alamofire.networking.session.invalidate";
|
||||||
NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification = @"com.alamofire.networking.session.download.file-manager-error";
|
NSString * const SM_AFURLSessionDownloadTaskDidFailToMoveFileNotification = @"com.alamofire.networking.session.download.file-manager-error";
|
||||||
|
|
||||||
NSString * const SM_AFNetworkingTaskDidCompleteSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse";
|
NSString * const SM_AFNetworkingTaskDidCompleteSerializedResponseKey = @"com.alamofire.networking.task.complete.serializedresponse";
|
||||||
NSString * const SM_AFNetworkingTaskDidCompleteResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer";
|
NSString * const SM_AFNetworkingTaskDidCompleteResponseSerializerKey = @"com.alamofire.networking.task.complete.responseserializer";
|
||||||
@@ -336,7 +336,7 @@ didFinishDownloadingToURL:(NSURL *)location
|
|||||||
[[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError];
|
[[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError];
|
||||||
|
|
||||||
if (fileManagerError) {
|
if (fileManagerError) {
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo];
|
[[NSNotificationCenter defaultCenter] postNotificationName:SM_AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,11 +368,11 @@ static inline BOOL af_addMethod(Class theClass, SEL selector, Method method) {
|
|||||||
static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume";
|
static NSString * const AFNSURLSessionTaskDidResumeNotification = @"com.alamofire.networking.nsurlsessiontask.resume";
|
||||||
static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend";
|
static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofire.networking.nsurlsessiontask.suspend";
|
||||||
|
|
||||||
@interface _AFURLSessionTaskSwizzling : NSObject
|
@interface _SM_AFURLSessionTaskSwizzling : NSObject
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation _AFURLSessionTaskSwizzling
|
@implementation _SM_AFURLSessionTaskSwizzling
|
||||||
|
|
||||||
+ (void)load {
|
+ (void)load {
|
||||||
/**
|
/**
|
||||||
@@ -511,6 +511,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|||||||
|
|
||||||
if (!configuration) {
|
if (!configuration) {
|
||||||
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
|
configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
|
||||||
|
configuration.URLCache = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.sessionConfiguration = configuration;
|
self.sessionConfiguration = configuration;
|
||||||
@@ -520,7 +521,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|||||||
|
|
||||||
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
|
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
|
||||||
|
|
||||||
self.responseSerializer = [AFJSONResponseSerializer serializer];
|
self.responseSerializer = [SM_AFJSONResponseSerializer serializer];
|
||||||
|
|
||||||
self.securityPolicy = [SM_AFSecurityPolicy defaultPolicy];
|
self.securityPolicy = [SM_AFSecurityPolicy defaultPolicy];
|
||||||
|
|
||||||
@@ -956,7 +957,7 @@ didBecomeInvalidWithError:(NSError *)error
|
|||||||
self.sessionDidBecomeInvalid(session, error);
|
self.sessionDidBecomeInvalid(session, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session];
|
[[NSNotificationCenter defaultCenter] postNotificationName:SM_AFURLSessionDidInvalidateNotification object:session];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)URLSession:(NSURLSession *)session
|
- (void)URLSession:(NSURLSession *)session
|
||||||
@@ -1176,7 +1177,7 @@ didFinishDownloadingToURL:(NSURL *)location
|
|||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
[[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error];
|
[[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error];
|
||||||
if (error) {
|
if (error) {
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo];
|
[[NSNotificationCenter defaultCenter] postNotificationName:SM_AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import "SM_AFURLRequestSerialization.h"
|
#import "SM_AFURLRequestSerialization.h"
|
||||||
|
|
||||||
@interface TextRequestSerializer : AFHTTPRequestSerializer
|
@interface TextRequestSerializer : SM_AFHTTPRequestSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer;
|
+ (instancetype)serializer;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import "SM_AFURLResponseSerialization.h"
|
#import "SM_AFURLResponseSerialization.h"
|
||||||
|
|
||||||
@interface TextResponseSerializer : AFHTTPResponseSerializer
|
@interface TextResponseSerializer : SM_AFHTTPResponseSerializer
|
||||||
|
|
||||||
+ (instancetype)serializer;
|
+ (instancetype)serializer;
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
"displayName": "HttpDemo",
|
"displayName": "HttpDemo",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "A sample Apache Cordova application that demonstrates advanced HTTP plugin.",
|
"description": "A sample Apache Cordova application that demonstrates advanced HTTP plugin.",
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "scripts/build.sh",
|
"build": "scripts/build.sh",
|
||||||
"test": "npm run build && scripts/test.sh"
|
"test": "npm run build && scripts/test.sh"
|
||||||
@@ -11,12 +10,11 @@
|
|||||||
"author": "Sefa Ilkimen",
|
"author": "Sefa Ilkimen",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cordova": "10.0.0",
|
"cordova": "12.0.0",
|
||||||
"cordova-android": "9.0.0",
|
"cordova-android": "12.0.1",
|
||||||
"cordova-browser": "6.0.0",
|
"cordova-browser": "7.0.0",
|
||||||
"cordova-ios": "6.2.0",
|
"cordova-ios": "7.1.1",
|
||||||
"cordova-plugin-device": "2.0.3",
|
"cordova-plugin-device": "2.0.3"
|
||||||
"cordova-plugin-wkwebview-file-xhr": "3.0.0"
|
|
||||||
},
|
},
|
||||||
"cordova": {
|
"cordova": {
|
||||||
"platforms": [
|
"platforms": [
|
||||||
@@ -25,11 +23,7 @@
|
|||||||
"browser"
|
"browser"
|
||||||
],
|
],
|
||||||
"plugins": {
|
"plugins": {
|
||||||
"cordova-plugin-device": {},
|
"cordova-plugin-device": {}
|
||||||
"cordova-plugin-wkwebview-file-xhr": {}
|
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"cordova-plugin-device": "2.0.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
/* global hooks, tests */
|
||||||
|
|
||||||
const app = {
|
const app = {
|
||||||
testIndex: -1,
|
testIndex: -1,
|
||||||
|
|
||||||
|
|||||||
+85
-65
@@ -1,3 +1,5 @@
|
|||||||
|
/* global cordova, resolveLocalFileSystemURL, should */
|
||||||
|
|
||||||
const hooks = {
|
const hooks = {
|
||||||
onBeforeEachTest: function (resolve, reject) {
|
onBeforeEachTest: function (resolve, reject) {
|
||||||
cordova.plugin.http.clearCookies();
|
cordova.plugin.http.clearCookies();
|
||||||
@@ -9,9 +11,7 @@ const hooks = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
helpers.setDefaultServerTrustMode(function () {
|
helpers.setDefaultServerTrustMode(function () {
|
||||||
// @TODO: not ready yet
|
helpers.setNoneClientAuthMode(resolve, reject);
|
||||||
// helpers.setNoneClientAuthMode(resolve, reject);
|
|
||||||
resolve();
|
|
||||||
}, reject);
|
}, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -23,12 +23,16 @@ const helpers = {
|
|||||||
setPinnedServerTrustMode: function (resolve, reject) { cordova.plugin.http.setServerTrustMode('pinned', resolve, reject); },
|
setPinnedServerTrustMode: function (resolve, reject) { cordova.plugin.http.setServerTrustMode('pinned', resolve, reject); },
|
||||||
setNoneClientAuthMode: function (resolve, reject) { cordova.plugin.http.setClientAuthMode('none', resolve, reject); },
|
setNoneClientAuthMode: function (resolve, reject) { cordova.plugin.http.setClientAuthMode('none', resolve, reject); },
|
||||||
setBufferClientAuthMode: function (resolve, reject) {
|
setBufferClientAuthMode: function (resolve, reject) {
|
||||||
helpers.getWithXhr(function (pkcs) {
|
var path = cordova.file.applicationDirectory + 'www/certificates/badssl-client-cert.pkcs';
|
||||||
cordova.plugin.http.setClientAuthMode('buffer', {
|
|
||||||
rawPkcs: pkcs,
|
resolveLocalFileSystemURL(path, function(entry) {
|
||||||
pkcsPassword: 'badssl.com'
|
helpers.readFileEntry(entry, 'buffer', function(pkcs) {
|
||||||
}, resolve, reject);
|
cordova.plugin.http.setClientAuthMode('buffer', {
|
||||||
}, './certificates/badssl-client-cert.pkcs', 'arraybuffer');
|
rawPkcs: pkcs,
|
||||||
|
pkcsPassword: 'badssl.com'
|
||||||
|
}, resolve, reject);
|
||||||
|
}, reject);
|
||||||
|
}, reject);
|
||||||
},
|
},
|
||||||
setJsonSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('json')); },
|
setJsonSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('json')); },
|
||||||
setUtf8StringSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('utf8')); },
|
setUtf8StringSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('utf8')); },
|
||||||
@@ -37,20 +41,22 @@ const helpers = {
|
|||||||
setRawSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('raw')); },
|
setRawSerializer: function (resolve) { resolve(cordova.plugin.http.setDataSerializer('raw')); },
|
||||||
disableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(false)); },
|
disableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(false)); },
|
||||||
enableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(true)); },
|
enableFollowingRedirect: function (resolve) { resolve(cordova.plugin.http.setFollowRedirect(true)); },
|
||||||
getWithXhr: function (done, url, type) {
|
readFileEntry: function(fileEntry, contentType, onSuccess, onFail) {
|
||||||
var xhr = new XMLHttpRequest();
|
var reader = new FileReader();
|
||||||
|
|
||||||
xhr.addEventListener('load', function () {
|
reader.onerror = onFail;
|
||||||
if (!type || type === 'text') {
|
|
||||||
done(this.responseText);
|
reader.onloadend = function() {
|
||||||
|
onSuccess(reader.result);
|
||||||
|
};
|
||||||
|
|
||||||
|
fileEntry.file(function(file) {
|
||||||
|
if (contentType === 'buffer') {
|
||||||
|
reader.readAsArrayBuffer(file);
|
||||||
} else {
|
} else {
|
||||||
done(this.response);
|
reader.readAsText(file);
|
||||||
}
|
}
|
||||||
});
|
}, onFail);
|
||||||
|
|
||||||
xhr.responseType = type;
|
|
||||||
xhr.open('GET', url);
|
|
||||||
xhr.send();
|
|
||||||
},
|
},
|
||||||
writeToFile: function (done, fileName, content) {
|
writeToFile: function (done, fileName, content) {
|
||||||
window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function (directoryEntry) {
|
window.resolveLocalFileSystemURL(cordova.file.cacheDirectory, function (directoryEntry) {
|
||||||
@@ -88,12 +94,12 @@ const helpers = {
|
|||||||
// abort is not working reliably; will be documented in known issues
|
// abort is not working reliably; will be documented in known issues
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (window.cordova && window.cordova.platformId === 'android') {
|
// if (window.cordova && window.cordova.platformId === 'android') {
|
||||||
var version = device.version; // NOTE will throw error if cordova is present without cordova-plugin-device
|
// var version = device.version; // NOTE will throw error if cordova is present without cordova-plugin-device
|
||||||
var major = parseInt(/^(\d+)(\.|$)/.exec(version)[1], 10);
|
// var major = parseInt(/^(\d+)(\.|$)/.exec(version)[1], 10);
|
||||||
return isFinite(major) && major >= 6;
|
// return isFinite(major) && major >= 6;
|
||||||
}
|
// }
|
||||||
return true;
|
// return true;
|
||||||
},
|
},
|
||||||
getAbortDelay: function () { return 0; },
|
getAbortDelay: function () { return 0; },
|
||||||
getDemoArrayBuffer: function(size) {
|
getDemoArrayBuffer: function(size) {
|
||||||
@@ -113,7 +119,6 @@ const helpers = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const messageFactory = {
|
const messageFactory = {
|
||||||
handshakeFailed: function() { return 'TLS connection could not be established: javax.net.ssl.SSLHandshakeException: Handshake failed' },
|
|
||||||
sslTrustAnchor: function () { return 'TLS connection could not be established: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.' },
|
sslTrustAnchor: function () { return 'TLS connection could not be established: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.' },
|
||||||
invalidCertificate: function (domain) { return 'The certificate for this server is invalid. You might be connecting to a server that is pretending to be “' + domain + '” which could put your confidential information at risk.' }
|
invalidCertificate: function (domain) { return 'The certificate for this server is invalid. You might be connecting to a server that is pretending to be “' + domain + '” which could put your confidential information at risk.' }
|
||||||
}
|
}
|
||||||
@@ -226,7 +231,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON object correctly (POST)',
|
description: 'should send JSON object correctly (POST)',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -236,7 +241,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON object correctly (PUT)',
|
description: 'should send JSON object correctly (PUT)',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -246,7 +251,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON object correctly (PATCH)',
|
description: 'should send JSON object correctly (PATCH)',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"json\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -256,7 +261,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON array correctly (POST) #26',
|
description: 'should send JSON array correctly (POST) #26',
|
||||||
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]\" ...',
|
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -266,7 +271,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON array correctly (PUT) #26',
|
description: 'should send JSON array correctly (PUT) #26',
|
||||||
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]\" ...',
|
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -276,7 +281,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send JSON array correctly (PATCH) #26',
|
description: 'should send JSON array correctly (PATCH) #26',
|
||||||
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]\" ...',
|
expected: 'resolved: {"status": 200, "data": "[ 1, 2, 3 ]" ...',
|
||||||
before: helpers.setJsonSerializer,
|
before: helpers.setJsonSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', [1, 2, 3], {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -287,7 +292,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send url encoded data correctly (POST) #41',
|
description: 'should send url encoded data correctly (POST) #41',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setUrlEncodedSerializer,
|
before: helpers.setUrlEncodedSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.post('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -297,7 +302,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send url encoded data correctly (PUT)',
|
description: 'should send url encoded data correctly (PUT)',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setUrlEncodedSerializer,
|
before: helpers.setUrlEncodedSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.put('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -307,7 +312,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should send url encoded data correctly (PATCH)',
|
description: 'should send url encoded data correctly (PATCH)',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"form\\":\\"test\\": \\"testString\\"}" ...',
|
||||||
before: helpers.setUrlEncodedSerializer,
|
before: helpers.setUrlEncodedSerializer,
|
||||||
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.patch('http://httpbin.org/anything', { test: 'testString' }, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -317,18 +322,21 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should resolve correct URL after redirect (GET) #33',
|
description: 'should resolve correct URL after redirect (GET) #33',
|
||||||
expected: 'resolved: {"status": 200, url: "http://httpbin.org/anything", ...',
|
expected: 'resolved: {"status": 200, url: "http://httpbingo.org/anything", ...',
|
||||||
func: function (resolve, reject) { cordova.plugin.http.get('http://httpbingo.org/redirect-to?url=http://httpbin.org/anything', {}, {}, resolve, reject); },
|
func: function (resolve, reject) { cordova.plugin.http.get('http://httpbingo.org/redirect-to?url=http://httpbingo.org/anything', {}, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
result.type.should.be.equal('resolved');
|
result.type.should.be.equal('resolved');
|
||||||
result.data.url.should.be.equal('http://httpbin.org/anything');
|
result.data.url.should.be.equal('http://httpbingo.org/anything');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should not follow 302 redirect when following redirects is disabled',
|
description: 'should not follow 302 redirect when following redirects is disabled',
|
||||||
expected: 'rejected: {"status": 302, ...',
|
expected: 'rejected: {"status": 302, ...',
|
||||||
before: function (resolve, reject) { cordova.plugin.http.setFollowRedirect(false); resolve(); },
|
before: function (resolve) {
|
||||||
func: function (resolve, reject) { cordova.plugin.http.get('http://httpbingo.org/redirect-to?url=http://httpbin.org/anything', {}, {}, resolve, reject); },
|
cordova.plugin.http.setFollowRedirect(false);
|
||||||
|
resolve();
|
||||||
|
},
|
||||||
|
func: function (resolve, reject) { cordova.plugin.http.get('http://httpbingo.org/redirect-to?url=http://httpbingo.org/anything', {}, {}, resolve, reject); },
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
result.type.should.be.equal('rejected');
|
result.type.should.be.equal('rejected');
|
||||||
result.data.status.should.be.equal(302);
|
result.data.status.should.be.equal(302);
|
||||||
@@ -342,7 +350,7 @@ const tests = [
|
|||||||
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
||||||
|
|
||||||
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
||||||
helpers.getWithXhr(function (content) {
|
helpers.readFileEntry(entry, 'text', function (content) {
|
||||||
resolve({
|
resolve({
|
||||||
sourceUrl: sourceUrl,
|
sourceUrl: sourceUrl,
|
||||||
targetPath: targetPath,
|
targetPath: targetPath,
|
||||||
@@ -350,7 +358,7 @@ const tests = [
|
|||||||
name: entry.name,
|
name: entry.name,
|
||||||
content: content
|
content: content
|
||||||
});
|
});
|
||||||
}, targetPath);
|
}, reject);
|
||||||
}, reject);
|
}, reject);
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -424,7 +432,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should encode HTTP array params correctly (GET) #45',
|
description: 'should encode HTTP array params correctly (GET) #45',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\\"url\\":\\"http://httpbin.org/get?myArray[]=val1&myArray[]=val2&myArray[]=val3\\"}\" ...',
|
expected: 'resolved: {"status": 200, "data": "{\\"url\\":\\"http://httpbin.org/get?myArray[]=val1&myArray[]=val2&myArray[]=val3\\"}" ...',
|
||||||
func: function (resolve, reject) {
|
func: function (resolve, reject) {
|
||||||
cordova.plugin.http.get('http://httpbin.org/get', { myArray: ['val1', 'val2', 'val3'], myString: 'testString' }, {}, resolve, reject);
|
cordova.plugin.http.get('http://httpbin.org/get', { myArray: ['val1', 'val2', 'val3'], myString: 'testString' }, {}, resolve, reject);
|
||||||
},
|
},
|
||||||
@@ -452,8 +460,9 @@ const tests = [
|
|||||||
{
|
{
|
||||||
description: 'should throw an error while setting non-string value as global header #54',
|
description: 'should throw an error while setting non-string value as global header #54',
|
||||||
expected: 'throwed: "advanced-http: header values must be strings"',
|
expected: 'throwed: "advanced-http: header values must be strings"',
|
||||||
func: function (resolve, reject) {
|
func: function (resolve) {
|
||||||
cordova.plugin.http.setHeader('myTestHeader', 2);
|
cordova.plugin.http.setHeader('myTestHeader', 2);
|
||||||
|
resolve();
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
result.type.should.be.equal('throwed');
|
result.type.should.be.equal('throwed');
|
||||||
@@ -492,7 +501,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should not send programmatically set cookies after running "clearCookies" (GET) #59',
|
description: 'should not send programmatically set cookies after running "clearCookies" (GET) #59',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\"headers\": {\"Cookie\": \"\"...',
|
expected: 'resolved: {"status": 200, "data": "{"headers": {"Cookie": ""...',
|
||||||
func: function (resolve, reject) {
|
func: function (resolve, reject) {
|
||||||
cordova.plugin.http.setCookie('http://httpbin.org/get', 'myCookie=myValue');
|
cordova.plugin.http.setCookie('http://httpbin.org/get', 'myCookie=myValue');
|
||||||
cordova.plugin.http.setCookie('http://httpbin.org/get', 'mySecondCookie=mySecondValue');
|
cordova.plugin.http.setCookie('http://httpbin.org/get', 'mySecondCookie=mySecondValue');
|
||||||
@@ -520,7 +529,7 @@ const tests = [
|
|||||||
cordova.plugin.http.setCookie('http://httpbin.org/get', 'mySecondCookie=mySecondValue');
|
cordova.plugin.http.setCookie('http://httpbin.org/get', 'mySecondCookie=mySecondValue');
|
||||||
|
|
||||||
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
||||||
helpers.getWithXhr(function (content) {
|
helpers.readFileEntry(entry, 'text', function (content) {
|
||||||
resolve({
|
resolve({
|
||||||
sourceUrl: sourceUrl,
|
sourceUrl: sourceUrl,
|
||||||
targetPath: targetPath,
|
targetPath: targetPath,
|
||||||
@@ -528,7 +537,7 @@ const tests = [
|
|||||||
name: entry.name,
|
name: entry.name,
|
||||||
content: content
|
content: content
|
||||||
});
|
});
|
||||||
}, targetPath);
|
}, reject);
|
||||||
}, reject);
|
}, reject);
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -608,7 +617,9 @@ const tests = [
|
|||||||
},
|
},
|
||||||
validationFunc: function (driver, result, targetInfo) {
|
validationFunc: function (driver, result, targetInfo) {
|
||||||
result.type.should.be.equal('rejected');
|
result.type.should.be.equal('rejected');
|
||||||
result.data.should.be.eql({ status: -2, error: targetInfo.isAndroid ? messageFactory.sslTrustAnchor() : messageFactory.invalidCertificate('sha512.badssl.com') });
|
result.data.status.should.be.equal(-2);
|
||||||
|
result.data.error.should.include(targetInfo.isAndroid ? 'javax.net.ssl.SSLHandshakeException' : 'The certificate for this server is invalid');
|
||||||
|
// result.data.should.be.eql({ status: -2, error: targetInfo.isAndroid ? messageFactory.s^slTrustAnchor() : messageFactory.invalidCertificate('sha512.badssl.com') });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -697,7 +708,7 @@ const tests = [
|
|||||||
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
||||||
|
|
||||||
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
||||||
helpers.getWithXhr(function (content) {
|
helpers.readFileEntry(entry, 'text', function (content) {
|
||||||
resolve({
|
resolve({
|
||||||
sourceUrl: sourceUrl,
|
sourceUrl: sourceUrl,
|
||||||
targetPath: targetPath,
|
targetPath: targetPath,
|
||||||
@@ -705,7 +716,7 @@ const tests = [
|
|||||||
name: entry.name,
|
name: entry.name,
|
||||||
content: content
|
content: content
|
||||||
});
|
});
|
||||||
}, targetPath);
|
}, reject);
|
||||||
}, reject);
|
}, reject);
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
@@ -851,14 +862,18 @@ const tests = [
|
|||||||
before: helpers.setMultipartSerializer,
|
before: helpers.setMultipartSerializer,
|
||||||
func: function (resolve, reject) {
|
func: function (resolve, reject) {
|
||||||
var ponyfills = cordova.plugin.http.ponyfills;
|
var ponyfills = cordova.plugin.http.ponyfills;
|
||||||
helpers.getWithXhr(function (blob) {
|
var path = cordova.file.applicationDirectory + 'www/res/cordova_logo.png';
|
||||||
var formData = new ponyfills.FormData();
|
|
||||||
formData.append('CordovaLogo', blob);
|
|
||||||
|
|
||||||
var url = 'https://httpbin.org/anything';
|
resolveLocalFileSystemURL(path, function(entry) {
|
||||||
var options = { method: 'post', data: formData };
|
helpers.readFileEntry(entry, 'buffer', function(buffer) {
|
||||||
cordova.plugin.http.sendRequest(url, options, resolve, reject);
|
var formData = new ponyfills.FormData();
|
||||||
}, './res/cordova_logo.png', 'blob');
|
formData.append('CordovaLogo', new Blob([buffer], { type: 'image/png' }));
|
||||||
|
|
||||||
|
var url = 'https://httpbin.org/anything';
|
||||||
|
var options = { method: 'post', data: formData };
|
||||||
|
cordova.plugin.http.sendRequest(url, options, resolve, reject);
|
||||||
|
}, reject);
|
||||||
|
}, reject);
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
helpers.checkResult(result, 'resolved');
|
helpers.checkResult(result, 'resolved');
|
||||||
@@ -877,9 +892,13 @@ const tests = [
|
|||||||
expected: 'resolved: {"status":200,"data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg ...',
|
expected: 'resolved: {"status":200,"data:application/octet-stream;base64,iVBORw0KGgoAAAANSUhEUg ...',
|
||||||
before: helpers.setRawSerializer,
|
before: helpers.setRawSerializer,
|
||||||
func: function (resolve, reject) {
|
func: function (resolve, reject) {
|
||||||
helpers.getWithXhr(function (buffer) {
|
var path = cordova.file.applicationDirectory + 'www/res/cordova_logo.png';
|
||||||
cordova.plugin.http.post('http://httpbin.org/anything', buffer, {}, resolve, reject);
|
|
||||||
}, './res/cordova_logo.png', 'arraybuffer');
|
resolveLocalFileSystemURL(path, function(entry) {
|
||||||
|
helpers.readFileEntry(entry, 'buffer', function(buffer) {
|
||||||
|
cordova.plugin.http.post('http://httpbin.org/anything', buffer, {}, resolve, reject);
|
||||||
|
}, reject);
|
||||||
|
}, reject);
|
||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
helpers.checkResult(result, 'resolved');
|
helpers.checkResult(result, 'resolved');
|
||||||
@@ -998,7 +1017,7 @@ const tests = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: 'should not send any cookies after running "clearCookies" (GET) #248',
|
description: 'should not send any cookies after running "clearCookies" (GET) #248',
|
||||||
expected: 'resolved: {"status": 200, "data": "{\"cookies\":{}} ...',
|
expected: 'resolved: {"status": 200, "data": "{"cookies":{}} ...',
|
||||||
before: helpers.disableFollowingRedirect,
|
before: helpers.disableFollowingRedirect,
|
||||||
func: function (resolve, reject) {
|
func: function (resolve, reject) {
|
||||||
cordova.plugin.http.get('https://httpbin.org/cookies/set?myCookieKey=myCookieValue', {}, {}, function () {
|
cordova.plugin.http.get('https://httpbin.org/cookies/set?myCookieKey=myCookieValue', {}, {}, function () {
|
||||||
@@ -1075,7 +1094,7 @@ const tests = [
|
|||||||
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
var targetPath = cordova.file.cacheDirectory + 'test.xml';
|
||||||
|
|
||||||
var reqId = cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
var reqId = cordova.plugin.http.downloadFile(sourceUrl, {}, {}, targetPath, function (entry) {
|
||||||
helpers.getWithXhr(function (content) {
|
helpers.readFileEntry(entry, 'text', function(content) {
|
||||||
resolve({
|
resolve({
|
||||||
sourceUrl: sourceUrl,
|
sourceUrl: sourceUrl,
|
||||||
targetPath: targetPath,
|
targetPath: targetPath,
|
||||||
@@ -1083,7 +1102,7 @@ const tests = [
|
|||||||
name: entry.name,
|
name: entry.name,
|
||||||
content: content
|
content: content
|
||||||
});
|
});
|
||||||
}, targetPath);
|
}, reject);
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
@@ -1163,7 +1182,8 @@ const tests = [
|
|||||||
},
|
},
|
||||||
validationFunc: function (driver, result) {
|
validationFunc: function (driver, result) {
|
||||||
result.type.should.be.equal('rejected');
|
result.type.should.be.equal('rejected');
|
||||||
result.data.should.be.eql({ status: -2, error: messageFactory.handshakeFailed() });
|
result.data.status.should.be.equal(-2);
|
||||||
|
result.data.error.should.include('UNSUPPORTED_PROTOCOL');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -60,16 +60,18 @@ const configs = {
|
|||||||
|
|
||||||
// testing on BrowserStack
|
// testing on BrowserStack
|
||||||
browserstackIosDevice: {
|
browserstackIosDevice: {
|
||||||
|
'appium-version': '1.22.0',
|
||||||
device: 'iPhone 12',
|
device: 'iPhone 12',
|
||||||
os_version: '14',
|
os_version: '14',
|
||||||
project: 'HTTP Test App',
|
project: 'HTTP Test App',
|
||||||
autoWebview: true,
|
autoWebview: true,
|
||||||
app: 'HttpTestAppAndroid',
|
app: 'HttpTestAppIos',
|
||||||
'browserstack.networkLogs': false
|
'browserstack.networkLogs': false
|
||||||
},
|
},
|
||||||
browserstackAndroidDevice: {
|
browserstackAndroidDevice: {
|
||||||
device: 'Google Nexus 6',
|
'appium-version': '1.22.0',
|
||||||
os_version: '6.0',
|
device: 'Samsung Galaxy S22 Ultra',
|
||||||
|
os_version: '12.0',
|
||||||
project: 'HTTP Test App',
|
project: 'HTTP Test App',
|
||||||
autoWebview: true,
|
autoWebview: true,
|
||||||
app: 'HttpTestAppAndroid',
|
app: 'HttpTestAppAndroid',
|
||||||
@@ -84,7 +86,7 @@ function getCaps(environment, os, runtime) {
|
|||||||
caps.name = `cordova-plugin-advanced-http (${os})`;
|
caps.name = `cordova-plugin-advanced-http (${os})`;
|
||||||
|
|
||||||
return caps;
|
return caps;
|
||||||
};
|
}
|
||||||
|
|
||||||
function capitalize(text) {
|
function capitalize(text) {
|
||||||
return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
|
return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ async function validateTestIndex(driver, testIndex) {
|
|||||||
|
|
||||||
async function validateTestTitle(driver, testTitle) {
|
async function validateTestTitle(driver, testTitle) {
|
||||||
const description = await driver.elementById('descriptionLbl').text();
|
const description = await driver.elementById('descriptionLbl').text();
|
||||||
const title = description.match(/\d+:\ (.*)/)[1];
|
const title = description.match(/\d+: (.*)/)[1];
|
||||||
|
|
||||||
title.should.be.equal(testTitle, 'Test description is not matching!');
|
title.should.be.equal(testTitle, 'Test description is not matching!');
|
||||||
}
|
}
|
||||||
@@ -106,6 +106,7 @@ async function validateTestTitle(driver, testTitle) {
|
|||||||
async function waitToBeFinished(driver, timeout) {
|
async function waitToBeFinished(driver, timeout) {
|
||||||
const timeoutTimestamp = Date.now() + timeout;
|
const timeoutTimestamp = Date.now() + timeout;
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-constant-condition
|
||||||
while (true) {
|
while (true) {
|
||||||
if (await driver.elementById('statusInput').getValue() === 'finished') {
|
if (await driver.elementById('statusInput').getValue() === 'finished') {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+1
-1
@@ -536,7 +536,7 @@ describe('Common helpers', function () {
|
|||||||
null,
|
null,
|
||||||
(response) => {
|
(response) => {
|
||||||
response.status.should.be.equal(errorCodes.POST_PROCESSING_FAILED);
|
response.status.should.be.equal(errorCodes.POST_PROCESSING_FAILED);
|
||||||
response.error.should.include('Unexpected token N in JSON at position 0');
|
response.error.should.include('Unexpected token');
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const BlobMock = require('./Blob.mock');
|
|||||||
module.exports = class FileMock extends BlobMock {
|
module.exports = class FileMock extends BlobMock {
|
||||||
constructor(blob, fileName) {
|
constructor(blob, fileName) {
|
||||||
super(blob, { type: blob.type });
|
super(blob, { type: blob.type });
|
||||||
this._fileName = fileName !== undefined ? fileName : 'blob';
|
this._fileName = fileName !== undefined ? fileName : 'blob';
|
||||||
this.__lastModifiedDate = new Date();
|
this.__lastModifiedDate = new Date();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-3
@@ -1,3 +1,5 @@
|
|||||||
|
/* global FileSystem */
|
||||||
|
|
||||||
module.exports = function init(global, jsUtil, cookieHandler, messages, base64, errorCodes, dependencyValidator, ponyfills) {
|
module.exports = function init(global, jsUtil, cookieHandler, messages, base64, errorCodes, dependencyValidator, ponyfills) {
|
||||||
var validSerializers = ['urlencoded', 'json', 'utf8', 'raw', 'multipart'];
|
var validSerializers = ['urlencoded', 'json', 'utf8', 'raw', 'multipart'];
|
||||||
var validCertModes = ['default', 'nocheck', 'pinned', 'legacy'];
|
var validCertModes = ['default', 'nocheck', 'pinned', 'legacy'];
|
||||||
@@ -66,7 +68,7 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
|
|||||||
for (var i = 0; i < globalKeys.length; i++) {
|
for (var i = 0; i < globalKeys.length; i++) {
|
||||||
key = globalKeys[i];
|
key = globalKeys[i];
|
||||||
|
|
||||||
if (!localHeaders.hasOwnProperty(key)) {
|
if (!Object.prototype.hasOwnProperty.call(localHeaders, key)) {
|
||||||
localHeaders[key] = globalHeaders[key];
|
localHeaders[key] = globalHeaders[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -343,7 +345,10 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
|
|||||||
|
|
||||||
function injectFileEntryHandler(cb) {
|
function injectFileEntryHandler(cb) {
|
||||||
return function (response) {
|
return function (response) {
|
||||||
cb(createFileEntry(response.file));
|
var fileEntry = createFileEntry(response.file);
|
||||||
|
response.file = fileEntry;
|
||||||
|
response.data = fileEntry;
|
||||||
|
cb(fileEntry, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +363,7 @@ module.exports = function init(global, jsUtil, cookieHandler, messages, base64,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getMatchingHostHeaders(url, headersList) {
|
function getMatchingHostHeaders(url, headersList) {
|
||||||
var matches = url.match(/^https?\:\/\/([^\/?#]+)(?:[\/?#]|$)/i);
|
var matches = url.match(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i);
|
||||||
var domain = matches && matches[1];
|
var domain = matches && matches[1];
|
||||||
|
|
||||||
return headersList[domain] || null;
|
return headersList[domain] || null;
|
||||||
|
|||||||
@@ -164,13 +164,15 @@ module.exports = function init(ToughCookie, _) {
|
|||||||
WebStorageCookieStore.prototype._readStore = function () {
|
WebStorageCookieStore.prototype._readStore = function () {
|
||||||
var json = this._storage.getItem(this._storeKey);
|
var json = this._storage.getItem(this._storeKey);
|
||||||
|
|
||||||
if (json !== null) {
|
if (json === null) {
|
||||||
try {
|
return {};
|
||||||
return JSON.parse(json);
|
|
||||||
} catch (e) { }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
try {
|
||||||
|
return JSON.parse(json);
|
||||||
|
} catch (e) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
WebStorageCookieStore.prototype._writeStore = function (store) {
|
WebStorageCookieStore.prototype._writeStore = function (store) {
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf
|
|||||||
|
|
||||||
function post(url, data, headers, success, failure) {
|
function post(url, data, headers, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'post', data: data, headers: headers }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'post', data: data, headers: headers }, success, failure);
|
||||||
};
|
}
|
||||||
|
|
||||||
function put(url, data, headers, success, failure) {
|
function put(url, data, headers, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'put', data: data, headers: headers }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'put', data: data, headers: headers }, success, failure);
|
||||||
@@ -209,7 +209,7 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf
|
|||||||
|
|
||||||
function get(url, params, headers, success, failure) {
|
function get(url, params, headers, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'get', params: params, headers: headers }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'get', params: params, headers: headers }, success, failure);
|
||||||
};
|
}
|
||||||
|
|
||||||
function del(url, params, headers, success, failure) {
|
function del(url, params, headers, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'delete', params: params, headers: headers }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'delete', params: params, headers: headers }, success, failure);
|
||||||
@@ -221,7 +221,7 @@ module.exports = function init(exec, cookieHandler, urlUtil, helpers, globalConf
|
|||||||
|
|
||||||
function options(url, params, headers, success, failure) {
|
function options(url, params, headers, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'options', params: params, headers: headers }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'options', params: params, headers: headers }, success, failure);
|
||||||
};
|
}
|
||||||
|
|
||||||
function uploadFile(url, params, headers, filePath, name, success, failure) {
|
function uploadFile(url, params, headers, filePath, name, success, failure) {
|
||||||
return publicInterface.sendRequest(url, { method: 'upload', params: params, headers: headers, filePath: filePath, name: name }, success, failure);
|
return publicInterface.sendRequest(url, { method: 'upload', params: params, headers: headers, filePath: filePath, name: name }, success, failure);
|
||||||
|
|||||||
+568
-596
File diff suppressed because one or more lines are too long
+2
-2
@@ -6,7 +6,7 @@ module.exports = function init(jsUtil) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parseUrl(url) {
|
function parseUrl(url) {
|
||||||
var match = url.match(/^(https?\:)\/\/(([^:\/?#]*)(?:\:([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
|
var match = url.match(/^(https?:)\/\/(([^:/?#]*)(?::([0-9]+))?)([/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/);
|
||||||
|
|
||||||
return match && {
|
return match && {
|
||||||
protocol: match[1],
|
protocol: match[1],
|
||||||
@@ -42,7 +42,7 @@ module.exports = function init(jsUtil) {
|
|||||||
var parts = [];
|
var parts = [];
|
||||||
|
|
||||||
for (var key in object) {
|
for (var key in object) {
|
||||||
if (!object.hasOwnProperty(key)) {
|
if (!Object.prototype.hasOwnProperty.call(object, key)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user