# 执行计划 - 修复 curl 导入解析失败 [object Object]

> **文档类型**: 执行计划文档
> **创建日期**: 2026-08-19
> **作者**: czj
> **优先级**: P0
> **关联文档**: `_问题处理_curl导入解析失败[object Object].md`
> **状态**: 已完成

---

## 一、改动总览

| # | 改动项 | 文件 | 说明 |
|---|--------|------|------|
| 1 | `CurlParseRequest` 补全 model_config（alias 映射） | `backend/app/schemas/performance.py` | 修复前端 camelCase 请求 422 主因 |
| 2 | 新增 Windows CMD `^` 语法预处理 | `backend/app/utils/curl_parser.py` | 兼容 CMD 续行符与转义引号 |
| 3 | 新增 `-b`/`--cookie` 参数支持 | `backend/app/utils/curl_parser.py` | 解析 Cookie 旗标 |
| 4 | 新增 4 个 curl 解析器测试用例 | `backend/tests/test_curl_parser.py` | 覆盖新增修复点 |

---

## 二、详细执行步骤

### Step 1：修复 `CurlParseRequest` 别名映射

**文件**：`backend/app/schemas/performance.py`

**问题**：前端 `parseCurl()` 发送 `{"curlCommand": "..."}`（camelCase），但 `CurlParseRequest` 只定义了 `curl_command`（snake_case）且没有 `model_config`，Pydantic 无法映射，返回 422。

**修复**：补全 `model_config`，与项目中其他 schema 保持一致：

```diff
  class CurlParseRequest(BaseModel):
+     """curl 命令解析请求"""
      curl_command: str = Field(..., max_length=10000, description="完整 curl 命令")
+
+     model_config = ConfigDict(populate_by_name=True, alias_generator=to_camel)
```

### Step 2：新增 Windows CMD 风格预处理

**文件**：`backend/app/utils/curl_parser.py`

**问题**：Windows CMD 中 `^` 是行续行符、`^"` 是转义双引号，`shlex.split()` 无法理解，会把 `^` 拼进 token（如 `^Accept`），导致请求头识别失败、认证/签名头无法剥离。

**修复**：在 `parse_curl()` 分词前调用新增的 `_preprocess_cmd_style()`：

```python
def _preprocess_cmd_style(curl_command: str) -> str:
    """预处理 Windows CMD 风格的 curl 命令，兼容 '^' 续行符与 '^"' 转义引号。"""
    if "^" not in curl_command:
        return curl_command
    lines = []
    for line in curl_command.splitlines():
        stripped = line.rstrip()
        if stripped.endswith("^"):
            stripped = stripped[:-1]
        lines.append(stripped)
    cleaned = " ".join(lines)
    cleaned = cleaned.replace('^"', '"')
    return cleaned.strip()
```

并在 `parse_curl()` 中接入：

```diff
  if not curl_command or not curl_command.strip():
      raise ValueError("curl 命令不能为空")

+ # 兼容 Windows CMD 文本：还原 '^' 续行与 '^"' 转义引号后再分词
+ curl_command = _preprocess_cmd_style(curl_command)

  # shlex 分词：统一 posix=True 兼容单/双引号与反斜杠续行
  try:
      tokens = shlex.split(curl_command)
```

### Step 3：新增 `-b`/`--cookie` 参数支持

**文件**：`backend/app/utils/curl_parser.py`

**问题**：用户命令使用 `-b` 传 Cookie，解析器对未知参数静默忽略，Cookie 丢失。

**修复**：在参数循环中新增分支：

```python
if token in ("-b", "--cookie"):
    if next_token is None:
        raise ValueError(f"参数 {token} 缺少值")
    result.cookie = next_token
    _merge_header(result.headers, "Cookie", next_token)
    i += 2
    continue
```

### Step 4：新增单元测试

**文件**：`backend/tests/test_curl_parser.py`

新增 4 个测试用例：

| 用例 | 覆盖点 |
|------|--------|
| `test_parse_cookie_flag_b` | `-b` 旗标解析 Cookie |
| `test_parse_cookie_flag_long_option` | `--cookie` 长选项 |
| `test_parse_windows_cmd_caret_style` | CMD `^` 续行 + `^"` 转义 + 认证/签名识别 + `-b` |
| `test_parse_windows_cmd_with_body` | CMD 风格 POST + 嵌套转义引号 body |

### Step 5：验证

```bash
# 后端单元测试（curl 解析器全量）
cd backend && pytest tests/test_curl_parser.py -v
# 预期：15 passed

# 后端全量回归（排除已知无关用例）
cd backend && pytest tests/ -q --ignore=tests/test_execution_cancel.py --ignore=tests/test_api.py
# 预期：197 passed

# 前端构建
cd frontend && npm run build
# 预期：构建成功
```

---

## 三、验证步骤

| 步骤 | 操作 | 预期结果 |
|------|------|----------|
| 1 | 后端单元测试 | 15 个 curl 解析器用例全部通过 |
| 2 | camelCase 请求回归 | 前端发送 `{curlCommand}` → 200 而非 422（已用测试脚本复验） |
| 3 | Windows CMD 完整命令 | `curl ^"url^" -H ^"Authorization: Bearer xxx^" ... -b ^"sid=abc^"` 正确解析：url/headers 正常、authRequired=true、signRequest=true、cookie 有值 |
| 4 | 全量后端回归 | 197 passed（排除已知无关失败） |
| 5 | 前端构建 | `npm run build` 通过 |

---

## 四、部署与回滚

### 部署（5.60 服务器）

1. 提交代码并推送：`git push origin platform-auto-test`
2. 服务器拉取代码
3. 重建/重启后端容器 `plat-auto-test-app`
4. 重建/重启前端容器
5. 用户在浏览器验证粘贴真实 CMD curl 可正常导入

### 回滚方案

如修复后出现异常，撤销本次改动：

```bash
git checkout -- backend/app/schemas/performance.py backend/app/utils/curl_parser.py backend/tests/test_curl_parser.py
```

---

## 五、遗留事项

- [ ] 服务器部署后，用用户提供的真实 curl 命令在 5.60 复验一次完整导入
- [ ] HANDOFF_性能测试.md 增补本次问题处理记录

---

*本文档由 Claude Code 生成，遵循项目执行计划文档规范。*