13

निम्नलिखित पार मूल पोस्ट अनुरोध नहीं होना चाहिए preflighted है। डब्ल्यू 3 सी स्पेक के मुताबिक, जब तक कि मैं इसे गलत नहीं पढ़ रहा हूं, इसे प्रीफलाइट नहीं किया जाना चाहिए। मैंने पुष्टि की है कि यह क्रोम 27 और फ़ायरफ़ॉक्स 10.8.3 में होता है। मैंने किसी अन्य ब्राउज़र का परीक्षण नहीं किया है। लगता है बहुत स्पष्टCORS अनुरोध preflighted है, लेकिन ऐसा लगता है बहुखण्डीय/फार्म-डेटा और केवल सरल हैडर की सामग्री प्रकार के साथ जैसे कि यह

Request URL:http://192.168.130.135:8081/upload/receiver 
Request Method:OPTIONS 
Status Code:200 OK 
Request Headersview source 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:origin, content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:192.168.130.135:8081 
Origin:http://192.168.130.135:8080 
Referer:http://192.168.130.135:8080/test/raytest-jquery.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36 

कल्पना:

यहाँ अनुरोध हेडर, आदि कर रहे हैं:

Request URL:http://192.168.130.135:8081/upload/receiver 
Request Method:POST 
Status Code:200 OK 
Request Headersview source 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:27129 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryix5VzTyVtCMwcNv6 
Host:192.168.130.135:8081 
Origin:http://192.168.130.135:8080 
Referer:http://192.168.130.135:8080/test/raytest-jquery.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36 

और यहाँ विकल्प (preflight) अनुरोध है

अद्यतन:

var xhr = new XMLHttpRequest(), 
    formData = new FormData(); 

formData.append('myfile', someFileObj); 

xhr.upload.progress = function(e) { 
    //insert upload progress logic here 
}; 

xhr.open('POST', 'http://192.168.130.135:8080/upload/receiver', true); 
xhr.send(formData); 

क्या किसी को पता है कि क्यों इस preflighted किया जा रहा है: यहाँ कुछ सरल क्लाइंट-साइड कोड है कि इस पुन: पेश करेंगे?

उत्तर

18

मैं इस यह पता लगाने की (के बाद किए जाने पर उसे उपयोगी हिट उपज नहीं था) की कोशिश में वेबकिट स्रोत कोड बाहर की जाँच के समाप्त हो गया। यह पता चला है कि यदि आप onprogress ईवेंट हैंडलर पंजीकृत करते हैं तो वेबकिट किसी भी क्रॉस-मूल अनुरोध को पूर्व-प्रकाशित करने के लिए मजबूर करेगा। मुझे पूरी तरह से यकीन नहीं है, कोड टिप्पणियों को पढ़ने के बाद भी, यह तर्क क्यों लागू किया गया था।

XMLHttpRequest.cpp में:

void XMLHttpRequest::createRequest(ExceptionCode& ec) 
{ 
    ... 

    options.preflightPolicy = uploadEvents ? ForcePreflight : ConsiderPreflight; 

    ... 

    // The presence of upload event listeners forces us to use preflighting because POSTing to an URL that does not 
    // permit cross origin requests should look exactly like POSTing to an URL that does not respond at all. 
    // Also, only async requests support upload progress events. 
    bool uploadEvents = false; 
    if (m_async) { 
     m_progressEventThrottle.dispatchEvent(XMLHttpRequestProgressEvent::create(eventNames().loadstartEvent)); 
     if (m_requestEntityBody && m_upload) { 
      uploadEvents = m_upload->hasEventListeners(); 
      m_upload->dispatchEvent(XMLHttpRequestProgressEvent::create(eventNames().loadstartEvent)); 
     } 
    } 

    ... 
} 


अद्यतन: फ़ायरफ़ॉक्स वेबकिट रूप में एक ही तर्क लागू होता है, ऐसा लगता है।

nsresult 
nsXMLHttpRequest::CheckChannelForCrossSiteRequest(nsIChannel* aChannel) 
{ 
    ... 

    // Check if we need to do a preflight request. 
    nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aChannel); 
    NS_ENSURE_TRUE(httpChannel, NS_ERROR_DOM_BAD_URI); 

    nsAutoCString method; 
    httpChannel->GetRequestMethod(method); 
    if (!mCORSUnsafeHeaders.IsEmpty() || 
     (mUpload && mUpload->HasListeners()) || 
     (!method.LowerCaseEqualsLiteral("get") && 
     !method.LowerCaseEqualsLiteral("post") && 
     !method.LowerCaseEqualsLiteral("head"))) { 
     mState |= XML_HTTP_REQUEST_NEED_AC_PREFLIGHT; 
    } 

    ... 
} 

सूचना सशर्त की mUpload && mUpload->HasListeners() भाग: यहाँ nsXMLHttpRequest.cpp से प्रासंगिक कोड है।

वेबकिट और Firefox (और संभवतः अन्य) की तरह लगता है उनके preflight-निर्णय कोड में कुछ तर्क यह है कि W3C कल्पना द्वारा मंजूर नहीं है डाला है। अगर मुझे कल्पना में कुछ याद आ रहा है, तो कृपया टिप्पणी करें।

+0

यह एक अद्भुत खोज है! प्रीफलाइट ट्रिगर करने के लिए क्लाइंट-साइड कोड के लिए यह अजीब है; इसके बारे में कल्पना में कुछ भी नहीं है। इसके अलावा टिप्पणी चीजों को स्पष्ट नहीं बनाती है। मैं इसे स्पष्टीकरण के लिए वेबकिट बोर्डों पर लाने की सलाह दूंगा। – monsur

+0

@ मॉन्सूर मुझे संदेह है कि यह तर्क वेबकिट तक सीमित नहीं है। फ़ायरफ़ॉक्स का उपयोग करते समय भी मैं एक ही मुद्दे में भाग गया। मैंने अभी तक आईई 10 का परीक्षण नहीं किया है। मैं फ़ायरफ़ॉक्स स्रोत पर भी एक झांक लेने का इरादा रखता हूं और देखता हूं कि मैं अपने संदेह की पुष्टि कर सकता हूं या नहीं। –

+0

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

1

मेरा अनुमान है कि Content-Type हैडर पर "सीमा" समस्या आ रही है है। यदि आप इसे पुन: उत्पन्न करने में सक्षम हैं, तो इसे ब्राउज़र बग के रूप में दायर किया जाना चाहिए, क्योंकि spec का कहना है कि Content-Type शीर्षलेख जांच पैरामीटर को बहिष्कृत करना चाहिए।

+0

यह मेरा प्रारंभिक संदेह था, लेकिन यह तब और अधिक भयावह है। मैंने अभी वेबकिट स्रोत की जांच की है, और यह पता लगाया कि यह क्यों हो रहा है। मैं अपना उत्तर समुदाय विकी के रूप में पोस्ट करूंगा। –

संबंधित मुद्दे