पर एक SFTP "खुला" के लिए सही प्रतिक्रिया मैं अपाचे एसएसएचडी के लिए कस्टम फाइल सिस्टम कक्षाएं लिख रहा हूं। जब कोई ग्राहक मौजूद नहीं है तो क्लाइंट get
पर कोशिश करता है जब मैंने कोई समस्या आई है।गैर-मौजूदा फ़ाइल
मेरा ऑब्जेक्ट doesExist() == false
देता है।
यह सर्वर को SSH_FXP_STAT के जवाब में SSH_FX_NO_SUCH_FILE पैकेट भेजने का कारण बनता है।
ओपनएसएसएच क्लाइंट का उपयोग करके, यह ठीक काम करता है: क्लाइंट "फ़ाइल"/foo 'नहीं मिला "रिपोर्ट करता है।
हालांकि, पीएसएफटीपी (पुट्टी एसएफटीपी क्लाइंट) इसके अनुरोधों को पाइपलाइन करता है, इसलिए यह स्टेट के जवाब के बावजूद एक खुला पैकेट भेजता है। इसके बाद परिणामी फाइलहेडल पर एक रीड भेजता है, जो वर्तमान में मेरे कोड में अपवाद का कारण बनता है, जिसके परिणामस्वरूप पूरे सत्र समाप्त हो जाते हैं।
फ़ाइल को पढ़ने का प्रयास करने पर सर्वर प्रतिक्रिया क्या होनी चाहिए जो मौजूद नहीं है?
verbosity के लिए माफी के साथ, प्रश्न में अपाचे कोड यहां है। मैं इसे संशोधित नहीं करना चाहता - मेरी कक्षा यहां SshFile "फ़ाइल" है। लेकिन अगर अपाचे कोड निश्चित रूप से छोटी है, तो मुझे लगता है कि मुझे उन्हें एक पैच देना होगा।
if (version <= 4) {
String path = buffer.getString();
int pflags = buffer.getInt();
// attrs
try {
SshFile file = resolveFile(path);
if (file.doesExist()) {
if (((pflags & SSH_FXF_CREAT) != 0) && ((pflags & SSH_FXF_EXCL) != 0)) {
sendStatus(id, SSH_FX_FILE_ALREADY_EXISTS, path);
return;
}
} else {
if (((pflags & SSH_FXF_CREAT) != 0)) {
if (!file.isWritable()) {
sendStatus(id, SSH_FX_FAILURE, "Can not create " + path);
return;
}
file.create();
}
}
String acc = ((pflags & (SSH_FXF_READ | SSH_FXF_WRITE)) != 0 ? "r" : "") +
((pflags & SSH_FXF_WRITE) != 0 ? "w" : "");
if ((pflags & SSH_FXF_TRUNC) != 0) {
file.truncate();
}
String handle = UUID.randomUUID().toString();
handles.put(handle, new FileHandle(file, pflags)); // handle flags conversion
sendHandle(id, handle);
} catch (IOException e) {
sendStatus(id, SSH_FX_FAILURE, e.getMessage());
}
हम्म, मैं आशा करता था कि अपाचे एसएसएचडी कोड को संशोधित न करें। यह अपरिहार्य हो सकता है। ऐसा लगता है कि V4 FXP_OPEN पैकेट (जिसमें एक OPEN_EXISTING ध्वज है) के साथ सही चीज है लेकिन V3 FXP_OPEN के साथ नहीं, जो नहीं है। संयोग से, पीएसएफटीपी प्रतिक्रिया पैकेट से यूआई में त्रुटि संदेशों को पारित नहीं कर रहा है :( – slim