प्रतिनिधि इंटरव्यू विषय

सामान्य साक्षात्कार: HTTP 208 Already Reported का उपयोग कब किया जाना चाहिए, और इसके दुरुपयोग से कैसे बचें?

सामान्यमध्यम
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

आप बाइंडिंग्स के साथ एक WebDAV फ़ाइल सेवा का रखरखाव करते हैं। एक Depth infinity PROPFIND कई बाइंडिंग्स के माध्यम से एक ही संसाधन को प्रगणित (enumerate) करता है। 208 Already Reported को समझाएं और रिस्पांस, क्लाइंट संगतता, और लूप हैंडलिंग को डिज़ाइन करें।

प्रॉम्प्ट और दायरा

एक WebDAV सेवा कई बाइंडिंग्स को एक ही संसाधन की ओर इंगित करने की अनुमति देती है। एक क्लाइंट Depth infinity के साथ PROPFIND भेजता है, और सर्वर एक 207 Multi-Status रिस्पांस में उस संसाधन का बार-बार सामना करता है। 208 Already Reported को समझाएं, इसे कब जारी (emit) करना है, पुराने क्लाइंट्स को कैसे संभालना है, और यह 508 Loop Detected से कैसे भिन्न है।

यह RFC 5842 WebDAV बाइंडिंग एक्सटेंशन है। 208 “पहले से मौजूद है” के लिए कोई सामान्य REST सफलता कोड नहीं है।

साक्षात्कारकर्ता क्या परीक्षण कर रहा है

  • 208 को 207 Multi-Status रिस्पांस के अंदर एक स्टेटस लाइन के रूप में पहचानना, न कि स्टैंडअलोन HTTP रिस्पांस स्टेटस के रूप में।
  • बाइंडिंग उपनामों (aliases), संसाधन पहचान (resource identity), और बार-बार होने वाले प्रगणन (enumeration) को जोड़ना।
  • पहले से रिपोर्ट किए गए संसाधन को एक वास्तविक बाइंडिंग लूप से अलग करना और 508 का सही ढंग से उपयोग करना।
  • Depth सीमाएं, क्लाइंट क्षमता हैंडलिंग, XML पार्सिंग, और ऑब्जर्वेबिलिटी डिज़ाइन करना।

स्पष्टीकरण हेतु प्रश्न

  1. क्या सेवा RFC 5842 बाइंडिंग विधियों और DAV:resource-id को लागू करती है?
  2. क्या क्लाइंट 208 को समझते हैं, या केवल बुनियादी WebDAV 207 रिस्पांस को?
  3. क्या PROPFIND Depth 0, 1, या infinity है, और कौन सी सर्वर सीमा लागू होती है?
  4. क्या दोहराव बाइंडिंग्स, सिंबॉलिक लिंक्स, या एक वास्तविक पैरेंट-चाइल्ड चक्र के कारण होता है?
  5. क्या उत्पाद को प्रत्येक उपनाम को सूचीबद्ध करना चाहिए, या प्रत्येक संसाधन को केवल एक बार रिपोर्ट करना चाहिए?

30-सेकंड का उत्तर

“208 एक ऐसे संसाधन को चिह्नित करता है जो उसी 207 Multi-Status रिस्पांस में पहले ही रिपोर्ट किया जा चुका है, आमतौर पर तब जब WebDAV बाइंडिंग्स के कारण बार-बार प्रगणन होता है। मैं एक स्थिर संसाधन पहचान द्वारा डीडुप्लिकेट करता हूँ, पहली बार आने पर एक पूर्ण propstat लौटाता हूँ, और बाद की बाइंडिंग्स के लिए 208 का उपयोग करता हूँ; एक बाइंडिंग लूप जिसे सुरक्षित रूप से समाप्त नहीं किया जा सकता है, वह 508 है। उन क्लाइंट्स के लिए जो 208 को नहीं समझते हैं, मैं Depth को सीमित करता हूँ या WebDAV अनुबंध के भीतर एक पार्स करने योग्य 207 लौटाता हूँ, और डीडुप्लिकेशन, गहराई, लूप और ट्रंकेशन के कारणों को रिकॉर्ड करता हूँ। मैं कभी भी एक साधारण REST ‘already exists’ परिणाम के लिए 208 का उपयोग नहीं करूँगा।”

चरण-दर-चरण डिज़ाइन

1. रिस्पांस परत की पुष्टि करें

बाहरी HTTP रिस्पांस सामान्य रूप से 207 Multi-Status होता है। प्रत्येक रिस्पांस में एक संसाधन URI और एक या अधिक propstat तत्व होते हैं। 208 प्रासंगिक DAV प्रॉपर्टी रिस्पांस के अंदर की स्थिति पंक्ति (status line) है, जो यह दर्शाती है कि बाइंडिंग का संसाधन इस Multi-Status रिस्पांस में पहले ही रिपोर्ट किया जा चुका है। बाहरी 207 को 208 से न बदलें।

2. संसाधन पहचान द्वारा डीडुप्लिकेट करें

URI आवश्यक रूप से एक संसाधन पहचान नहीं है। विभिन्न बाइंडिंग्स एक ही संसाधन के लिए अलग-अलग URI प्रदर्शित कर सकती हैं। प्रति-ट्रैवर्सल विज़िट किए गए सेट के लिए DAV:resource-id या एक स्थिर आंतरिक ID का उपयोग करें। पहली बार मिलने पर पूर्ण प्रॉपर्टीज उत्सर्जित करें, फिर प्रत्येक URI के संबंध को बनाए रखते हुए बाद की बाइंडिंग्स के लिए 208 जारी करें।

text
PROPFIND Depth: infinity
  /alias-a -> resource R: full propstat
  /alias-b -> resource R: 208 Already Reported
  /child   -> resource C: full propstat

3. 208 को उसके इच्छित संदर्भ में रखें

208 दोहराए जाने वाले 207 प्रॉपर्टी पेलोड को बचाता है और बाइंडिंग प्रगणन को अनिश्चित काल तक बढ़ने से रोकता है। इसका मतलब डेटाबेस इंसर्ट विरोध, एक इडेम्पोटेंट पुनः प्रयास की सफलता, या कैश हिट नहीं है। एक साधारण JSON API को इसके बजाय स्पष्ट 200, 201, 204, या 409 सिमेंटिक्स चुनना चाहिए।

4. 508 Loop Detected में अंतर करें

यदि ट्रैवर्सल एक ऐसा बाइंडिंग संबंध पाता है जो पहले से पूर्ण हो चुके संसाधन के दूसरे संदर्भ के बजाय एक चक्र बनाता है, तो पुनरावृत्ति (recursion) को रोकें और 508 Loop Detected का उपयोग करें। 208 का अर्थ है कि संसाधन पहले सफलतापूर्वक रिपोर्ट किया गया था; 508 का अर्थ है कि अनंत लूप से बचने के लिए प्रसंस्करण रोक दिया गया था। उपनामों, वास्तविक चक्रों और गहराई सीमाओं का अलग-अलग परीक्षण करें।

5. संगतता और संसाधन सीमाओं को संभालें

208 के लिए क्लाइंट समर्थन पर बातचीत करें या उसका निरीक्षण करें। पुराने क्लाइंट के लिए, Depth infinity को सीमित करें, असुरक्षित अनुरोधों को अस्वीकार करें, या WebDAV सिमेंटिक्स का उल्लंघन किए बिना समझने योग्य propstat सामग्री लौटाएं। नोड गणना, रिस्पांस बाइट्स, समय, और विज़िट-सेट मेमोरी को सीमित करें ताकि कोई दुर्भावनापूर्ण बाइंडिंग ग्राफ़ सेवा को समाप्त न कर सके।

6. निरीक्षण करें और पुनर्प्राप्त करें

अनुरोध ID, Depth, विज़िट किए गए संसाधनों की संख्या, 208 संख्या, 508 संख्या, ट्रंकेशन कारण, रिस्पांस आकार, और क्लाइंट क्षमता रिकॉर्ड करें; कभी भी फ़ाइल सामग्री या क्रेडेंशियल्स को लॉग न करें। यदि डीडुप्लिकेशन इंडेक्स विफल हो जाता है, तो अनबाउंड रिकर्सन जारी करने के बजाय स्पष्ट त्रुटि के साथ सुरक्षित रूप से ट्रंकेट करें। पहचान और लूप डिबगिंग के लिए एक प्रतिलिपि प्रस्तुत करने योग्य बाइंडिंग ग्राफ़ रखें।

मॉडल उच्च-गुणवत्ता वाला उत्तर

“बाहरी रिस्पांस 207 Multi-Status बना रहता है; 208 एक propstat स्थिति में यह कहने के लिए प्रकट होता है कि वही संसाधन पहले ही रिपोर्ट किया जा चुका है। एक Depth infinity PROPFIND के लिए मैं संसाधन पहचान से एक विज़िट किया गया सेट बनाता हूँ: पहली बाइंडिंग पूर्ण प्रॉपर्टीज लौटाती है, और बाद के उपनाम अपने URI को बनाए रखते हुए 208 लौटाते हैं। एक वास्तविक चक्र 508 के साथ रुक जाता है। मैं एक सामान्य API के पहले से मौजूद या पुनः प्रयास परिणाम के लिए 208 का उपयोग नहीं करूँगा। पुराने क्लाइंट्स को गहराई सीमा या सुरक्षित अस्वीकृति मिलती है, और टेलीमेट्री संसाधनों, रिस्पांस आकार, 208, 508 और ट्रंकेशन को कवर करती है।”

सामान्य गलतियाँ

  • पूरे HTTP रिस्पांस को 208 पर सेट करना → 207 Multi-Status संरचना खो जाती है → प्रासंगिक propstat स्थिति में 208 रखें।
  • URI को संसाधन कुंजी के रूप में उपयोग करना → उपनाम अभी भी संसाधन की नकल करते हैं → संसाधन ID द्वारा डीडुप्लिकेट करें।
  • पहले से मौजूद (already-exists) के लिए 208 का उपयोग करना → सामान्य REST क्लाइंट इसका गलत अर्थ निकालते हैं → 409 या एक स्पष्ट व्यावसायिक प्रतिक्रिया का उपयोग करें।
  • प्रत्येक डुप्लिकेट को 508 के रूप में मानना → सामान्य उपनाम लूप की तरह दिखते हैं → रिपोर्ट किए गए संसाधनों को चक्रों से अलग करें।
  • कोई Depth या रिस्पांस सीमा निर्धारित न करना → एक बाइंडिंग ग्राफ़ मेमोरी को समाप्त कर सकता है → नोड्स, समय, बाइट्स और विज़िट-सेट आकार को सीमित करें।

अनुवर्ती प्रश्न और उत्तर

क्या 208 प्रविष्टि के लिए अभी भी URI की आवश्यकता है?

हाँ। उस बाइंडिंग के लिए रिस्पांस बनाए रखें ताकि क्लाइंट को पता चले कि किस URI को ट्रैवर्स किया गया था, लेकिन पूर्ण प्रॉपर्टी पेलोड को न दोहराएं। XML को WebDAV Multi-Status पार्सिंग अनुबंध का पालन करना चाहिए।

डुप्लिकेट प्रविष्टियों को पूरी तरह से क्यों न हटाएं?

हटाने से यह तथ्य छिप जाता है कि एक उपनाम को ट्रैवर्स किया गया था और यह सर्वर की चूक जैसा लग सकता है। 208 डुप्लिकेट प्रॉपर्टी डेटा से बचते हुए ट्रैवर्सल साक्ष्य को सुरक्षित रखता है।

सर्वर को Depth infinity को कब अस्वीकार करना चाहिए?

जब क्लाइंट 208 को पार्स नहीं कर सकता है, बाइंडिंग ग्राफ़ संसाधन सीमाओं से अधिक हो जाता है, या एक विश्वसनीय विज़िट किया गया सेट नहीं बनाया जा सकता है, तो इसे अस्वीकार या सीमित करें। एक सीमित रिस्पांस अधूरा आउटपुट या अनबाउंड रिकर्सन से अधिक सुरक्षित है।

सार्वजनिक स्रोत

संबंधित प्रश्न