{"record":{"id":"a400780a143097bf","repo":"tonhowtf/omniget","slug":"receiver-rejected-transfer","errorCode":null,"errorMessage":"Receiver rejected transfer: {}","messagePattern":"Receiver rejected transfer: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src-tauri/omniget-core/src/platforms/p2p.rs","lineNumber":297,"sourceCode":"        anyhow::bail!(\"Unexpected relay response: {}\", ready);\n    }\n\n    *session.status.lock().await = \"connected\".to_string();\n    tracing::info!(\"[p2p] receiver connected\");\n\n    let header = format!(\"{}\\n{}\\n\", session.file_name, session.file_size);\n    write_half.write_all(header.as_bytes()).await?;\n    write_half.flush().await?;\n\n    let ok_response = tokio::select! {\n        line = read_line(&mut reader) => line?,\n        _ = cancel.cancelled() => {\n            anyhow::bail!(\"Send cancelled while waiting for OK\");\n        }\n    };\n\n    if ok_response != \"OK\" {\n        anyhow::bail!(\"Receiver rejected transfer: {}\", ok_response);\n    }\n\n    *session.status.lock().await = \"transferring\".to_string();\n    tracing::info!(\n        \"[p2p] transferring: {} ({} bytes)\",\n        session.file_name,\n        session.file_size\n    );\n\n    let mut file = File::open(&session.file_path).await?;\n    let mut buf = vec![0u8; CHUNK_SIZE];\n    let mut sent: u64 = 0;\n\n    loop {\n        if cancel.is_cancelled() {\n            anyhow::bail!(\"Send cancelled during transfer\");\n        }\n","sourceCodeStart":279,"sourceCodeEnd":315,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/platforms/p2p.rs#L279-L315","documentation":"After the sender transmits the file name and size header, the receiver must answer \"OK\" to accept the transfer. Any other response means the receiver refused — typically the user declined the incoming file on the other side. The raw response is included in the message so the sender can see why.","triggerScenarios":"During run_sender, the receiver's reply line after the header is anything other than \"OK\" — usually \"NO\"/\"REJECT\" from a user pressing decline, or a protocol-level refusal (e.g. insufficient disk space reported by a custom receiver).","commonSituations":"Receiver declines the incoming transfer dialog; receiver rejects because the file name looks unsafe (path characters) or too large for its disk; a mismatched receiver implementation sends a different acknowledgement token.","solutions":["Check the response text in the error to see the receiver's refusal reason and surface it to the sender","On the receiver side, verify the accept prompt logic sends exactly \"OK\" on acceptance","If rejection is due to size/name, sanitize the file name or confirm free disk space on the receiver before resending"],"exampleFix":"// before\nif ok_response != \"OK\" {\n    anyhow::bail!(\"Receiver rejected transfer: {}\", ok_response);\n}\n// after\nmatch ok_response.trim() {\n    \"OK\" => {}\n    \"REJECT:disk\" => anyhow::bail!(\"Receiver lacks disk space for {} bytes\", session.file_size),\n    other => anyhow::bail!(\"Receiver rejected transfer: {}\", other),\n}","handlingStrategy":"fallback","validationCode":"// Receiver-side pre-checks that prevent rejections\nlet free = fs2::available_space(&download_dir)?;\nif free < file_size { anyhow::bail!(\"Insufficient disk space on receiver\"); }","typeGuard":null,"tryCatchPattern":"match run_sender(&mut session, &cancel).await {\n    Err(e) if e.to_string().contains(\"Receiver rejected transfer\") => {\n        ui.show_info(\"The recipient declined the file.\");\n    }\n    other => other?,\n}","preventionTips":["Sanitize file names before sending so receivers never reject for path-safety","Check receiver disk space (sent in header) before large transfers","Standardize the accept token to exactly \"OK\" in all receiver implementations"],"tags":["p2p","sender","receiver","protocol","rejection"],"backgroundTag":"unexpected-response-shape","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}