# Техническая документация ContentZavod Proxy

## Архитектура плагина

### Общая структура

Плагин построен по объектно-ориентированному принципу и состоит из одного основного класса `ContentZavod_Proxy`, который инкапсулирует всю логику работы.

```
ContentZavod_Proxy
├── Константы конфигурации
├── Методы работы с URL
├── Методы проксирования
└── Методы обработки HTML
```

### Основной класс: ContentZavod_Proxy

#### Константы

```php
private const SOURCE_URL = 'https://fittin.ru';
private const URL_PREFIX = 'contentzavod';
```

- `SOURCE_URL` - базовый URL источника для проксирования
- `URL_PREFIX` - префикс URL, который будет перехватываться плагином

#### Публичные методы

##### `__construct()`

Конструктор класса, регистрирует хуки WordPress:

- `init` → `add_rewrite_rules()`
- `template_redirect` → `handle_proxy_request()`
- `query_vars` → `add_query_vars()`

##### `add_rewrite_rules()`

Добавляет правила перезаписи URL в WordPress.

**Регулярное выражение:**

```php
'^contentzavod/(.+)/?$'
```

**Перезапись в:**

```php
'index.php?contentzavod_path=$matches[1]'
```

Это означает, что URL вида `/contentzavod/путь/к/странице` будет преобразован в запрос с параметром `contentzavod_path=путь/к/странице`.

##### `add_query_vars($vars)`

Регистрирует переменную запроса `contentzavod_path` в WordPress, чтобы её можно было получить через `get_query_var()`.

##### `handle_proxy_request()`

Основной метод обработки проксированных запросов.

**Алгоритм работы:**

1. Получает путь из переменной запроса
2. Формирует полный URL для запроса к источнику
3. Выполняет HTTP GET запрос через `wp_remote_get()`
4. Проверяет код ответа
5. Обрабатывает HTML контент
6. Отправляет контент пользователю

**Параметры HTTP запроса:**

```php
array(
    'timeout' => 30,              // Таймаут 30 секунд
    'sslverify' => true,          // Проверка SSL сертификата
    'headers' => array(
        'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    )
)
```

#### Приватные методы

##### `process_html_content($html, $current_path)`

Обрабатывает HTML контент, заменяя относительные ссылки на абсолютные.

**Обрабатываемые элементы:**

1. **Абсолютные ссылки на источник**

   ```php
   str_replace(
       'https://fittin.ru/contentzavod/',
       'https://ваш-сайт.ru/contentzavod/',
       $html
   )
   ```

2. **Атрибут href (ссылки)**
   - Пропускает: `http://`, `https://`, `//`, `#`, `mailto:`, `tel:`
   - Обрабатывает: относительные пути

   ```php
   href="about.html"        → href="https://fittin.ru/about.html"
   href="/images/logo.png"  → href="https://fittin.ru/images/logo.png"
   ```

3. **Атрибут src (изображения, скрипты)**
   - Пропускает: `http://`, `https://`, `//`, `data:`
   - Обрабатывает: относительные пути

   ```php
   src="image.jpg"         → src="https://fittin.ru/image.jpg"
   src="/js/script.js"     → src="https://fittin.ru/js/script.js"
   ```

4. **Атрибут srcset (адаптивные изображения)**
   - Разбивает srcset на отдельные элементы
   - Обрабатывает каждый URL отдельно
   - Сохраняет дескрипторы (1x, 2x, 100w и т.д.)

   ```php
   srcset="img.jpg 1x, img@2x.jpg 2x"
   →
   srcset="https://fittin.ru/img.jpg 1x, https://fittin.ru/img@2x.jpg 2x"
   ```

5. **CSS ссылки (link rel="stylesheet")**

   ```php
   <link href="style.css" rel="stylesheet">
   →
   <link href="https://fittin.ru/style.css" rel="stylesheet">
   ```

6. **Inline стили с url()**

   ```php
   background: url('bg.jpg')
   →
   background: url('https://fittin.ru/bg.jpg')
   ```

## Поток данных

```
1. Пользователь запрашивает:
   https://ваш-сайт.ru/contentzavod/view/article

2. WordPress перехватывает запрос (rewrite rules)
   ↓
3. Преобразует в: index.php?contentzavod_path=view/article
   ↓
4. Плагин получает переменную contentzavod_path
   ↓
5. Формирует URL: https://fittin.ru/contentzavod/view/article
   ↓
6. Выполняет HTTP GET запрос
   ↓
7. Получает HTML контент
   ↓
8. Обрабатывает ссылки в HTML
   ↓
9. Отправляет обработанный HTML пользователю
```

## Регулярные выражения

### Обработка href

```regex
/href=["\'](?!http|\/\/|#|mailto:|tel:)([^"\']+)["\']/i
```

**Разбор:**

- `href=["\']` - начало атрибута href с кавычкой
- `(?!http|\/\/|#|mailto:|tel:)` - negative lookahead: пропускаем абсолютные URL
- `([^"\']+)` - захватываем содержимое до закрывающей кавычки
- `["\']` - закрывающая кавычка
- `i` - флаг case-insensitive

### Обработка src

```regex
/src=["\'](?!http|\/\/|data:)([^"\']+)["\']/i
```

Аналогично href, но пропускает также `data:` URI.

### Обработка url() в CSS

```regex
/url\(["\']?(?!http|\/\/|data:)([^"\')\s]+)["\']?\)/i
```

**Разбор:**

- `url\(` - начало функции url()
- `["\']?` - опциональная кавычка
- `(?!http|\/\/|data:)` - пропускаем абсолютные URL
- `([^"\')\s]+)` - захватываем URL до кавычки или скобки
- `["\']?` - опциональная закрывающая кавычка
- `\)` - закрывающая скобка

## Хуки WordPress

### Используемые хуки

| Хук | Приоритет | Функция | Назначение |
|-----|-----------|---------|------------|
| `init` | 10 | `add_rewrite_rules()` | Регистрация правил URL |
| `template_redirect` | 10 | `handle_proxy_request()` | Обработка запросов |
| `query_vars` | 10 | `add_query_vars()` | Регистрация переменных |
| `plugins_loaded` | 10 | `contentzavod_proxy_init()` | Инициализация плагина |

### Хуки активации/деактивации

```php
register_activation_hook(__FILE__, 'contentzavod_proxy_activate');
register_deactivation_hook(__FILE__, 'contentzavod_proxy_deactivate');
```

## Безопасность

### Защита от прямого доступа

```php
if (!defined('ABSPATH')) {
    exit;
}
```

Предотвращает прямое выполнение PHP файла.

### SSL верификация

```php
'sslverify' => true
```

Проверяет SSL сертификат при запросах к источнику.

### Использование WordPress API

Плагин использует встроенные функции WordPress:

- `wp_remote_get()` - безопасные HTTP запросы
- `wp_die()` - безопасный вывод ошибок
- `home_url()` - получение URL сайта
- `get_query_var()` - получение переменных запроса

## Производительность

### Таймауты

- HTTP запрос: 30 секунд
- Нет кэширования (по требованию)

### Оптимизация

Плагин выполняет минимальную обработку:

1. Один HTTP запрос на страницу
2. Обработка HTML через регулярные выражения (быстро)
3. Нет обращений к базе данных
4. Нет сохранения данных

### Потенциальные узкие места

1. **Скорость ответа источника** - если fittin.ru медленно отвечает, пользователь будет ждать
2. **Размер HTML** - большие страницы требуют больше времени на обработку
3. **Количество ссылок** - много ссылок = больше regex операций

## Ограничения

### Текущие ограничения

1. **Только GET запросы** - POST, PUT, DELETE не поддерживаются
2. **Нет кэширования** - каждый запрос идет на источник
3. **Захардкоженный URL** - нельзя изменить без редактирования кода
4. **Нет логирования** - ошибки не записываются
5. **Нет rate limiting** - можно перегрузить источник запросами

### Не обрабатываются

1. JavaScript-генерируемые ссылки
2. AJAX запросы из JavaScript
3. WebSocket соединения
4. Cookies и сессии
5. Формы (POST запросы)

## Возможные улучшения

### Кэширование

```php
// Пример с использованием WordPress Transients API
$cache_key = 'czp_' . md5($target_url);
$cached = get_transient($cache_key);

if ($cached !== false) {
    echo $cached;
    exit;
}

// ... получение контента ...

set_transient($cache_key, $content, 3600); // кэш на 1 час
```

### Логирование

```php
if (is_wp_error($response)) {
    error_log('ContentZavod Proxy Error: ' . $response->get_error_message());
    // ...
}
```

### Административная панель

Создать страницу настроек для изменения:

- URL источника
- Префикса URL
- Таймаутов
- Включения/выключения кэширования

### Поддержка POST запросов

```php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $response = wp_remote_post($target_url, array(
        'body' => $_POST,
        'timeout' => 30
    ));
}
```

## Тестирование

### Ручное тестирование

1. Активируйте плагин
2. Откройте URL: `/contentzavod/view/test`
3. Проверьте:
   - Загружается ли контент
   - Работают ли изображения
   - Работают ли стили
   - Работают ли ссылки

### Тестовые кейсы

| Тест | Ожидаемый результат |
|------|---------------------|
| `/contentzavod/` | Главная страница раздела |
| `/contentzavod/view/article` | Статья загружается |
| `/contentzavod/nonexistent` | 404 ошибка |
| Клик по ссылке на странице | Переход на другую страницу |
| Просмотр изображения | Изображение загружается |

## Совместимость

### WordPress

- Минимальная версия: 5.0
- Тестировалось на: 6.x

### PHP

- Минимальная версия: 7.0
- Рекомендуется: 7.4+

### Плагины

Может конфликтовать с:

- Плагинами кэширования (если кэшируют проксированные страницы)
- Плагинами безопасности (если блокируют исходящие запросы)
- Другими плагинами, изменяющими rewrite rules

## Отладка

### Включение режима отладки

В `wp-config.php`:

```php
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
```

### Проверка rewrite rules

```php
// Временно добавьте в плагин для отладки
add_action('init', function() {
    global $wp_rewrite;
    echo '<pre>';
    print_r($wp_rewrite->rules);
    echo '</pre>';
});
```

### Проверка переменных запроса

```php
// В методе handle_proxy_request()
error_log('ContentZavod Path: ' . get_query_var('contentzavod_path'));
error_log('Target URL: ' . $target_url);
```

