2010-06-16 16 views
15

मैं सी ++/क्यूटी में multipart/related के लिए एक मूल MIME पार्सर लागू करने का प्रयास कर रहा हूं।एमआईएम आरएफसी "सामग्री-प्रकार" पैरामीटर भ्रम? अस्पष्ट आरएफसी विनिर्देश

अब तक मैं हेडर के लिए कुछ बुनियादी पार्सर कोड लिख रहा हूं, और मैं आरएफसी को पढ़ रहा हूं कि यह सुनिश्चित करने के लिए कि जितना संभव हो सके विनिर्देश के करीब सब कुछ कैसे करें।

से RFC882 धारा 3.1.1:

प्रत्येक हेडर फ़ील्ड ASCII वर्ण की एक एकल, तार्किक पंक्ति के रूप में देखी जा सकती है, एक जिसमें दुर्भाग्य से आरएफसी में एक बात यह है कि मुझे थोड़ी confuses है क्षेत्र का नाम और एक फील्ड-बॉडी। सुविधा के लिए, इस वैचारिक इकाई के फ़ील्ड-बॉडी हिस्से को एकाधिक-रेखा प्रतिनिधित्व में विभाजित किया जा सकता है; यह "फोल्डिंग" कहा जाता है। सामान्य नियम यह है कि जहां भी रैखिक-सफेद-स्थान (केवल एलडब्लूएसपी-वर्ण नहीं), एक सीआरएलएफ हो सकता है, इसके बाद तुरंत एक एलडब्लूएसपी-चार डाला जा सकता है। इस प्रकार, एकल लाइन

ठीक है, तो मैं बस एक हेडर फ़ील्ड पार्स और अगर एक CRLF रैखिक सफेद स्थान के साथ इस प्रकार है, मैं बस एक उपयोगी तरीके से उन एक भी शीर्ष लेख पंक्ति में परिणाम की concat। चलो आगे बढ़ना ...

RFC2045 धारा 5.1 से:

RFC 822 के संवर्धित BNF संकेतन में, इस प्रकार एक Content-Type हैडर क्षेत्र मूल्य परिभाषित किया गया है:

content := "Content-Type" ":" type "/" subtype 
      *(";" parameter) 
      ; Matching of media type and subtype 
      ; is ALWAYS case-insensitive. 

[ ...]

parameter := attribute "=" value 

attribute := token 
       ; Matching of attributes 
       ; is ALWAYS case-insensitive. 

value := token/quoted-string 

token := 1*<any (US-ASCII) CHAR except SPACE, CTLs, 
      or tspecials> 

ओका y। तो ऐसा लगता है अगर आप मानकों के साथ एक Content-Type हैडर निर्दिष्ट करना चाहते हैं, बस इसे इस तरह कार्य करें:

Content-Type: multipart/related; foo=bar; something=else 

... और एक ही शीर्ष लेख का एक मुड़ा हुआ संस्करण इस प्रकार दिखाई देगा:

Content-Type: multipart/related; 
    foo=bar; 
    something=else 

सही बात? अच्छा। जैसा कि मैंने RFC के पढ़ने रखा, मैं RFC2387 धारा 5.1 (उदाहरण) में निम्नलिखित में आए:

Content-Type: Multipart/Related; boundary=example-1 
     start="<[email protected]>"; 
     type="Application/X-FixedRecord" 
     start-info="-o ps" 

--example-1 
Content-Type: Application/X-FixedRecord 
Content-ID: <[email protected]> 

[data] 
--example-1 
Content-Type: Application/octet-stream 
Content-Description: The fixed length records 
Content-Transfer-Encoding: base64 
Content-ID: <[email protected]> 

[data] 

--example-1-- 

हम्म, यह अजीब है। क्या आप Content-Type शीर्षलेख देखते हैं? इसमें कई पैरामीटर हैं, लेकिन सभी के पास ";" नहीं है पैरामीटर डिलीमीटर के रूप में।

हो सकता है कि मैं सिर्फ RFC के सही ढंग से पढ़ा नहीं था, लेकिन मेरी पार्सर सख्ती से विनिर्देश परिभाषित करता है की तरह काम करता है, type और start-info मापदंडों एक एकल स्ट्रिंग या बुरा, एक पार्सर त्रुटि में परिणाम होगा।

दोस्तों, इस पर आपका क्या विचार है? आरएफसी में सिर्फ एक टाइपो? या किसी को याद किया था?

धन्यवाद!

+0

ऐसे मानकों के साथ काम करते समय, आउटपुट लिखते समय इनपुट पढ़ने और सख्त होने पर आपको सहिष्णु रहना चाहिए। – Gumbo

+1

यह उदाहरणों में एक टाइपो है। पैरामीटर को हमेशा अर्धविरामों के साथ सीमित किया जाना चाहिए, भले ही फोल्ड किया जाए। फोल्डिंग हेडर के अर्थशास्त्र को बदलने के लिए नहीं है, केवल पठनीयता की अनुमति देने के लिए और लाइन लम्बाई प्रतिबंधों वाले सिस्टम के लिए खाते हैं। –

+1

@ रेमी लेबेउ: आप इसे उत्तर के रूप में क्यों नहीं पोस्ट करते हैं, इसलिए मैं इसे स्वीकार कर सकता हूं? मैंने आरएफसी के मूल लेखक से संपर्क करने की कोशिश की, लेकिन उन्होंने अब तक जवाब नहीं दिया। – BastiBen

उत्तर

14

यह है उदाहरणों में एक टाइपो। पैरामीटर को हमेशा अर्धविरामों के साथ सीमित किया जाना चाहिए, भले ही फोल्ड किया जाए। फोल्डिंग हेडर के अर्थशास्त्र को बदलने के लिए नहीं है, केवल पठनीयता की अनुमति देने के लिए और लाइन लम्बाई प्रतिबंधों वाले सिस्टम के लिए खाते हैं।

+2

बिल्कुल एक टाइपो। यहां बीएनएफ है: 'सामग्री: =" सामग्री-प्रकार "": "प्रकार"/"उप प्रकार * ("; "पैरामीटर)'। http://tools.ietf.org/html/rfc2045#section-5.1। –

1

काफी संभवतः एक टाइपो, लेकिन सामान्य रूप से (और अनुभव से) आप इस तरह की चीज़ "जंगली में" को संभालने में सक्षम होना चाहिए। विशेष रूप से, मेल क्लाइंट मान्य संदेशों पैदा करते हैं और प्रासंगिक विनिर्देशों के सभी का पालन करने की क्षमता में अलग-अलग हो बेतहाशा (की तुलना में यह WWW दुनिया है अगर कुछ भी, यह ई-मेल/एसएमटीपी दुनिया में और भी बदतर है!)

+0

मेरे पास केवल कुछ हद तक सिस्टम से हैंडल एमआईएम डेटा है और उनमें से अधिकांश वैध एमआईएम संरचनाएं उत्पन्न करते हैं। लेकिन मैं अपने एमआईएम पार्सर को जीपीएल या बीएसडी लाइसेंस के तहत जारी करने पर विचार कर रहा हूं ताकि हर कोई इसका इस्तेमाल भी कर सके। – BastiBen