Commons Net FTPHTTPClient: מנהרות פרוקסי HTTP ל‑FTP פסיבי
העבירו את בקרת ה‑FTP ואת חיבורי הנתונים הפסיביים דרך פרוקסי HTTP עם הלקוח הייעודי של Commons Net.
Apache Commons Net כולל את FTPHTTPClient לשימוש ב‑FTP דרך פרוקסי HTTP CONNECT. התכונה השימושית שלו אינה רק הגעה לפורט הכניסה של FTP: הוא גם מקים מנהרות פרוקסי עבור חיבורי הנתונים הפסיביים שבהם משתמשים רשימות ותעבורת קבצים.
הבנאי מקבל את נקודת הקצה של הפרוקסי ופרטי אימות פרוקסי אופציונליים. שרת ה‑FTP נשאר הארגומנט של connect, ו‑login מקבל את חשבון ה‑FTP:
FTPHTTPClient ftp = new FTPHTTPClient(
"proxy.example.net", 8080, proxyUser, proxyPassword
);
try {
ftp.connect("ftp.example.net", 21);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
throw new IOException(ftp.getReplyString());
}
if (!ftp.login(ftpUser, ftpPassword)) {
throw new IOException(ftp.getReplyString());
}
ftp.enterLocalPassiveMode();
if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)
|| !ftp.retrieveFile(remoteFile, output)) {
throw new IOException(ftp.getReplyString());
}
ftp.logout();
} finally {
if (ftp.isConnected()) {
ftp.disconnect();
}
}
קטע התעבורה הזה מניח את ייבואי ה‑FTP של Commons Net, את java.io.IOException, משתני אישורים שמספקת היישום וזרם פלט בבעלות הקורא. remoteFile הוא שם הקובץ המיועד בצד השרת. היישום חייב גם לסגור את זרם הפלט שלו בנקודה המתאימה.
הגדירו מצב פסיבי לאחר ההתחברות ולפני פעולת נתונים. המימוש של FTPHTTPClient דוחה חיבורי נתונים במצב אקטיבי. במצב פסיבי הוא מנהל משא ומתן על נקודת הקצה של הנתונים עם FTP ופותח חיבור נוסף לפרוקסי ה‑HTTP, ואז מבקש מנהרת CONNECT אל אותה נקודת קצה.
המנהרה השנייה הזו מסבירה גבול נפוץ: הרשאת פרוקסי לפורט הבקרה של FTP אינה מספיקה. היעדים והפורטים המותרים חייבים לכלול את נקודות הקצה הפסיביות של הנתונים בשרת. ברכה והתחברות מוצלחות מוכיחות רק שמסלול הבקרה עבד.
המימוש מספק אימות פרוקסי Basic כאשר גם שם המשתמש וגם הסיסמה של הפרוקסי נמצאים. זה שונה מחילופי USER/PASS של FTP. פרוקסי שדורש מנגנון אימות אחר זקוק למחבר תואם; הבנאי אינו הופך כל סכימה לזמינה.
Commons Net מתעד את המחלקה הזו כניסיונית, לכן העריכו אותה מול דרישות היישום והפרוקסי לפני אימוץ. זהו לקוח FTP, לא לקוח FTPS או SFTP. עבור FTPS עם שירות SOCKS זמין, ממשק ה‑socket-proxy של FTPSClient הוא מסלול לקוח נפרד. CONNECT מספק את המסלול ואינו מצפין בעצמו אישורי FTP או תוכן קבצים.
השאירו שגיאות צמודות לשלב שיצר אותן: דחיית HTTP בזמן הקמת המנהרה, סירוב התחברות ל‑FTP, או כשל בתעבורת FTP/נתונים. החלפת סיסמת ה‑FTP אינה יכולה לפתור מדיניות פרוקסי שדוחה את פורט הנתונים הפסיבי.