2012-08-23 10 views
5

पर एक 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()); 
     } 

उत्तर

3

एक SSH_FX_NO_SUCH_FILE स्थिति कोड के साथ SSH_FXP_OPEN अनुरोध भी करने के लिए उत्तर दें। उस समस्या को psftp के साथ हल करना चाहिए।

वैसे भी, आपको सक्रिय फ़ाइल और निर्देशिका हैंडल का रजिस्टर रखना होगा। जब रिमोट साइड एक ऐसे हैंडल के लिए एक ऑपरेशन का अनुरोध करता है जो सक्रिय नहीं है या यह सही प्रकार का नहीं है, तो SSH_FX_FAILURE स्थिति संदेश के साथ प्रतिक्रिया दें। अधिक जानकारीपूर्ण और उपयोगकर्ता के अनुकूल त्रुटि को शामिल करने के लिए SSH_FXP_STATUS पैकेट पर error message स्लॉट का उपयोग करें क्योंकि कोड बहुत उपयोगी नहीं है।

+1

हम्म, मैं आशा करता था कि अपाचे एसएसएचडी कोड को संशोधित न करें। यह अपरिहार्य हो सकता है। ऐसा लगता है कि V4 FXP_OPEN पैकेट (जिसमें एक OPEN_EXISTING ध्वज है) के साथ सही चीज है लेकिन V3 FXP_OPEN के साथ नहीं, जो नहीं है। संयोग से, पीएसएफटीपी प्रतिक्रिया पैकेट से यूआई में त्रुटि संदेशों को पारित नहीं कर रहा है :( – slim