Skip to main content

チャンク分割によるスキャンのアップロード

Start Scan APIは、大きなコードベースを複数のリクエストに分けてアップロードします。会社アカウントでBLASTスキャンが有効になっている必要があり、アップロードできるソースアーカイブは1つです。 このガイドではアップロードの手順を説明します。リクエストフィールドとステータスコードは、POST /start-scanPATCH /start-scan/{transfer_id}/HEAD /start-scan/{transfer_id}/ のOpenAPIページを参照してください。

アップロード手順

  1. POST /start-scan で転送を開始します。 フォームフィールドとして scan_type=blast を送り、アーカイブ名と空の本文を含む files パートを付けます。アーカイブ名の拡張子は .zip.tar.json.fpr.sarif.xml のいずれかである必要があります。レスポンスに transfer_id が含まれます。
  2. HEAD /start-scan/{transfer_id}/ で現在のオフセットを確認します。 レスポンスヘッダー Upload-Offset が、次に送るバイト位置です。未知または空の転送では 0 が返ります。
  3. PATCH /start-scan/{transfer_id}/ で各チャンクをアップロードします。 次のバイト列を chunk_data として送り、次のリクエストヘッダーを付けます。
    • Upload-Offset: 現在のバイトオフセット
    • Upload-Length: ファイル全体のサイズ(バイト)
    • Upload-Name: アーカイブのファイル名
  4. 最後のPATCHが scan_id を返したら完了です。 途中のPATCHレスポンスには次のバイト位置を示す Upload-Offset があり、scan_id はありません。最後のチャンクでアーカイブが揃うと、JSON本文に scan_idproject_id が含まれます。この完了レスポンスは Upload-Offset を返しません。scan_id でスキャンと問題のAPIを呼び出します。HEADは scan_id を返しません。
各PATCHリクエストでは、project_namebranchrepo_urlshafiles_to_scandirtyscan_configstarget_policies も送れます。フルスキャンでは partial_scan を省略します。部分スキャンのときだけ partial_scan=true を送ります。

認証

すべてのリクエストにAPIトークンを付けます。

スキャンのメタデータ

metadata は任意のJSONオブジェクト文字列です(例: {"pipeline_url": "https://ci.example/run/123"})。各チャンクリクエストで検証され、アップロード完了時にスキャンへ追加されるため、すべてのチャンクで同じ値を送ります。オブジェクトは最大16,384バイトです。

Pythonの例

このスクリプトはBLASTアップロードを開始するか、--transfer_id で既存の転送を再開します。途中のチャンクではサーバーの Upload-Offset に従います。最後のPATCHは Upload-Offset ではなく scan_id を返します。
実行例:
中断したアップロードを再開するには、既存の転送IDを渡します。
部分スキャンでは、--partial_scan--files_to_scan "vuln.py,test.py" を追加します。 スキャンのメタデータを付ける場合は、--metadata '{"pipeline_url":"https://ci.example/run/123"}' を追加します。すべてのチャンクで同じ値を送ります。