mirror of
https://github.com/OPSnet/bencode-torrent.git
synced 2026-11-08 08:12:18 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe026fb3a3 | ||
|
|
922a60224d | ||
|
|
a56d7d85c2 | ||
|
|
d2dacb03ec | ||
|
|
9a030b6823 | ||
|
|
2addd8d588 | ||
|
|
ea558fc679 | ||
|
|
42f5170482 | ||
|
|
917cf865a9 |
No files matched your search
@@ -12,7 +12,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-version: ['7.2', '7.3', '7.4']
|
||||
php-version: ['8.1', '8.2']
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
@@ -4,3 +4,4 @@ vendor/
|
||||
.DS_Store
|
||||
composer.lock
|
||||
.phpunit.result.cache
|
||||
.phpunit.cache
|
||||
@@ -1,7 +1,7 @@
|
||||
BEncode Torrent
|
||||
===============
|
||||
|
||||
[](https://github.com/OPSnet/bencode-torrent/actions?query=workflow%3ATest+branch%3Amaster+event%3Apush)
|
||||
[](https://github.com/OPSnet/bencode-torrent/actions/workflows/test.yml)
|
||||
[](https://packagist.org/packages/orpheusnet/bencode-torrent)
|
||||

|
||||
|
||||
@@ -10,24 +10,32 @@ PHP library for encoding and decoding BitTorrent BEncode data, focused around us
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
`composer require orpheusnet/bencode-torrent`
|
||||
|
||||
```php
|
||||
use OrpheusNET\BencodeTorrent;
|
||||
$bencode = new Bencode();
|
||||
require('vendor/autoload.php');
|
||||
$bencode = new \OrpheusNET\BencodeTorrent\BencodeTorrent();
|
||||
$bencode->decodeFile('path/to/file.torrent');
|
||||
var_dump($bencode->getName());
|
||||
var_dump($bencode->getHexInfoHash());
|
||||
var_dump($bencode->getFileList());
|
||||
```
|
||||
|
||||
See the [`BencodeTorrent`](src/BencodeTorrent.php) class for more information on the available methods.
|
||||
Additionally, see [`Bencode`](src/Bencode.php) for the underlying library to encode/decode BEncode data.
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
BEncode is the encoding used by BitTorrent to store and transmitting loosely structured data. It supports
|
||||
BEncode is the encoding used by BitTorrent to store and transmitting loosely structured data. It supports:
|
||||
|
||||
* byte strings
|
||||
* integers
|
||||
* lists
|
||||
* dictionaries (associative arrays, where keys are sorted alphabetically)
|
||||
|
||||
You can see more information about how these types are supported at
|
||||
You can see more information about how these types are supported at
|
||||
[BitTorrentSpecification#Bencoding](https://wiki.theory.org/index.php/BitTorrentSpecification#Bencoding).
|
||||
|
||||
In addition to the above, torrent files are expected to be BEncoded dictionaries that contain minimally the keys
|
||||
@@ -42,6 +50,7 @@ raised. More information on these fields can be found at
|
||||
|
||||
Finally, this library is primarily aimed at being used within the [Gazelle](https://github.com/OPSnet/Gazelle) so
|
||||
we have some utility functions within the library that make sense there to accomplish the following things:
|
||||
|
||||
* Ensuring torrent files are marked as 'private'
|
||||
* Setting a 'source' on torrents (to ensure unique info hash)
|
||||
* Cleaning out unnecessary fields that also reveal stuff about a user (like __announce list__ and __created by__)
|
||||
|
||||
+5
-4
@@ -15,12 +15,13 @@
|
||||
}
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.2"
|
||||
"php": ">=8.1",
|
||||
"ext-mbstring": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8",
|
||||
"squizlabs/php_codesniffer": "3.*",
|
||||
"phpstan/phpstan": "^0.12.48"
|
||||
"phpunit/phpunit": "^10.4.1",
|
||||
"squizlabs/php_codesniffer": "^3.7.2",
|
||||
"phpstan/phpstan": "^1.10.38"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "phpunit",
|
||||
|
||||
+20
-19
@@ -1,19 +1,20 @@
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.5/phpunit.xsd"
|
||||
colors="true"
|
||||
bootstrap="vendor/autoload.php">
|
||||
<testsuites>
|
||||
<testsuite name="unit">
|
||||
<directory>tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">src</directory>
|
||||
<exclude />
|
||||
</whitelist>
|
||||
</filter>
|
||||
<logging>
|
||||
<log type="coverage-html" target="report" />
|
||||
</logging>
|
||||
</phpunit>
|
||||
<?xml version="1.0"?>
|
||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.4/phpunit.xsd" colors="true" bootstrap="vendor/autoload.php" cacheDirectory=".phpunit.cache">
|
||||
<coverage>
|
||||
<report>
|
||||
<html outputDirectory="report"/>
|
||||
</report>
|
||||
</coverage>
|
||||
<testsuites>
|
||||
<testsuite name="unit">
|
||||
<directory>tests</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<logging/>
|
||||
<source>
|
||||
<include>
|
||||
<directory suffix=".php">src</directory>
|
||||
</include>
|
||||
<exclude/>
|
||||
</source>
|
||||
</phpunit>
|
||||
@@ -45,7 +45,7 @@ class BencodeTorrent extends Bencode
|
||||
private function setDelim(): void
|
||||
{
|
||||
if (self::$utf8_filelist_delim === null) {
|
||||
self::$utf8_filelist_delim = utf8_encode(chr(self::FILELIST_DELIM));
|
||||
self::$utf8_filelist_delim = mb_convert_encoding(chr(self::FILELIST_DELIM), 'UTF-8', 'ISO-8859-1');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,8 +105,8 @@ class BencodeTorrent extends Bencode
|
||||
return strlen($element) === 0;
|
||||
}
|
||||
);
|
||||
if (count($filter) > 0) {
|
||||
throw new \RuntimeException('Cannot have empty path for a file');
|
||||
if (count($filter) === count($file[$path_key]) && $file['length'] !== 0) {
|
||||
throw new \RuntimeException('Cannot have a file with no path');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace OrpheusNET\BencodeTorrent;
|
||||
|
||||
class BencodeTest extends \PHPUnit\Framework\TestCase
|
||||
{
|
||||
public function dataProvider(): array
|
||||
public static function dataProvider(): array
|
||||
{
|
||||
return [
|
||||
['i0e', 0],
|
||||
@@ -47,7 +47,7 @@ class BencodeTest extends \PHPUnit\Framework\TestCase
|
||||
$bencode->decodeString('di1e5:valuee');
|
||||
}
|
||||
|
||||
public function invalidIntegers(): array
|
||||
public static function invalidIntegers(): array
|
||||
{
|
||||
return [['-0'], ['a'], ['1.0']];
|
||||
}
|
||||
|
||||
@@ -465,7 +465,7 @@ class BencodeTorrentTest extends \PHPUnit\Framework\TestCase
|
||||
$bencode->getEncode();
|
||||
}
|
||||
|
||||
public function testInvalidPath(): void
|
||||
public function testEmptyPathPart(): void
|
||||
{
|
||||
$data = [
|
||||
'encoding' => 'UTF8',
|
||||
@@ -473,7 +473,44 @@ class BencodeTorrentTest extends \PHPUnit\Framework\TestCase
|
||||
'files' => [
|
||||
0 => [
|
||||
'length' => 1234,
|
||||
'path' => ['']
|
||||
'path' => [
|
||||
'',
|
||||
'01 - test test',
|
||||
]
|
||||
]
|
||||
],
|
||||
'name' => 'test',
|
||||
'length' => 1213134,
|
||||
'pieces' => 'fake pieces string'
|
||||
]
|
||||
];
|
||||
$bencode = new BencodeTorrent();
|
||||
$bencode->setData($data);
|
||||
$this->assertSame(
|
||||
[
|
||||
'total_size' => 1234,
|
||||
'files' => [
|
||||
0 => [
|
||||
'path' => '/01 - test test',
|
||||
'size' => 1234,
|
||||
],
|
||||
],
|
||||
],
|
||||
$bencode->getFileList()
|
||||
);
|
||||
}
|
||||
|
||||
public function testEmptyPath(): void
|
||||
{
|
||||
$data = [
|
||||
'encoding' => 'UTF8',
|
||||
'info' => [
|
||||
'files' => [
|
||||
0 => [
|
||||
'length' => 1234,
|
||||
'path' => [
|
||||
'',
|
||||
]
|
||||
]
|
||||
],
|
||||
'name' => 'test',
|
||||
@@ -485,4 +522,11 @@ class BencodeTorrentTest extends \PHPUnit\Framework\TestCase
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$bencode->setData($data);
|
||||
}
|
||||
|
||||
public function testValidateEmptyData(): void
|
||||
{
|
||||
$bencode = new BencodeTorrent();
|
||||
$this->expectException(\TypeError::class);
|
||||
$bencode->validate();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user