ObjFW  Check-in [e2a818c0b5]

Overview
Comment:Merge trunk into branch "ofhttpd"
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | ofhttpd
Files: files | file ages | folders
SHA3-256: e2a818c0b5b0332a82914b920273081bb8345ed4de376377ce6f9976fe14ead7
User & Date: js on 2023-10-15 14:57:05
Other Links: branch diff | manifest | tags
Context
2023-10-15
14:57
Merge trunk into branch "ofhttpd" Leaf check-in: e2a818c0b5 user: js tags: ofhttpd
14:55
Add OFHTTPRequestMethodString() check-in: 12c09ef41e user: js tags: trunk
14:33
ofhttpd: Handle HEAD requests check-in: b80f70a59b user: js tags: ofhttpd
Changes

Modified .github/workflows/amiga-gcc.yml from [358205481f] to [334c337cae].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: amiga-gcc
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    container: amigadev/crosstools:m68k-amigaos
    steps:
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure --host=m68k-amigaos
    - name: make
      run: make -j$(nproc)
    - name: make install







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: amiga-gcc
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    container: amigadev/crosstools:m68k-amigaos
    steps:
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure --host=m68k-amigaos
    - name: make
      run: make -j$(nproc)
    - name: make install

Modified .github/workflows/dragonflybsd.yml from [e4f8b62803] to [1865091ef9].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: dragonflybsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/dragonflybsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg install -y autoconf automake gnutls llvm pkgconf
        run: |












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: dragonflybsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/dragonflybsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg install -y autoconf automake gnutls llvm pkgconf
        run: |

Modified .github/workflows/freebsd.yml from [9828c9c463] to [1b5c6031b1].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: freebsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/freebsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg install -y autoconf automake gnutls pkgconf
        run: |












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: freebsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/freebsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg install -y autoconf automake gnutls pkgconf
        run: |

Modified .github/workflows/ios.yml from [dd34f22809] to [dbdab2a600].

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
          - x86_64
        configure_flags:
          - 
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        export IPHONEOS_DEPLOYMENT_TARGET="9.0"
        if [ "${{ matrix.arch}}" = "x86_64" ]; then
          sdk="iphonesimulator"







|







10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
          - x86_64
        configure_flags:
          - 
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        export IPHONEOS_DEPLOYMENT_TARGET="9.0"
        if [ "${{ matrix.arch}}" = "x86_64" ]; then
          sdk="iphonesimulator"

Modified .github/workflows/macos-11.yml from [d79ffc1fb9] to [ade6268255].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check

Modified .github/workflows/macos-12.yml from [a15421158f] to [ee9ffcacad].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check

Modified .github/workflows/macos-13.yml from [d116da75c5] to [e68bb1a491].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check







|







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
          - --disable-sockets
          - --disable-sockets --disable-files
          - --disable-files
          - --disable-shared
    steps:
    - name: Install dependencies
      run: brew install autoconf automake
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(sysctl -n hw.logicalcpu)
    - name: make check

Modified .github/workflows/morphos.yml from [8ce782b0c0] to [f96dbd2310].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: morphos
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    container: amigadev/crosstools:ppc-morphos
    steps:
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure --host=ppc-morphos
    - name: make
      run: make -j$(nproc)
    - name: make install







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
name: morphos
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    container: amigadev/crosstools:ppc-morphos
    steps:
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure --host=ppc-morphos
    - name: make
      run: make -j$(nproc)
    - name: make install

Modified .github/workflows/netbsd-gcc.yml from [4694c85176] to [836cc2e216].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: netbsd-gcc
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/netbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf automake gnutls pkgconf
        run: |












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: netbsd-gcc
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/netbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf automake gnutls pkgconf
        run: |

Modified .github/workflows/netbsd.yml from [2c6f34efc4] to [04be7a1cbe].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: netbsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/netbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf automake clang gnutls pkgconf
        run: |












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: netbsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/netbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf automake clang gnutls pkgconf
        run: |

Modified .github/workflows/nintendo-3ds.yml from [b6f005f187] to [d5f22cd8d0].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-3ds
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitarm
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitARM/bin:$PATH" \








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-3ds
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitarm
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitARM/bin:$PATH" \

Modified .github/workflows/nintendo-ds.yml from [1d6308a4b1] to [6b553d5781].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-ds
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitarm
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitARM/bin:$PATH" \








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-ds
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitarm
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitARM/bin:$PATH" \

Modified .github/workflows/nintendo-switch.yml from [9d8878050b] to [dd1432abab].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-switch
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkita64
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitA64/bin:$PATH" \








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: nintendo-switch
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkita64
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitA64/bin:$PATH" \

Modified .github/workflows/openbsd.yml from [7e76f12fa8] to [ae5824dc32].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: openbsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v3
    - uses: vmactions/openbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf-2.71 automake-1.16.5 gnutls pkgconf
        run: |












|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
name: openbsd
on: [push, pull_request]
jobs:
  tests:
    runs-on: macos-12
    strategy:
      matrix:
        configure_flags:
          -
          - --disable-shared
          - --with-tls=gnutls
    steps:
    - uses: actions/checkout@v4
    - uses: vmactions/openbsd-vm@v0
      with:
        usesh: true
        copyback: false
        prepare: |
          pkg_add autoconf-2.71 automake-1.16.5 gnutls pkgconf
        run: |

Modified .github/workflows/ubuntu-20.04-32bit.yml from [6af581a780] to [eafc923d25].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="clang -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="clang -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-20.04-gcc-32bit.yml from [16adbb51e7] to [b216b21e23].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib gobjc
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib gobjc
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-20.04-gcc.yml from [dd262654f6] to [db8cc56ce4].

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gobjc libssl-dev gnutls-dev
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gobjc libssl-dev gnutls-dev
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-20.04.yml from [051ed40d72] to [7132512cb3].

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install libssl-dev gnutls-dev
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install libssl-dev gnutls-dev
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-latest-32bit.yml from [3cbf56442c] to [c27d1cf836].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="clang -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="clang -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-latest-gcc-32bit.yml from [b827a9a41f] to [e9d9b51c60].

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib gobjc
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
          - --without-tls --disable-shared --enable-seluid24
          - --without-tls --disable-compiler-tls --disable-threads
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib gobjc
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc -m32" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-latest-gcc.yml from [4509107d9f] to [b7ca4731c5].

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gobjc libssl-dev gnutls-dev
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install gobjc libssl-dev gnutls-dev
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure OBJC="gcc" ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/ubuntu-latest.yml from [36a38ec742] to [316b987874].

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install libssl-dev gnutls-dev
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
          - --with-tls=gnutls
          - --with-tls=gnutls --disable-shared
    steps:
    - name: Install dependencies
      run: |
        sudo apt-get update
        sudo apt-get install libssl-dev gnutls-dev
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: ./configure ${{ matrix.configure_flags }}
    - name: make
      run: make -j$(nproc)
    - name: make check

Modified .github/workflows/wii-u.yml from [7d250df7d0] to [e120b2edbe].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: wii-u
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitppc
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitPPC/bin:$PATH" \








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: wii-u
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitppc
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitPPC/bin:$PATH" \

Modified .github/workflows/wii.yml from [59cebc18ff] to [191971b95d].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: wii
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitppc
    - uses: actions/checkout@v2
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitPPC/bin:$PATH" \








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
name: wii
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Install dependencies
      run: docker pull devkitpro/devkitppc
    - uses: actions/checkout@v4
    - name: autogen.sh
      run: ./autogen.sh
    - name: configure
      run: |
        docker run \
          -e DEVKITPRO=/opt/devkitpro \
          -e PATH="/opt/devkitpro/devkitPPC/bin:$PATH" \

Modified ChangeLog from [445cbee3bb] to [558a5867dd].

1
2
3
4
5







6
7
8
9
10
11
12
Legend:
 * Changes of existing features or bugfixes
 + New features

This file only contains the most significant changes.








ObjFW 1.0.2 -> ObjFW 1.0.3, 2023-09-14
 * Fixes -[OFConcreteData initWithItemSize:] not setting freeWhenDone to true,
   which resulted in a memory leak
 * Fixes -[OFData initWithContentsOfIRI:] freeing the buffer in @catch instead
   of @finally, which resulted in a memory leak






>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Legend:
 * Changes of existing features or bugfixes
 + New features

This file only contains the most significant changes.

ObjFW 1.0.3 -> ObjFW 1.0.4, 2023-10-08
 * Fixes OFFile closing fd 0 when initialization fails
 * Fixes -[stringByAppendingPathComponent:] on empty strings
 * Fixes +[OFSystemInfo operatingSystemName] and
   +[OFSystemInfo operatingSystemVersion] returning nil on some systems
 * Adds a license for localizations

ObjFW 1.0.2 -> ObjFW 1.0.3, 2023-09-14
 * Fixes -[OFConcreteData initWithItemSize:] not setting freeWhenDone to true,
   which resulted in a memory leak
 * Fixes -[OFData initWithContentsOfIRI:] freeing the buffer in @catch instead
   of @finally, which resulted in a memory leak

Modified README.md from [ab455f4c69] to [f6c0d41526].

383
384
385
386
387
388
389





390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
<h1 id="support">Support and community</h1>

  If you have any questions about ObjFW or would like to talk to other ObjFW
  users, the following venues are available:

   * The [forum](https://objfw.nil.im/forum)
   * A [Matrix room](https://matrix.to/#/%23objfw:nil.im)





   * An IRC channel named `#objfw` on `irc.oftc.net`
     ([Web chat](https://webchat.oftc.net/?channels=%23objfw)), bridged to the
     Matrix room above
   * A [Slack channel](https://objfw.nil.im/slack), bridged to the Matrix room
     above
   * A [Discord channel](https://objfw.nil.im/discord), bridged to the Matrix
     room above
   * A [Telegram room](https://t.me/objfw), bridged to the Matrix room above
   * A [Gitter room](https://gitter.im/ObjFW/ObjFW), bridged to the Matrix room
     above

  Please don't hesitate to join any or all of those!


<h1 id="donating">Donating</h1>

  If you want to donate to ObjFW, you can read about possible ways to do so







>
>
>
>
>



<
<
<
<
<
<
<







383
384
385
386
387
388
389
390
391
392
393
394
395
396
397







398
399
400
401
402
403
404
<h1 id="support">Support and community</h1>

  If you have any questions about ObjFW or would like to talk to other ObjFW
  users, the following venues are available:

   * The [forum](https://objfw.nil.im/forum)
   * A [Matrix room](https://matrix.to/#/%23objfw:nil.im)
   * A [Discord room](https://objfw.nil.im/discord), bridged to the Matrix
     room above
   * A [Telegram room](https://t.me/objfw), bridged to the Matrix room above
   * A [Slack room](https://objfw.nil.im/slack), bridged to the Matrix room
     above
   * An IRC channel named `#objfw` on `irc.oftc.net`
     ([Web chat](https://webchat.oftc.net/?channels=%23objfw)), bridged to the
     Matrix room above








  Please don't hesitate to join any or all of those!


<h1 id="donating">Donating</h1>

  If you want to donate to ObjFW, you can read about possible ways to do so

Modified extra.mk.in from [b28c1602b0] to [a9dd21f07e].

1
2
3
4
5
6
7
8
9
10
11
12
13
OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@
OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@
OBJFW_FRAMEWORK = @OBJFW_FRAMEWORK@
OBJFW_LIB_MAJOR = 1
OBJFW_LIB_MINOR = 0
OBJFW_LIB_PATCH = 1
OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR}

OBJFWRT_SHARED_LIB = @OBJFWRT_SHARED_LIB@
OBJFWRT_STATIC_LIB = @OBJFWRT_STATIC_LIB@
OBJFWRT_FRAMEWORK = @OBJFWRT_FRAMEWORK@
OBJFWRT_LIB_MAJOR = 1
OBJFWRT_LIB_MINOR = 0




|
|







1
2
3
4
5
6
7
8
9
10
11
12
13
OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@
OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@
OBJFW_FRAMEWORK = @OBJFW_FRAMEWORK@
OBJFW_LIB_MAJOR = 1
OBJFW_LIB_MINOR = 1
OBJFW_LIB_PATCH = 0
OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR}

OBJFWRT_SHARED_LIB = @OBJFWRT_SHARED_LIB@
OBJFWRT_STATIC_LIB = @OBJFWRT_STATIC_LIB@
OBJFWRT_FRAMEWORK = @OBJFWRT_FRAMEWORK@
OBJFWRT_LIB_MAJOR = 1
OBJFWRT_LIB_MINOR = 0
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
OBJFWBRIDGE_LIB_PATCH = 0

OBJFWTLS_SHARED_LIB = @OBJFWTLS_SHARED_LIB@
OBJFWTLS_STATIC_LIB = @OBJFWTLS_STATIC_LIB@
OBJFWTLS_FRAMEWORK = @OBJFWTLS_FRAMEWORK@
OBJFWTLS_LIB_MAJOR = 1
OBJFWTLS_LIB_MINOR = 0
OBJFWTLS_LIB_PATCH = 1

BIN_PREFIX = @BIN_PREFIX@
BRIDGE = @BRIDGE@
CVINCLUDE_INLINE_H = @CVINCLUDE_INLINE_H@
ENCODINGS_A = @ENCODINGS_A@
ENCODINGS_LIB_A = @ENCODINGS_LIB_A@
ENCODINGS_SRCS = @ENCODINGS_SRCS@







|







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
OBJFWBRIDGE_LIB_PATCH = 0

OBJFWTLS_SHARED_LIB = @OBJFWTLS_SHARED_LIB@
OBJFWTLS_STATIC_LIB = @OBJFWTLS_STATIC_LIB@
OBJFWTLS_FRAMEWORK = @OBJFWTLS_FRAMEWORK@
OBJFWTLS_LIB_MAJOR = 1
OBJFWTLS_LIB_MINOR = 0
OBJFWTLS_LIB_PATCH = 2

BIN_PREFIX = @BIN_PREFIX@
BRIDGE = @BRIDGE@
CVINCLUDE_INLINE_H = @CVINCLUDE_INLINE_H@
ENCODINGS_A = @ENCODINGS_A@
ENCODINGS_LIB_A = @ENCODINGS_LIB_A@
ENCODINGS_SRCS = @ENCODINGS_SRCS@

Modified src/OFGZIPStream.m from [1ebfe8e246] to [9545f9339e].

302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

	return _stream.atEndOfStream;
}

- (bool)hasDataInReadBuffer
{
	if (_state == OFGZIPStreamStateData)
		return (super.hasDataInReadBuffer ||
		    _inflateStream.hasDataInReadBuffer);

	return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];








|


<
|
|
|







302
303
304
305
306
307
308
309
310
311

312
313
314
315
316
317
318
319
320
321
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

	return _stream.atEndOfStream;
}

- (bool)lowlevelHasDataInReadBuffer
{
	if (_state == OFGZIPStreamStateData)

		return _inflateStream.hasDataInReadBuffer;
	else
		return _stream.hasDataInReadBuffer;
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

Modified src/OFHTTPClient.m from [f5ef5b6f99] to [771a949bd6].

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

	if (IRI.path.length > 0)
		path = IRI.percentEncodedPath;
	else
		path = @"/";

	requestString = [OFMutableString stringWithFormat:
	    @"%s %@", OFHTTPRequestMethodName(method), path];

	if (IRI.query != nil) {
		[requestString appendString: @"?"];
		[requestString appendString: IRI.percentEncodedQuery];
	}

	[requestString appendString: @" HTTP/"];







|







128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

	if (IRI.path.length > 0)
		path = IRI.percentEncodedPath;
	else
		path = @"/";

	requestString = [OFMutableString stringWithFormat:
	    @"%@ %@", OFHTTPRequestMethodString(method), path];

	if (IRI.query != nil) {
		[requestString appendString: @"?"];
		[requestString appendString: IRI.percentEncodedQuery];
	}

	[requestString appendString: @" HTTP/"];
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
	if (_stream == nil)
		return -1;

	return ((OFStream <OFReadyForReadingObserving> *)_stream)
	    .fileDescriptorForReading;
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];








|

|







1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
	if (_stream == nil)
		return -1;

	return ((OFStream <OFReadyForReadingObserving> *)_stream)
	    .fileDescriptorForReading;
}

- (bool)lowlevelHasDataInReadBuffer
{
	return _stream.hasDataInReadBuffer;
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

Modified src/OFHTTPRequest.h from [163a3d1bed] to [ff8f88f432].

136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158























159

160
161
162
163
164
- (instancetype)init OF_UNAVAILABLE;
@end

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @brief Returns a C string describing the specified request method.
 *
 * @param method The request method which should be described as a C string
 * @return A C string describing the specified request method
 */
extern const char *_Nullable OFHTTPRequestMethodName(
    OFHTTPRequestMethod method);

/**
 * @brief Returns the request method for the specified string.
 *
 * @param string The string for which the request method should be returned
 * @return The request method for the specified string
 * @throw OFInvalidFormatException The specified string is not a valid HTTP
 *				   request method
 */























extern OFHTTPRequestMethod OFHTTPRequestMethodParseName(OFString *string);

#ifdef __cplusplus
}
#endif

OF_ASSUME_NONNULL_END







|

|
|

|










>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>





136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
- (instancetype)init OF_UNAVAILABLE;
@end

#ifdef __cplusplus
extern "C" {
#endif
/**
 * @brief Returns a string describing the specified request method.
 *
 * @param method The request method which should be described as a string
 * @return A string describing the specified request method
 */
extern OFString *_Nullable OFHTTPRequestMethodString(
    OFHTTPRequestMethod method);

/**
 * @brief Returns the request method for the specified string.
 *
 * @param string The string for which the request method should be returned
 * @return The request method for the specified string
 * @throw OFInvalidFormatException The specified string is not a valid HTTP
 *				   request method
 */
extern OFHTTPRequestMethod OFHTTPRequestMethodParseString(OFString *string);

/**
 * @brief Returns a C string describing the specified request method.
 *
 * @deprecated Use @ref OFHTTPRequestMethodString instead.
 *
 * @param method The request method which should be described as a C string
 * @return A C string describing the specified request method
 */
extern const char *_Nullable OFHTTPRequestMethodName(OFHTTPRequestMethod method)
    OF_DEPRECATED(ObjFW, 1, 1, "Use OFHTTPRequestMethodString instead");

/**
 * @brief Returns the request method for the specified string.
 *
 * @deprecated Use @ref OFHTTPRequestMethodParseString instead.
 *
 * @param string The string for which the request method should be returned
 * @return The request method for the specified string
 * @throw OFInvalidFormatException The specified string is not a valid HTTP
 *				   request method
 */
extern OFHTTPRequestMethod OFHTTPRequestMethodParseName(OFString *string)
    OF_DEPRECATED(ObjFW, 1, 1, "Use OFHTTPRequestMethodParseString instead");
#ifdef __cplusplus
}
#endif

OF_ASSUME_NONNULL_END

Modified src/OFHTTPRequest.m from [f630f4e80b] to [7d8bd2c275].

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78














79
80
81
82
83
84
85
#import "OFString.h"

#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfRangeException.h"
#import "OFUnsupportedVersionException.h"

const char *
OFHTTPRequestMethodName(OFHTTPRequestMethod method)
{
	switch (method) {
	case OFHTTPRequestMethodOptions:
		return "OPTIONS";
	case OFHTTPRequestMethodGet:
		return "GET";
	case OFHTTPRequestMethodHead:
		return "HEAD";
	case OFHTTPRequestMethodPost:
		return "POST";
	case OFHTTPRequestMethodPut:
		return "PUT";
	case OFHTTPRequestMethodDelete:
		return "DELETE";
	case OFHTTPRequestMethodTrace:
		return "TRACE";
	case OFHTTPRequestMethodConnect:
		return "CONNECT";
	}

	return NULL;
}

OFHTTPRequestMethod
OFHTTPRequestMethodParseName(OFString *string)
{
	if ([string isEqual: @"OPTIONS"])
		return OFHTTPRequestMethodOptions;
	if ([string isEqual: @"GET"])
		return OFHTTPRequestMethodGet;
	if ([string isEqual: @"HEAD"])
		return OFHTTPRequestMethodHead;
	if ([string isEqual: @"POST"])
		return OFHTTPRequestMethodPost;
	if ([string isEqual: @"PUT"])
		return OFHTTPRequestMethodPut;
	if ([string isEqual: @"DELETE"])
		return OFHTTPRequestMethodDelete;
	if ([string isEqual: @"TRACE"])
		return OFHTTPRequestMethodTrace;
	if ([string isEqual: @"CONNECT"])
		return OFHTTPRequestMethodConnect;

	@throw [OFInvalidFormatException exception];
}















@implementation OFHTTPRequest
@synthesize IRI = _IRI, method = _method, headers = _headers;

+ (instancetype)requestWithIRI: (OFIRI *)IRI
{
	return [[[self alloc] initWithIRI: IRI] autorelease];







|
|



|

|

|

|

|

|

|

|


|



|




















>
>
>
>
>
>
>
>
>
>
>
>
>
>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#import "OFString.h"

#import "OFInvalidArgumentException.h"
#import "OFInvalidFormatException.h"
#import "OFOutOfRangeException.h"
#import "OFUnsupportedVersionException.h"

OFString *
OFHTTPRequestMethodString(OFHTTPRequestMethod method)
{
	switch (method) {
	case OFHTTPRequestMethodOptions:
		return @"OPTIONS";
	case OFHTTPRequestMethodGet:
		return @"GET";
	case OFHTTPRequestMethodHead:
		return @"HEAD";
	case OFHTTPRequestMethodPost:
		return @"POST";
	case OFHTTPRequestMethodPut:
		return @"PUT";
	case OFHTTPRequestMethodDelete:
		return @"DELETE";
	case OFHTTPRequestMethodTrace:
		return @"TRACE";
	case OFHTTPRequestMethodConnect:
		return @"CONNECT";
	}

	return nil;
}

OFHTTPRequestMethod
OFHTTPRequestMethodParseString(OFString *string)
{
	if ([string isEqual: @"OPTIONS"])
		return OFHTTPRequestMethodOptions;
	if ([string isEqual: @"GET"])
		return OFHTTPRequestMethodGet;
	if ([string isEqual: @"HEAD"])
		return OFHTTPRequestMethodHead;
	if ([string isEqual: @"POST"])
		return OFHTTPRequestMethodPost;
	if ([string isEqual: @"PUT"])
		return OFHTTPRequestMethodPut;
	if ([string isEqual: @"DELETE"])
		return OFHTTPRequestMethodDelete;
	if ([string isEqual: @"TRACE"])
		return OFHTTPRequestMethodTrace;
	if ([string isEqual: @"CONNECT"])
		return OFHTTPRequestMethodConnect;

	@throw [OFInvalidFormatException exception];
}

/* Deprecated */
const char *
OFHTTPRequestMethodName(OFHTTPRequestMethod method)
{
	return OFHTTPRequestMethodString(method).UTF8String;
}

/* Deprecated */
OFHTTPRequestMethod
OFHTTPRequestMethodParseName(OFString *string)
{
	return OFHTTPRequestMethodParseString(string);
}

@implementation OFHTTPRequest
@synthesize IRI = _IRI, method = _method, headers = _headers;

+ (instancetype)requestWithIRI: (OFIRI *)IRI
{
	return [[[self alloc] initWithIRI: IRI] autorelease];
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
					   _protocolVersion.major,
					   _protocolVersion.minor];
}

- (OFString *)description
{
	void *pool = objc_autoreleasePoolPush();
	const char *method = OFHTTPRequestMethodName(_method);
	OFString *indentedHeaders, *remoteAddress, *ret;

	indentedHeaders = [_headers.description
	    stringByReplacingOccurrencesOfString: @"\n"
				      withString: @"\n\t"];

	if (_hasRemoteAddress)
		remoteAddress = OFSocketAddressString(&_remoteAddress);
	else
		remoteAddress = nil;

	ret = [[OFString alloc] initWithFormat:
	    @"<%@:\n\tIRI = %@\n"
	    @"\tMethod = %s\n"
	    @"\tHeaders = %@\n"
	    @"\tRemote address = %@\n"
	    @">",
	    self.class, _IRI, method, indentedHeaders, remoteAddress];

	objc_autoreleasePoolPop(pool);

	return [ret autorelease];
}
@end







|













|










253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
					   _protocolVersion.major,
					   _protocolVersion.minor];
}

- (OFString *)description
{
	void *pool = objc_autoreleasePoolPush();
	OFString *method = OFHTTPRequestMethodString(_method);
	OFString *indentedHeaders, *remoteAddress, *ret;

	indentedHeaders = [_headers.description
	    stringByReplacingOccurrencesOfString: @"\n"
				      withString: @"\n\t"];

	if (_hasRemoteAddress)
		remoteAddress = OFSocketAddressString(&_remoteAddress);
	else
		remoteAddress = nil;

	ret = [[OFString alloc] initWithFormat:
	    @"<%@:\n\tIRI = %@\n"
	    @"\tMethod = %@\n"
	    @"\tHeaders = %@\n"
	    @"\tRemote address = %@\n"
	    @">",
	    self.class, _IRI, method, indentedHeaders, remoteAddress];

	objc_autoreleasePoolPop(pool);

	return [ret autorelease];
}
@end

Modified src/OFHTTPServer.m from [df8e40fa8b] to [c229043b21].

378
379
380
381
382
383
384
385
386
387
388
389
390
391
392

	pos = [line rangeOfString: @" "].location;
	if (pos == OFNotFound)
		return [self sendErrorAndClose: 400];

	method = [line substringToIndex: pos];
	@try {
		_method = OFHTTPRequestMethodParseName(method);
	} @catch (OFInvalidArgumentException *e) {
		return [self sendErrorAndClose: 405];
	}

	@try {
		OFRange range = OFMakeRange(pos + 1, line.length - pos - 10);








|







378
379
380
381
382
383
384
385
386
387
388
389
390
391
392

	pos = [line rangeOfString: @" "].location;
	if (pos == OFNotFound)
		return [self sendErrorAndClose: 400];

	method = [line substringToIndex: pos];
	@try {
		_method = OFHTTPRequestMethodParseString(method);
	} @catch (OFInvalidArgumentException *e) {
		return [self sendErrorAndClose: 405];
	}

	@try {
		OFRange range = OFMakeRange(pos + 1, line.length - pos - 10);

731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747

		objc_autoreleasePoolPop(pool);

		return 0;
	}
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer || _socket.hasDataInReadBuffer);
}

- (int)fileDescriptorForReading
{
	return _socket.fileDescriptorForReading;
}








|

|







731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747

		objc_autoreleasePoolPop(pool);

		return 0;
	}
}

- (bool)lowlevelHasDataInReadBuffer
{
	return _socket.hasDataInReadBuffer;
}

- (int)fileDescriptorForReading
{
	return _socket.fileDescriptorForReading;
}

Modified src/OFInflateStream.m from [7aafb9081b] to [fd902a590d].

670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer ||
	    _bufferLength - _bufferIndex > 0);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];







|

|







670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}

- (bool)lowlevelHasDataInReadBuffer
{
	return (_stream.hasDataInReadBuffer ||
	    _bufferLength - _bufferIndex > 0);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

Modified src/OFKernelEventObserver.m from [65045f52e2] to [d1361f5797].

204
205
206
207
208
209
210
211
212
213




214
215

216
217
218
219
220
221
222

- (bool)of_processReadBuffers
{
	void *pool = objc_autoreleasePoolPush();
	bool foundInReadBuffer = false;

	for (id object in [[_readObjects copy] autorelease]) {
		void *pool2 = objc_autoreleasePoolPush();

		if ([object isKindOfClass: [OFStream class]] &&




		    [object hasDataInReadBuffer] &&
		    ![(OFStream *)object of_isWaitingForDelimiter]) {

			if ([_delegate respondsToSelector:
			    @selector(objectIsReadyForReading:)])
				[_delegate objectIsReadyForReading: object];

			foundInReadBuffer = true;
		}








|

|
>
>
>
>
|
|
>







204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227

- (bool)of_processReadBuffers
{
	void *pool = objc_autoreleasePoolPush();
	bool foundInReadBuffer = false;

	for (id object in [[_readObjects copy] autorelease]) {
		void *pool2;

		if (![object isKindOfClass: [OFStream class]])
			continue;

		pool2 = objc_autoreleasePoolPush();

		if ([object hasDataInReadBuffer] &&
		    (![object of_isWaitingForDelimiter] ||
		    [object lowlevelHasDataInReadBuffer])) {
			if ([_delegate respondsToSelector:
			    @selector(objectIsReadyForReading:)])
				[_delegate objectIsReadyForReading: object];

			foundInReadBuffer = true;
		}

Modified src/OFLHADecompressingStream.m from [a9c8d0ec12] to [94f1868a8f].

503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer ||
	    _bufferLength - _bufferIndex > 0);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];







|

|







503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}

- (bool)lowlevelHasDataInReadBuffer
{
	return (_stream.hasDataInReadBuffer ||
	    _bufferLength - _bufferIndex > 0);
}

- (void)close
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

Modified src/OFStream.h from [99614e7bb2] to [bdf949a291].

1387
1388
1389
1390
1391
1392
1393












1394
1395
1396
 *
 * @note Override this method with your actual end of stream checking
 *	 implementation when subclassing!
 *
 * @return Whether the lowlevel is at the end of the stream
 */
- (bool)lowlevelIsAtEndOfStream;












@end

OF_ASSUME_NONNULL_END







>
>
>
>
>
>
>
>
>
>
>
>



1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
 *
 * @note Override this method with your actual end of stream checking
 *	 implementation when subclassing!
 *
 * @return Whether the lowlevel is at the end of the stream
 */
- (bool)lowlevelIsAtEndOfStream;

/**
 * @brief Returns whether the lowlevel has data in the read buffer.
 *
 * @warning Do not call this directly!
 *
 * @note Override this method in case your stream can buffer data itself, such
 *	 as when implementing @ref OFTLSStream. If not overridden, it always
 *	 returns false.
 * @return Whether the lowlevel has data in the read buffer
 */
- (bool)lowlevelHasDataInReadBuffer;
@end

OF_ASSUME_NONNULL_END

Modified src/OFStream.m from [15b8e35c16] to [be4eb53104].

92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112










113
114
115
116
117
118
119
{
	OFFreeMemory(_readBufferMemory);
	OFFreeMemory(_writeBuffer);

	[super dealloc];
}

- (bool)lowlevelIsAtEndOfStream
{
	OF_UNRECOGNIZED_SELECTOR
}

- (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}

- (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}











- (id)copy
{
	return [self retain];
}

- (bool)isAtEndOfStream







<
<
<
<
<









>
>
>
>
>
>
>
>
>
>







92
93
94
95
96
97
98





99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{
	OFFreeMemory(_readBufferMemory);
	OFFreeMemory(_writeBuffer);

	[super dealloc];
}






- (size_t)lowlevelReadIntoBuffer: (void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}

- (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}

- (bool)lowlevelIsAtEndOfStream
{
	OF_UNRECOGNIZED_SELECTOR
}

- (bool)lowlevelHasDataInReadBuffer
{
	return false;
}

- (id)copy
{
	return [self retain];
}

- (bool)isAtEndOfStream
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
	} @finally {
		free(UTF8String);
	}
}

- (bool)hasDataInReadBuffer
{
	return (_readBufferLength > 0);
}

- (bool)canBlock
{
	return _canBlock;
}








|







1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
	} @finally {
		free(UTF8String);
	}
}

- (bool)hasDataInReadBuffer
{
	return (_readBufferLength > 0 || [self lowlevelHasDataInReadBuffer]);
}

- (bool)canBlock
{
	return _canBlock;
}

Modified src/OFTLSStream.h from [f204428d75] to [db5ba510f8].

57
58
59
60
61
62
63
64

65
66
67
68

69
70
71
72
73
74
75
76
77
 *
 * @brief A class that provides Transport Layer Security on top of a stream.
 *
 * This class is a class cluster and returns a suitable OFTLSStream subclass,
 * if available.
 *
 * Subclasses need to override @ref lowlevelReadIntoBuffer:length:,
 * @ref lowlevelWriteBuffer:length: and

 * @ref asyncPerformClientHandshakeWithHost:runLoopMode:. The method
 * @ref hasDataInReadBuffer should be overridden to return `true` if the TLS
 * stream has cached unprocessed data internally, while returning
 * `self.underlyingStream.hasDataInReadBuffer` if it does not have any

 * unprocessed data. In order to get access to the underlying stream,
 * @ref underlyingStream can be used.
 */
@interface OFTLSStream: OFStream <OFReadyForReadingObserving,
    OFReadyForWritingObserving>
{
	OFStream <OFReadyForReadingObserving, OFReadyForWritingObserving>
	    *_underlyingStream;
	bool _verifiesCertificates;







|
>
|
<
<
<
>
|
|







57
58
59
60
61
62
63
64
65
66



67
68
69
70
71
72
73
74
75
76
 *
 * @brief A class that provides Transport Layer Security on top of a stream.
 *
 * This class is a class cluster and returns a suitable OFTLSStream subclass,
 * if available.
 *
 * Subclasses need to override @ref lowlevelReadIntoBuffer:length:,
 * @ref lowlevelWriteBuffer:length:,
 * @ref lowlevelHasDataInReadBuffer and
 * @ref asyncPerformClientHandshakeWithHost:runLoopMode:.



 *
 * In order to get access to the underlying stream, @ref underlyingStream can
 * be used.
 */
@interface OFTLSStream: OFStream <OFReadyForReadingObserving,
    OFReadyForWritingObserving>
{
	OFStream <OFReadyForReadingObserving, OFReadyForWritingObserving>
	    *_underlyingStream;
	bool _verifiesCertificates;
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 *	  stream.
 *
 * @param stream The stream to use as underlying stream. Must not be closed
 *		 before the TLS stream is closed.
 * @return A new, autoreleased TLS stream
 */
+ (instancetype)streamWithStream: (OFStream <OFReadyForReadingObserving,
				       OFReadyForWritingObserving> *)stream;

/**
 * @brief Initializes the TLS stream with the specified stream as its
 *	  underlying stream.
 *
 * @param stream The stream to use as underlying stream. Must not be closed
 *		 before the TLS stream is closed.
 * @return An initialized TLS stream
 */
- (instancetype)initWithStream: (OFStream <OFReadyForReadingObserving,
				     OFReadyForWritingObserving> *)stream
    OF_DESIGNATED_INITIALIZER;

/**
 * @brief Asynchronously performs the TLS client handshake for the specified
 *	  host and calls the delegate afterwards.
 *
 * @param host The host to perform the handshake with







|










|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 *	  stream.
 *
 * @param stream The stream to use as underlying stream. Must not be closed
 *		 before the TLS stream is closed.
 * @return A new, autoreleased TLS stream
 */
+ (instancetype)streamWithStream: (OFStream <OFReadyForReadingObserving,
				      OFReadyForWritingObserving> *)stream;

/**
 * @brief Initializes the TLS stream with the specified stream as its
 *	  underlying stream.
 *
 * @param stream The stream to use as underlying stream. Must not be closed
 *		 before the TLS stream is closed.
 * @return An initialized TLS stream
 */
- (instancetype)initWithStream: (OFStream <OFReadyForReadingObserving,
				    OFReadyForWritingObserving> *)stream
    OF_DESIGNATED_INITIALIZER;

/**
 * @brief Asynchronously performs the TLS client handshake for the specified
 *	  host and calls the delegate afterwards.
 *
 * @param host The host to perform the handshake with

Modified src/OFTLSStream.m from [4de584ae09] to [0b19f7bfbb].

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
}

- (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer ||
	    _underlyingStream.hasDataInReadBuffer);
}

- (bool)lowlevelIsAtEndOfStream
{
	return _underlyingStream.atEndOfStream;
}

- (int)fileDescriptorForReading
{







<
<
<
<
<
<







137
138
139
140
141
142
143






144
145
146
147
148
149
150
}

- (size_t)lowlevelWriteBuffer: (const void *)buffer length: (size_t)length
{
	OF_UNRECOGNIZED_SELECTOR
}







- (bool)lowlevelIsAtEndOfStream
{
	return _underlyingStream.atEndOfStream;
}

- (int)fileDescriptorForReading
{

Modified src/OFTarArchive.m from [0ba99f6e66] to [1c76370f81].

358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

	return _atEndOfStream;
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer || _stream.hasDataInReadBuffer);
}

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}







|

|







358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
{
	if (_stream == nil)
		@throw [OFNotOpenException exceptionWithObject: self];

	return _atEndOfStream;
}

- (bool)lowlevelHasDataInReadBuffer
{
	return _stream.hasDataInReadBuffer;
}

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_stream)
	    .fileDescriptorForReading;
}

Modified src/OFZIPArchive.m from [03f366c882] to [139c2dfeb6].

937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
				       expectedChecksum: expectedChecksum];
		}
	}

	return ret;
}

- (bool)hasDataInReadBuffer
{
	return (super.hasDataInReadBuffer ||
	    [_decompressedStream hasDataInReadBuffer]);
}

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_decompressedStream)
	    .fileDescriptorForReading;
}







|

|
<







937
938
939
940
941
942
943
944
945
946

947
948
949
950
951
952
953
				       expectedChecksum: expectedChecksum];
		}
	}

	return ret;
}

- (bool)lowlevelHasDataInReadBuffer
{
	return ((OFStream *)_decompressedStream).hasDataInReadBuffer;

}

- (int)fileDescriptorForReading
{
	return ((id <OFReadyForReadingObserving>)_decompressedStream)
	    .fileDescriptorForReading;
}

Modified src/exceptions/OFHTTPRequestFailedException.m from [fd787d72c8] to [4a244e4e24].

57
58
59
60
61
62
63
64
65
66
67
68
69
70
	[_response release];

	[super dealloc];
}

- (OFString *)description
{
	const char *method = OFHTTPRequestMethodName(_request.method);

	return [OFString stringWithFormat:
	    @"An HTTP %s request with IRI %@ failed with code %hd!", method,
	    _request.IRI, _response.statusCode];
}
@end







|


|



57
58
59
60
61
62
63
64
65
66
67
68
69
70
	[_response release];

	[super dealloc];
}

- (OFString *)description
{
	OFString *method = OFHTTPRequestMethodString(_request.method);

	return [OFString stringWithFormat:
	    @"An HTTP %@ request with IRI %@ failed with code %hd!", method,
	    _request.IRI, _response.statusCode];
}
@end

Modified src/macros.h from [caf7b03bf1] to [1006063eb3].

287
288
289
290
291
292
293






294
295
296
297
298
299
300

#if __has_attribute(__objc_designated_initializer__)
# define OF_DESIGNATED_INITIALIZER \
    __attribute__((__objc_designated_initializer__))
#else
# define OF_DESIGNATED_INITIALIZER
#endif







#if __has_attribute(__objc_boxable__)
# define OF_BOXABLE __attribute__((__objc_boxable__))
#else
# define OF_BOXABLE
#endif








>
>
>
>
>
>







287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306

#if __has_attribute(__objc_designated_initializer__)
# define OF_DESIGNATED_INITIALIZER \
    __attribute__((__objc_designated_initializer__))
#else
# define OF_DESIGNATED_INITIALIZER
#endif

#ifdef __GNUC__
# define OF_DEPRECATED(project, major, minor, msg)		\
    __attribute__((__deprecated__("Deprecated in " #project " "	\
    #major "." #minor ": " msg)))
#endif

#if __has_attribute(__objc_boxable__)
# define OF_BOXABLE __attribute__((__objc_boxable__))
#else
# define OF_BOXABLE
#endif

Modified src/tls/OFGnuTLSTLSStream.m from [ba84ecba17] to [3f3e9b7029].

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include "config.h"

#include <errno.h>

#import "OFGnuTLSTLSStream.h"
#import "OFData.h"
#import "OFStream+Private.h"

#import "OFAlreadyOpenException.h"
#import "OFInitializationFailedException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"







<







15
16
17
18
19
20
21

22
23
24
25
26
27
28

#include "config.h"

#include <errno.h>

#import "OFGnuTLSTLSStream.h"
#import "OFData.h"


#import "OFAlreadyOpenException.h"
#import "OFInitializationFailedException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
						      bytesWritten: ret
							     errNo: 0];
	}

	return ret;
}

- (bool)hasDataInReadBuffer
{
	if (gnutls_record_check_pending(_session) > 0)
		return true;

	return super.hasDataInReadBuffer;
}

- (bool)of_isWaitingForDelimiter
{
	/* FIXME: There should be a non-private API for this. */

	/*
	 * If we still have pending data in the session, we haven't processed
	 * it yet to see if our delimiter is in there. So return false here, as
	 * that will signal the stream as ready for reading, which in turn will
	 * cause a read and checking for the delimiter.
	 */
	if (gnutls_record_check_pending(_session) > 0)
		return false;

	return super.of_waitingForDelimiter;
}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;







|

<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<







181
182
183
184
185
186
187
188
189



190












191



192
193
194
195
196
197
198
						      bytesWritten: ret
							     errNo: 0];
	}

	return ret;
}

- (bool)lowlevelHasDataInReadBuffer
{



	return (_underlyingStream.hasDataInReadBuffer ||












	    gnutls_record_check_pending(_session) > 0);



}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;

Modified src/tls/OFOpenSSLTLSStream.m from [4f42a57c0b] to [175948cb73].

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#include "config.h"

#include <errno.h>

#import "OFOpenSSLTLSStream.h"
#import "OFData.h"
#import "OFStream+Private.h"

#import "OFAlreadyOpenException.h"
#import "OFInitializationFailedException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"







<







15
16
17
18
19
20
21

22
23
24
25
26
27
28

#include "config.h"

#include <errno.h>

#import "OFOpenSSLTLSStream.h"
#import "OFData.h"


#import "OFAlreadyOpenException.h"
#import "OFInitializationFailedException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
		[_underlyingStream writeBuffer: _buffer length: tmp];
		[_underlyingStream flushWriteBuffer];
	}

	return bytesWritten;
}

- (bool)hasDataInReadBuffer
{
	if (SSL_pending(_SSL) > 0 || BIO_ctrl_pending(_readBIO) > 0)
		return true;

	return super.hasDataInReadBuffer;
}

- (bool)of_isWaitingForDelimiter
{
	/* FIXME: There should be a non-private API for this. */

	/*
	 * If we still have pending data in the SSL connection, we haven't
	 * processed it yet to see if our delimiter is in there. So return
	 * false here, as that will signal the stream as ready for reading,
	 * which in turn will cause a read and checking for the delimiter.
	 */
	if (SSL_pending(_SSL))
		return false;

	/*
	 * If we still have data in our read BIO, it hasn't been processed by
	 * OpenSSL yet. As we have no idea what's in there, return false to
	 * signal the stream as ready for reading, which in turn will cause a
	 * read to check for the delimiter and in turn make OpenSSL process the
	 * data in the read BIO.
	 */
	if (BIO_ctrl_pending(_readBIO) > 0)
		return false;

	return super.of_waitingForDelimiter;
}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;







|

<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<







192
193
194
195
196
197
198
199
200



201






















202



203
204
205
206
207
208
209
		[_underlyingStream writeBuffer: _buffer length: tmp];
		[_underlyingStream flushWriteBuffer];
	}

	return bytesWritten;
}

- (bool)lowlevelHasDataInReadBuffer
{



	return (_underlyingStream.hasDataInReadBuffer ||






















	    SSL_has_pending(_SSL) || BIO_ctrl_pending(_readBIO) > 0);



}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;

Modified src/tls/OFSecureTransportTLSStream.m from [4775886a79] to [89fd642a80].

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 */

#include "config.h"

#include <errno.h>

#import "OFSecureTransportTLSStream.h"
#import "OFStream+Private.h"

#import "OFAlreadyOpenException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"








<







14
15
16
17
18
19
20

21
22
23
24
25
26
27
 */

#include "config.h"

#include <errno.h>

#import "OFSecureTransportTLSStream.h"


#import "OFAlreadyOpenException.h"
#import "OFNotOpenException.h"
#import "OFReadFailedException.h"
#import "OFTLSHandshakeFailedException.h"
#import "OFWriteFailedException.h"

165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
						   requestedLength: length
						      bytesWritten: bytesWritten
							     errNo: 0];

	return bytesWritten;
}

- (bool)hasDataInReadBuffer
{
	size_t bufferSize;

	if (SSLGetBufferedReadSize(_context, &bufferSize) == noErr &&
	    bufferSize > 0)
		return true;

	return super.hasDataInReadBuffer;
}

- (bool)of_isWaitingForDelimiter
{
	size_t bufferSize;

	/* FIXME: There should be a non-private API for this. */

	/*
	 * If we still have pending data in the context, we haven't processed
	 * it yet to see if our delimiter is in there. So return false here, as
	 * that will signal the stream as ready for reading, which in turn will
	 * cause a read and checking for the delimiter.
	 */
	if (SSLGetBufferedReadSize(_context, &bufferSize) == noErr &&
	    bufferSize > 0)
		return false;

	return super.of_waitingForDelimiter;
}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;







|



<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<







164
165
166
167
168
169
170
171
172
173
174




175














176
177



178
179
180
181
182
183
184
						   requestedLength: length
						      bytesWritten: bytesWritten
							     errNo: 0];

	return bytesWritten;
}

- (bool)lowlevelHasDataInReadBuffer
{
	size_t bufferSize;





	return (_underlyingStream.hasDataInReadBuffer ||














	    (SSLGetBufferedReadSize(_context, &bufferSize) == noErr &&
	    bufferSize > 0));



}

- (void)asyncPerformClientHandshakeWithHost: (OFString *)host
				runLoopMode: (OFRunLoopMode)runLoopMode
{
	static const OFTLSStreamErrorCode initFailedErrorCode =
	    OFTLSStreamErrorCodeInitializationFailed;

Modified utils/ofarc/localization/de.json from [8efe141d12] to [e4301e42d4].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
21
/*
 * German localization for ofarc.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */


{

    "usage": [
        "Benutzung: %[prog] -[acCfhlnpqtvx] archiv.zip [datei1 datei2 ...]"
    ],
    "full_usage": [
        "Optionen:\n",
        "    -a  --append      Zu Archiv hinzufügen\n",
        "    -c  --create      Archiv erstellen\n",
        "    -C  --directory   In angegebenes Verzeichnis entpacken\n",
        "    -E  --encoding    Das Encoding des Archivs (nur tar-Dateien)\n",
        "    -f  --force       Existierende Dateien überschreiben\n",
        "    -h  --help        Diese Hilfe anzeigen\n",









>
|
>
|


|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 * German localization for ofarc.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    usage: [
        "Benutzung: %[prog] -[acCfhlnpqtvx] archiv.zip [datei1 datei2 ...]"
    ],
    full_usage: [
        "Optionen:\n",
        "    -a  --append      Zu Archiv hinzufügen\n",
        "    -c  --create      Archiv erstellen\n",
        "    -C  --directory   In angegebenes Verzeichnis entpacken\n",
        "    -E  --encoding    Das Encoding des Archivs (nur tar-Dateien)\n",
        "    -f  --force       Existierende Dateien überschreiben\n",
        "    -h  --help        Diese Hilfe anzeigen\n",
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
    ],
    "5_options_mutually_exclusive": [
        "Fehler: -%[shortopt1] / --%[longopt1], -%[shortopt2] / ",
        "--%[longopt2], -%[shortopt3] / --%[longopt3], ",
        "-%[shortopt4] / --%[longopt4] und\n",
        "        -%[shortopt5] / --%[longopt5] schließen sich gegenseitig aus!"
    ],
    "option_takes_no_argument": "%[prog]: Option --%[opt] nimmt kein Argument",
    "long_option_requires_argument": [
        "%[prog]: Option --%[opt] benötigt ein Argument"
    ],
    "option_requires_argument": "%[prog]: Option -%[opt] benötigt ein Argument",
    "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]",
    "unknown_option": "%[prog]: Unbekannte Option: -%[opt]",
    "invalid_encoding": "%[prog]: Invalid encoding: %[encoding]",
    "writing_not_supported": [
        "Schreiben von Dateien des Typs %[type] wird (noch) nicht unterstützt!"
    ],
    "failed_to_create_directory": [
        "Fehler beim Erstellen des Verzeichnis %[dir]: %[error]"
    ],
    "failed_to_open_file": "Fehler beim Öffnen der Datei %[file]: %[error]",
    "unknown_archive_type": "Unbekannter Archivtyp: %[type]",
    "failed_to_read_file": "Fehler beim Lesen der Datei %[file]: %[error]",
    "failed_to_write_file": "Fehler beim Schreiben der Datei %[file]: %[error]",
    "failed_to_seek_in_file": "Fehler beim Suchen in Datei %[file]: %[error]",
    "file_is_not_a_valid_archive": "Datei %[file] ist kein gültiges Archiv!",
    "file_skipped": "übersprungen",
    "ask_overwrite": "%[file] überschreiben? [ynAN?]",
    "ask_overwrite_help": [
        " y: Ja\n",
        " n: Nein\n",
        " A: Immer\n",
        " N: Nie"
    ],
    "skipping_file": "Überspringe %[file]...",
    "extracting_file": "Entpacke %[file]...",
    "extracting_file_percent": "Entpacke %[file]... %[percent]%",
    "extracting_file_done": "Entpacke %[file]... fertig",
    "cannot_list_gz": "Kann Dateien eines .gz-Archivs nicht auflisten!",
    "cannot_extract_specific_file_from_gz": [
        "Kann keine spezifische Datei aus einem .gz-Archiv entpacken!"
    ],
    "cannot_print_specific_file_from_gz": [
        "Kann keine spezifische Datei aus einem .gz-Archiv ausgeben!"
    ],
    "list_size": [
        "Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    "list_posix_permissions": "POSIX-Berechtigungen: %[perm]",
    "list_owner_account_id": "Besitzerkontennummer: %[id]",
    "list_group_owner_account_id": "Gruppenbesitzerkontennummer: %[id]",
    "list_owner_account_name": "Besitzerkontenname: %[name]",
    "list_group_owner_account_name": "Gruppebesitzerkontenname: %[name]",
    "list_header_level": "Header-Level: %[level]",
    "list_modification_date": "Änderungsdatum: %[date]",
    "list_type_normal": "Typ: Normale Datei",
    "list_type_hardlink": "Typ: Harter Link",
    "list_type_symlink": "Typ: Symbolischer Link",
    "list_link_target": "Zieldateiname: %[target]",
    "list_type_character_device": "Typ: Zeichenorientiertes Gerät",
    "list_type_block_device": "Typ: Blockorientiertes Gerät",
    "list_device_major": "Major-Nummer des Geräts: %[major]",
    "list_device_minor": "Minor-Nummer des Geräts: %[minor]",
    "list_type_directory": "Typ: Verzeichnis",
    "list_type_fifo": "Typ: FIFO",
    "list_type_contiguous_file": "Typ: Zusammenhängende Datei",
    "list_type_unknown": "Typ: Unbekannt",
    "list_compressed_size": [
        "Komprimierte Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    "list_uncompressed_size": [
        "Unkomprimierte Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    "list_compression_method": "Kompressionsmethode: %[method]",
    "list_osid": "Betriebssystem-Identifikator: %[osid]",
    "list_extensions": "Erweiterungen: %[extensions]",
    "list_version_made_by": "Erstellt mit Version: %[version]",
    "list_min_version_needed": "Mindestens benötigte Version: %[version]",
    "list_general_purpose_bit_flag": "General Purpose Bit Flag: %[gpbf]",
    "list_extra_field": "Extra-Feld: %[extra]",
    "list_comment": "Kommentar: %[comment]",
    "refusing_to_extract_file": "Verweigere Entpacken von %[file]!",
    "file_not_in_archive": "Datei %[file] ist nicht im Archiv!",
    "print_no_file_specified": [
        "Benötige eine oder mehrere Dateien zum Ausgeben!"
    ],
    "add_no_file_specified": [
        "Benötige eine oder mehrere Dateien zum Hinzufügen!"
    ],
    "adding_file": "Füge %[file] hinzu...",
    "adding_file_percent": "Füge %[file] hinzu... %[percent]%",
    "adding_file_done": "Füge %[file] hinzu... fertig"
}







|
|


|
|
|
|
|


|


|
|
|
|
|
|
|
|
|





|
|
|
|
|
|


|


|






|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|






|






|
|
|
|
|
|
|
|
|
|
|


|


|
|
|

36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
    ],
    "5_options_mutually_exclusive": [
        "Fehler: -%[shortopt1] / --%[longopt1], -%[shortopt2] / ",
        "--%[longopt2], -%[shortopt3] / --%[longopt3], ",
        "-%[shortopt4] / --%[longopt4] und\n",
        "        -%[shortopt5] / --%[longopt5] schließen sich gegenseitig aus!"
    ],
    option_takes_no_argument: "%[prog]: Option --%[opt] nimmt kein Argument",
    long_option_requires_argument: [
        "%[prog]: Option --%[opt] benötigt ein Argument"
    ],
    option_requires_argument: "%[prog]: Option -%[opt] benötigt ein Argument",
    unknown_long_option: "%[prog]: Unbekannte Option: --%[opt]",
    unknown_option: "%[prog]: Unbekannte Option: -%[opt]",
    invalid_encoding: "%[prog]: Invalid encoding: %[encoding]",
    writing_not_supported: [
        "Schreiben von Dateien des Typs %[type] wird (noch) nicht unterstützt!"
    ],
    failed_to_create_directory: [
        "Fehler beim Erstellen des Verzeichnis %[dir]: %[error]"
    ],
    failed_to_open_file: "Fehler beim Öffnen der Datei %[file]: %[error]",
    unknown_archive_type: "Unbekannter Archivtyp: %[type]",
    failed_to_read_file: "Fehler beim Lesen der Datei %[file]: %[error]",
    failed_to_write_file: "Fehler beim Schreiben der Datei %[file]: %[error]",
    failed_to_seek_in_file: "Fehler beim Suchen in Datei %[file]: %[error]",
    file_is_not_a_valid_archive: "Datei %[file] ist kein gültiges Archiv!",
    file_skipped: "übersprungen",
    ask_overwrite: "%[file] überschreiben? [ynAN?]",
    ask_overwrite_help: [
        " y: Ja\n",
        " n: Nein\n",
        " A: Immer\n",
        " N: Nie"
    ],
    skipping_file: "Überspringe %[file]...",
    extracting_file: "Entpacke %[file]...",
    extracting_file_percent: "Entpacke %[file]... %[percent]%",
    extracting_file_done: "Entpacke %[file]... fertig",
    cannot_list_gz: "Kann Dateien eines .gz-Archivs nicht auflisten!",
    cannot_extract_specific_file_from_gz: [
        "Kann keine spezifische Datei aus einem .gz-Archiv entpacken!"
    ],
    cannot_print_specific_file_from_gz: [
        "Kann keine spezifische Datei aus einem .gz-Archiv ausgeben!"
    ],
    list_size: [
        "Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    list_posix_permissions: "POSIX-Berechtigungen: %[perm]",
    list_owner_account_id: "Besitzerkontennummer: %[id]",
    list_group_owner_account_id: "Gruppenbesitzerkontennummer: %[id]",
    list_owner_account_name: "Besitzerkontenname: %[name]",
    list_group_owner_account_name: "Gruppebesitzerkontenname: %[name]",
    list_header_level: "Header-Level: %[level]",
    list_modification_date: "Änderungsdatum: %[date]",
    list_type_normal: "Typ: Normale Datei",
    list_type_hardlink: "Typ: Harter Link",
    list_type_symlink: "Typ: Symbolischer Link",
    list_link_target: "Zieldateiname: %[target]",
    list_type_character_device: "Typ: Zeichenorientiertes Gerät",
    list_type_block_device: "Typ: Blockorientiertes Gerät",
    list_device_major: "Major-Nummer des Geräts: %[major]",
    list_device_minor: "Minor-Nummer des Geräts: %[minor]",
    list_type_directory: "Typ: Verzeichnis",
    list_type_fifo: "Typ: FIFO",
    list_type_contiguous_file: "Typ: Zusammenhängende Datei",
    list_type_unknown: "Typ: Unbekannt",
    list_compressed_size: [
        "Komprimierte Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    list_uncompressed_size: [
        "Unkomprimierte Größe: ",
        [
            {"size == 1": "1 Byte"},
            {"": "%[size] Bytes"}
        ]
    ],
    list_compression_method: "Kompressionsmethode: %[method]",
    list_osid: "Betriebssystem-Identifikator: %[osid]",
    list_extensions: "Erweiterungen: %[extensions]",
    list_version_made_by: "Erstellt mit Version: %[version]",
    list_min_version_needed: "Mindestens benötigte Version: %[version]",
    list_general_purpose_bit_flag: "General Purpose Bit Flag: %[gpbf]",
    list_extra_field: "Extra-Feld: %[extra]",
    list_comment: "Kommentar: %[comment]",
    refusing_to_extract_file: "Verweigere Entpacken von %[file]!",
    file_not_in_archive: "Datei %[file] ist nicht im Archiv!",
    print_no_file_specified: [
        "Benötige eine oder mehrere Dateien zum Ausgeben!"
    ],
    add_no_file_specified: [
        "Benötige eine oder mehrere Dateien zum Hinzufügen!"
    ],
    adding_file: "Füge %[file] hinzu...",
    adding_file_percent: "Füge %[file] hinzu... %[percent]%",
    adding_file_done: "Füge %[file] hinzu... fertig",
}

Modified utils/ofarc/localization/localizations.json from [3b7bf346d5] to [df82f11fb6].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
/*
 * Localization mapping for ofarc.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */


{

    "de": {
        "": "de"
    },
    "deutsch": {
        "": "de"
    },
    "german": {
        "": "de"
    }
}









>
|
>
|


|


|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
 * Localization mapping for ofarc.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    de: {
        "": "de"
    },
    deutsch: {
        "": "de"
    },
    german: {
        "": "de"
    },
}

Modified utils/ofdns/localization/de.json from [00f9ddff1d] to [755b1114e5].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
 * German localization for ofdns.
 *
 * Copyright (c) 2020-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */


{

    "usage": "Benutzung: %[prog] -[chst] domain1 [domain2 ...]",
    "full_usage": [
        "Optionen:\n",
        "    -c  --class   Die anzufragende DNS-Klasse (standardmäßig IN)\n",
        "    -h  --help    Diese Hilfe anzeigen\n",
        "    -s  --server  Der abzufragende Server\n",
        "    -t  --type    Der anzufragende Record-Typ (standardmäßig ALL,\n",
        "                  kann wiederholt werden)\n",
        "        --tcp     Benutzung von TCP erzwingen"
    ],
    "long_option_requires_argument": [
        "%[prog]: Option --%[opt] benötigt ein Argument"
    ],
    "option_requires_argument": "%[prog]: Option -%[opt] benötigt ein Argument",
    "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]",
    "unknown_option": "%[prog]: Unbekannte Option: -%[opt]",
    "failed_to_resolve": "Auflösen fehlgeschlagen: %[exception]"
}









>
|
>
|
|








|


|
|
|
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
 * German localization for ofdns.
 *
 * Copyright (c) 2020-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    usage: "Benutzung: %[prog] -[chst] domain1 [domain2 ...]",
    full_usage: [
        "Optionen:\n",
        "    -c  --class   Die anzufragende DNS-Klasse (standardmäßig IN)\n",
        "    -h  --help    Diese Hilfe anzeigen\n",
        "    -s  --server  Der abzufragende Server\n",
        "    -t  --type    Der anzufragende Record-Typ (standardmäßig ALL,\n",
        "                  kann wiederholt werden)\n",
        "        --tcp     Benutzung von TCP erzwingen"
    ],
    long_option_requires_argument: [
        "%[prog]: Option --%[opt] benötigt ein Argument"
    ],
    option_requires_argument: "%[prog]: Option -%[opt] benötigt ein Argument",
    unknown_long_option: "%[prog]: Unbekannte Option: --%[opt]",
    unknown_option: "%[prog]: Unbekannte Option: -%[opt]",
    failed_to_resolve: "Auflösen fehlgeschlagen: %[exception]",
}

Modified utils/ofdns/localization/localizations.json from [48cf40147f] to [52f2647bf8].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
/*
 * Localization mapping for ofdns.
 *
 * Copyright (c) 2020-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */


{

    "de": {
        "": "de"
    },
    "deutsch": {
        "": "de"
    },
    "german": {
        "": "de"
    }
}









>
|
>
|


|


|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
 * Localization mapping for ofdns.
 *
 * Copyright (c) 2020-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    de: {
        "": "de"
    },
    deutsch: {
        "": "de"
    },
    german: {
        "": "de"
    },
}

Modified utils/ofhash/localization/de.json from [90f618c8e5] to [946fe7d617].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
/*
 * German localization for ofhash.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */


{

    "usage": [
        "Benutzung: %[prog] [--md5] [--ripemd160] [--sha1] [--sha224] ",
        "[--sha256] [--sha384] [--sha512] datei1 [datei2 ...]"
    ],
    "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]",
    "unknown_option": "%[prog]: Unbekannte Option: -%[opt]",
    "failed_to_open_file": "Fehler beim Öffnen der Datei %[file]: %[error]",
    "failed_to_read_file": "Fehler beim Lesen der Datei %[file]: %[error]"
}









>
|
>
|



|
|
|
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * German localization for ofhash.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    usage: [
        "Benutzung: %[prog] [--md5] [--ripemd160] [--sha1] [--sha224] ",
        "[--sha256] [--sha384] [--sha512] datei1 [datei2 ...]"
    ],
    unknown_long_option: "%[prog]: Unbekannte Option: --%[opt]",
    unknown_option: "%[prog]: Unbekannte Option: -%[opt]",
    failed_to_open_file: "Fehler beim Öffnen der Datei %[file]: %[error]",
    failed_to_read_file: "Fehler beim Lesen der Datei %[file]: %[error]",
}

Modified utils/ofhash/localization/localizations.json from [6d7174d6b9] to [19e35e3a75].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
/*
 * Localization mapping for ofhash.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */


{

    "de": {
        "": "de"
    },
    "deutsch": {
        "": "de"
    },
    "german": {
        "": "de"
    }
}









>
|
>
|


|


|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
 * Localization mapping for ofhash.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    de: {
        "": "de"
    },
    deutsch: {
        "": "de"
    },
    german: {
        "": "de"
    },
}

Modified utils/ofhttp/OFHTTP.m from [d2650dbe5b] to [336f94ad28].

369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
- (void)setMethod: (OFString *)method
{
	void *pool = objc_autoreleasePoolPush();

	method = method.uppercaseString;

	@try {
		_method = OFHTTPRequestMethodParseName(method);
	} @catch (OFInvalidArgumentException *e) {
		[OFStdErr writeLine: OF_LOCALIZED(@"invalid_input_method",
		    @"%[prog]: Invalid request method %[method]!",
		    @"prog", [OFApplication programName],
		    @"method", method)];
		[OFApplication terminateWithStatus: 1];
	}







|







369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
- (void)setMethod: (OFString *)method
{
	void *pool = objc_autoreleasePoolPush();

	method = method.uppercaseString;

	@try {
		_method = OFHTTPRequestMethodParseString(method);
	} @catch (OFInvalidArgumentException *e) {
		[OFStdErr writeLine: OF_LOCALIZED(@"invalid_input_method",
		    @"%[prog]: Invalid request method %[method]!",
		    @"prog", [OFApplication programName],
		    @"method", method)];
		[OFApplication terminateWithStatus: 1];
	}

Modified utils/ofhttp/localization/de.json from [c2800d271b] to [d8f293a0f2].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * German localization for ofhttp.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */


{

    "usage": "Benutzung: %[prog] -[cehHmoOPqv] iri1 [iri2 ...]",
    "full_usage": [
        "Optionen:\n",
        "    -b  --body             Angegebene Datei als Body übergeben\n",
        "                           (- für Standard-Eingabe)\n",
        "    -c  --continue         Download von existierender Datei ",
        "fortsetzen\n",
        "    -f  --force            Existierende Datei überschreiben\n",
        "    -h  --help             Diese Hilfe anzeigen\n",
        "    -H  --header           Einen Header (z.B. X-Foo:Bar) hinzufügen\n",
        "    -m  --method           HTTP Request-Methode setzen\n",
        "    -o  --output           Ausgabe-Dateiname angeben\n",
        "    -O  --detect-filename  Dateiname mittels HEAD-Request ermitteln\n",
        "    -P  --proxy            SOCKS5-Proxy angeben\n",
        "    -q  --quiet            Ruhiger Modus (keine Ausgabe außer Fehler)",
        "\n",
        "    -v  --verbose          Ausführlicher Modus (gibt Header aus)\n",
        "        --insecure         TLS-Fehler ignorieren und unsichere\n",
        "                           Weiterleitungen erlauben\n",
        "        --ignore-status    HTTP Status-Code ignorieren"
    ],
    "invalid_input_header": "%[prog]: Header müssen im Format Name:Wert sein!",
    "invalid_input_method": "%[prog]: Ungültige Request-Methode %[method]!",
    "invalid_input_proxy": "%[prog]: Proxy muss im Format Host:Port sein!",
    "long_argument_missing": "%[prog]: Argument für Option --%[opt] fehlt",
    "argument_missing": "%[prog]: Argument für option -%[opt] fehlt",
    "option_takes_no_argument": "%[prog]: Option --%[opt] nimmt kein Argument",
    "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]",
    "unknown_option": "%[prog]: Unbekannte Option: -%[opt]",
    "quiet_xor_verbose": [
        "%[prog]: -q / --quiet und -v / --verbose schließen sich gegenseitig ",
        "aus!"
    ],
    "output_xor_detect_filename": [
        "%[prog]: -o / --output und -O / --detect-filename schließen sich ",
        "gegenseitig aus!"
    ],
    "output_only_with_one_iri": [
        "%[prog]: -o / --output kann nicht mit mehr als einer IRI benutzt ",
        "werden!"
    ],
    "download_resolve_host_failed": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Host auflösen fehlgeschlagen: %[exception]"
    ],
    "download_failed_connection_failed": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Verbindung fehlgeschlagen: %[exception]"
    ],
    "download_failed_invalid_server_response": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Ungültige Antwort vom Server!"
    ],
    "no_tls_support": [
        "%[prog]: Keine TLS-Unterstützung in ObjFW!\n",
        "  Um via HTTPS runterzuladen müssen Sie entweder ObjFW mit TLS-",
        "Unterstützung\n",
        "  kompilieren oder eine Bibliothek mittels „preload” laden, welche ",
        "TLS-Support\n",
        "  zu ObjFW hinzufügt!"
    ],
    "download_failed_tls_handshake_failed": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  TLS-Handshake fehlgeschlagen: %[error]"
    ],
    "download_failed_read_or_write_failed_any": "Lesen oder Schreiben",
    "download_failed_read_or_write_failed_read": "Lesen",
    "download_failed_read_or_write_failed_write": "Schreiben",
    "download_failed_read_or_write_failed": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  %[error]: %[exception]"
    ],
    "download_failed": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  HTTP Status-Code: %[code]"
    ],
    "download_error": "Fehler!",
    "download_failed_exception": [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  %[exception]"
    ],
    "download_done": "Fertig!",
    "invalid_iri": "%[prog]: Ungültige IRI: <%[iri]>!",
    "invalid_scheme": "%[prog]: Ungültiges Schema: <%[iri]>!",
    "type_unknown": "unbekannt",
    "size_gib": "%[num] GiB",
    "size_mib": "%[num] MiB",
    "size_kib": "%[num] KiB",
    "size_bytes": [
        [
            {"num == 1": "1 Byte"},
            {"": "%[num] Bytes"}
        ]
    ],
    "size_unknown": "unbekannt",
    "info_name_unaligned": "Name: %[name]",
    "info_name": "Name:  %[name]",
    "info_type": "Typ:   %[type]",
    "info_size": "Größe: %[size]",
    "output_already_exists": "%[prog]: Datei %[filename] existiert bereits!",
    "failed_to_open_output": [
        "%[prog]: Kann Datei %[filename] nicht öffnen: %[exception]"
    ],
    "eta_days": "%[num] t ",
    "progress_bytes": [
        [
            {"num == 1": "1 Byte "},
            {"": "%[num] Bytes"}
        ]
    ]
}









>
|
>
|
|



















|
|
|
|
|
|
|
|
|



|



|



|



|



|



|







|



|
|
|
|



|



|
|



|
|
|
|
|
|
|
|





|
|
|
|
|
|
|


|
|




|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * German localization for ofhttp.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this localization for
 * any purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    usage: "Benutzung: %[prog] -[cehHmoOPqv] iri1 [iri2 ...]",
    full_usage: [
        "Optionen:\n",
        "    -b  --body             Angegebene Datei als Body übergeben\n",
        "                           (- für Standard-Eingabe)\n",
        "    -c  --continue         Download von existierender Datei ",
        "fortsetzen\n",
        "    -f  --force            Existierende Datei überschreiben\n",
        "    -h  --help             Diese Hilfe anzeigen\n",
        "    -H  --header           Einen Header (z.B. X-Foo:Bar) hinzufügen\n",
        "    -m  --method           HTTP Request-Methode setzen\n",
        "    -o  --output           Ausgabe-Dateiname angeben\n",
        "    -O  --detect-filename  Dateiname mittels HEAD-Request ermitteln\n",
        "    -P  --proxy            SOCKS5-Proxy angeben\n",
        "    -q  --quiet            Ruhiger Modus (keine Ausgabe außer Fehler)",
        "\n",
        "    -v  --verbose          Ausführlicher Modus (gibt Header aus)\n",
        "        --insecure         TLS-Fehler ignorieren und unsichere\n",
        "                           Weiterleitungen erlauben\n",
        "        --ignore-status    HTTP Status-Code ignorieren"
    ],
    invalid_input_header: "%[prog]: Header müssen im Format Name:Wert sein!",
    invalid_input_method: "%[prog]: Ungültige Request-Methode %[method]!",
    invalid_input_proxy: "%[prog]: Proxy muss im Format Host:Port sein!",
    long_argument_missing: "%[prog]: Argument für Option --%[opt] fehlt",
    argument_missing: "%[prog]: Argument für option -%[opt] fehlt",
    option_takes_no_argument: "%[prog]: Option --%[opt] nimmt kein Argument",
    unknown_long_option: "%[prog]: Unbekannte Option: --%[opt]",
    unknown_option: "%[prog]: Unbekannte Option: -%[opt]",
    quiet_xor_verbose: [
        "%[prog]: -q / --quiet und -v / --verbose schließen sich gegenseitig ",
        "aus!"
    ],
    output_xor_detect_filename: [
        "%[prog]: -o / --output und -O / --detect-filename schließen sich ",
        "gegenseitig aus!"
    ],
    output_only_with_one_iri: [
        "%[prog]: -o / --output kann nicht mit mehr als einer IRI benutzt ",
        "werden!"
    ],
    download_resolve_host_failed: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Host auflösen fehlgeschlagen: %[exception]"
    ],
    download_failed_connection_failed: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Verbindung fehlgeschlagen: %[exception]"
    ],
    download_failed_invalid_server_response: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  Ungültige Antwort vom Server!"
    ],
    no_tls_support: [
        "%[prog]: Keine TLS-Unterstützung in ObjFW!\n",
        "  Um via HTTPS runterzuladen müssen Sie entweder ObjFW mit TLS-",
        "Unterstützung\n",
        "  kompilieren oder eine Bibliothek mittels „preload” laden, welche ",
        "TLS-Support\n",
        "  zu ObjFW hinzufügt!"
    ],
    download_failed_tls_handshake_failed: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  TLS-Handshake fehlgeschlagen: %[error]"
    ],
    download_failed_read_or_write_failed_any: "Lesen oder Schreiben",
    download_failed_read_or_write_failed_read: "Lesen",
    download_failed_read_or_write_failed_write: "Schreiben",
    download_failed_read_or_write_failed: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  %[error]: %[exception]"
    ],
    download_failed: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  HTTP Status-Code: %[code]"
    ],
    download_error: "Fehler!",
    download_failed_exception: [
        "%[prog]: Fehler beim Download von <%[iri]>!\n",
        "  %[exception]"
    ],
    download_done: "Fertig!",
    invalid_iri: "%[prog]: Ungültige IRI: <%[iri]>!",
    invalid_scheme: "%[prog]: Ungültiges Schema: <%[iri]>!",
    type_unknown: "unbekannt",
    size_gib: "%[num] GiB",
    size_mib: "%[num] MiB",
    size_kib: "%[num] KiB",
    size_bytes: [
        [
            {"num == 1": "1 Byte"},
            {"": "%[num] Bytes"}
        ]
    ],
    size_unknown: "unbekannt",
    info_name_unaligned: "Name: %[name]",
    info_name: "Name:  %[name]",
    info_type: "Typ:   %[type]",
    info_size: "Größe: %[size]",
    output_already_exists: "%[prog]: Datei %[filename] existiert bereits!",
    failed_to_open_output: [
        "%[prog]: Kann Datei %[filename] nicht öffnen: %[exception]"
    ],
    eta_days: "%[num] t ",
    progress_bytes: [
        [
            {"num == 1": "1 Byte "},
            {"": "%[num] Bytes"}
        ]
    ],
}

Modified utils/ofhttp/localization/localizations.json from [fed01a059f] to [be4c09810e].

1
2
3
4
5
6
7
8
9

10

11
12
13
14
15
16
17
18
19
20
/*
 * Localization mapping for ofhttp.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */


{

    "de": {
        "": "de"
    },
    "deutsch": {
        "": "de"
    },
    "german": {
        "": "de"
    }
}









>
|
>
|


|


|

|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*
 * Localization mapping for ofhttp.
 *
 * Copyright (c) 2017-2023 Jonathan Schleifer <js@nil.im>
 *
 * Permission to use, copy, modify, and/or distribute this mapping for any
 * purpose with or without fee is hereby granted.
 */

/* vim: se ft=javascript sw=4 et: */

{
    de: {
        "": "de"
    },
    deutsch: {
        "": "de"
    },
    german: {
        "": "de"
    },
}

Modified utils/ofhttpd/OFHTTPD.m from [578af30764] to [672eefd57d].

179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
-      (void)server: (OFHTTPServer *)server
  didReceiveRequest: (OFHTTPRequest *)request
	requestBody: (OFStream *)requestBody
	   response: (OFHTTPResponse *)response
{
	OFString *path;

	OFLog(@"Handling %s request %@",
	    OFHTTPRequestMethodName(request.method), request);

	if (request.method != OFHTTPRequestMethodGet &&
	    request.method != OFHTTPRequestMethodHead) {
		response.statusCode = 405;
		return;
	}








|
|







179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
-      (void)server: (OFHTTPServer *)server
  didReceiveRequest: (OFHTTPRequest *)request
	requestBody: (OFStream *)requestBody
	   response: (OFHTTPResponse *)response
{
	OFString *path;

	OFLog(@"Handling %@ request %@",
	    OFHTTPRequestMethodString(request.method), request);

	if (request.method != OFHTTPRequestMethodGet &&
	    request.method != OFHTTPRequestMethodHead) {
		response.statusCode = 405;
		return;
	}