• 0

JQuery, XmlHttpRequest, the OPTIONS verb and Mr. Preflight


Question

Even confident developers get stuck sometimes!

I've recently been doing some Cross-domain javascript using JSONP, and ASP.NET MVC.

The particular Controller action will only respond to a POST request, this is by design.

In IE8, I can see (via Fiddler2) that the response is correct, and returning a HTTP 200 response, along with the JSONP javascript.

In Firefox, Safari and Chrome, the response is still being returned, with the appropriate HTTP 200 code and JSONP content, the only difference is that the XmlHttpRequest object being used by JQuery is setting the status code to 0, and the responseText to empty.

Originally, I thought this was due to COR HTTP Preflighting (Http Access Control), whereby a custom header or a content-type other than text/plain would cause an additional HTTP request (with an OPTIONS) verb to be sent to the server. I can see in Fiddler2 that the OPTIONS request is being responded to with a HTTP 404.

The web server is IIS7 (but the production web server will be an IIS6 box). In IIS7, I can see the standard OPTIONSVerbHandler listed in the handlers, but I'm not convinced this is actually doing anything (in fact, I can't even find any documentation about the OPTIONSVerbHandler anywhere).

To get round this, I modifed the JQuery library to not set the custom header, and change the content-type to text/plain instead of application/json, and Firefox finally starts bypassing the OPTIONS request, and just plain POSTs.

The problem still lies in an empty response (according to the XmlHttpRequest object), even though Fiddler2 shows that a successful HTTP 200 response, with content is being returned.

Any help?

7 answers to this question

Recommended Posts

  • 0

It appears to be part of the design of the jQuery library. Checking through the source (v1.3.2), it only does a JSONP callback via the script tag with the Http type set to GET (which actually makes sense), switching to a GET instead of POST resolves the issue.

  • 0
It appears to be part of the design of the jQuery library. Checking through the source (v1.3.2), it only does a JSONP callback via the script tag with the Http type set to GET (which actually makes sense), switching to a GET instead of POST resolves the issue.

Good to know. I'll jot that one down. :)

  • 0
Even confident developers get stuck sometimes!

I've recently been doing some Cross-domain javascript using JSONP, and ASP.NET MVC.

The particular Controller action will only respond to a POST request, this is by design.

In IE8, I can see (via Fiddler2) that the response is correct, and returning a HTTP 200 response, along with the JSONP javascript.

In Firefox, Safari and Chrome, the response is still being returned, with the appropriate HTTP 200 code and JSONP content, the only difference is that the XmlHttpRequest object being used by JQuery is setting the status code to 0, and the responseText to empty.

Originally, I thought this was due to COR HTTP Preflighting (Http Access Control), whereby a custom header or a content-type other than text/plain would cause an additional HTTP request (with an OPTIONS) verb to be sent to the server. I can see in Fiddler2 that the OPTIONS request is being responded to with a HTTP 404.

The web server is IIS7 (but the production web server will be an IIS6 box). In IIS7, I can see the standard OPTIONSVerbHandler listed in the handlers, but I'm not convinced this is actually doing anything (in fact, I can't even find any documentation about the OPTIONSVerbHandler anywhere).

To get round this, I modifed the JQuery library to not set the custom header, and change the content-type to text/plain instead of application/json, and Firefox finally starts bypassing the OPTIONS request, and just plain POSTs.

The problem still lies in an empty response (according to the XmlHttpRequest object), even though Fiddler2 shows that a successful HTTP 200 response, with content is being returned.

Any help?

Thread bump!

Would you mind showing me how you modified jquery to not send the OPTIONS verb in Firefox? I have the same problem as you did. Either that, or getting IIS to understand the OPTIONS verb

  • 0

Hi,

The modification was actually not required. When you make a JSONP call, it actually achieves the cross-domain transparency by creating a new SCRIPT element on the page. Because you can't make a POST call from a SCRIPT element (it's only ever a GET), simply changing your POST to a GET will stop Firefox sending the OPTIONS header ahead for validation.

  • 0
Hi,

The modification was actually not required. When you make a JSONP call, it actually achieves the cross-domain transparency by creating a new SCRIPT element on the page. Because you can't make a POST call from a SCRIPT element (it's only ever a GET), simply changing your POST to a GET will stop Firefox sending the OPTIONS header ahead for validation.

So you're saying a cross domain POST is impossible using jQuery? My issue is that using a GET, I have to put the parameters in the querystring which I didn't want to do as that stuff will not be encrypted. (I was planning on POST'ing to an HTTPS site with authentication info). While developing I hosted the webservice on the same site and I was able to POST to it using $.post and sending the result to a callback. Now that it's been tested I moved the webservice over to HTTPS and herein lies the problem.

  • 0
So you're saying a cross domain POST is impossible using jQuery? My issue is that using a GET, I have to put the parameters in the querystring which I didn't want to do as that stuff will not be encrypted. (I was planning on POST'ing to an HTTPS site with authentication info). While developing I hosted the webservice on the same site and I was able to POST to it using $.post and sending the result to a callback. Now that it's been tested I moved the webservice over to HTTPS and herein lies the problem.

There is the problem though. You can't do a POST from a SCRIPT element. The browser will see the url that is set as it's source, and do a GET request on that, just like it would in any other resource (such as other SCRIPTS and LINKS [stylesheets]). The thing which will confuse many people, is that because they are actually doing the JSONP action via JQuery's ajax call, they assume its being done via XmlHttpRequest. It's not actually doing this, it's simply telling the browser there is another script to load. The way JSONP works, is that you pass a callback function name to whatever service you are dynamically calling, and that service has to wrap the JSON serialised data in that function call which allows it to evaluated at the client browser, e.g.:

GET http://somedomain.com/someservice/getMeSom...back=function01

Which should return it's serialised data something akin to:

function01({ data: { name = "Test", age = 25 }});

The browser succesfully returns that data because its a GET request across domains (which is allowed), and executes that function 'function01'.

Now, with the JSONP datatype, jquery automatically generates that callback function and name (this is overridable) and transparent handles this for you.

Unforetunately, you can't do this via POST. Hope that clears up the confusion somewhat.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Louis Rossmann suing Samsung over "990 Pro SSD warranty scam" by Sayan Sen Back in 2023, if you recall, Neowin reviewer Robbie Khan had a dispute with Samsung over his 990 Pro SSD, which was rapidly losing its health. After significant back and forth, the tech giant had finally released firmware to "stop" the issue. Interestingly, its previous flagship at the time, the 980 Pro was also facing problems leading to two consecutive sets of firmware fixes. Three years later, it looks like a similar conflict has now broken out between tech repair entrepreneur YouTuber Louis Rossmann and Samsung, as it has escalated into a threatened lawsuit after the company allegedly refused to appropriately replace a failing 990 Pro SSD that remained under warranty. According to Rossmann, a 4TB Samsung 990 Pro NVMe SSD purchased for approximately $330 less than two years ago, began experiencing major hiccups and issues, even though he claims it had been operated under ideal cooling conditions. It was installed in a RAID 1 array and cooled by a heatsink and dual high-speed fans. However the drive reportedly started dropping out of the array, exhibiting controller-level failures that eventually became not useable in any meaningful way. Rossmann said Samsung’s support process was marked by delays and confusion from the very start. After initially contacting the wrong regional support channel, he was redirected to Samsung’s memory support division where he submitted detailed diagnostics, logs, and proof of purchase. Rossmann runs a repair company and owns an ACE Lab PC-3000 machine, which is a professional-grade data recovery equipment. As such, he had been confident in his diagnostics. Samsung even seemingly acknowledged that later. Regardless, Rossmann claims that his initial support ticket was automatically closed before a full 24-hour response window had elapsed, forcing him to reopen the case and resubmit documentation. The controversy however intensified further from here after Samsung accepted the drive for warranty evaluation but later returned it with a repair report stating that the drive had passed its testing and that the SSD had been verified as functional. Rossmann strongly disputed those claims citing that his own independent testing on PC-3000 showed write speeds reducing to as low as 40–60 MB/s before the drive failed entirely. Samsung subsequently informed him that the SSD had been reset and reflashed, passing internal stress tests. However, the company also stated that replacement units were unavailable due to an industry-wide memory shortage and suggested that a refund process could be initiated if further testing confirmed the fault. Thus, to settle, the company offered a refund of $330, the amount that was initially paid by him to make the purchase. Here, Rossmann pointed out the seeming hypocrisy of the tech giant as in how no Samsung drive was apparently allocated for warranty replacements, but they were abundantly available for retail sales especially when using business accounts. As you can see, Rossmann is indeed right, there are Samsung 990 Pro 4TB SSDs on Amazon currently for $950 (shipped and sold by first-party Amazon US itself), and they are also available on Samsung's own store too, albeit for an even higher price of $1100. Thus Rossmann argues that Samsung’s inability or unwillingness to provide a replacement while the same model remains available for purchase at significantly higher market prices reflects a failure to honor its warranty obligations. He has issued a formal 60-day notice and says he intends to file suit in Texas small claims court, asserting that companies should face greater costs for denying legitimate warranty claims than for fulfilling them. You can check out the full video titled "Samsung's 990 Pro SSD warranty policy is a scam; I'm taking them to court," at the link below. Source and image: Louis Rossmann (YouTube) As an Amazon Associate we earn from qualifying purchases
    • Was it too much to ask to show the icon in this article?
    • Frankly, I blame whoever is writing such articles. "A big improvement/update and/or new feature is now available to everyone! Also, use this unofficial tweak tool to enable it because it actually isn't available to you yet officially and might not in fact even be entirely ready or whatever, hence why it is perhaps not enabled for you*. But it's great and you should enable it!" I mean there's nothing wrong with sharing info about some feature you might need to enable via unofficial means, of course. It's just that these articles tend to essentially end up being two news pieces in one, and one of them tends to be a bit misleading. (*Yes, yes, the "it's a controlled rollout!" thing. Not a fan of that one either. The argument, not the actual rollout.)
    • Thank you. Will do. I read in the release notes that editor config might be at play here.
    • Actually, I think even Microsoft doesn't know how to control it
  • Recent Achievements

    • Week One Done
      davidbazooked earned a badge
      Week One Done
    • One Month Later
      Jamswaz earned a badge
      One Month Later
    • Week One Done
      Jamswaz earned a badge
      Week One Done
    • Rookie
      Marzoid went up a rank
      Rookie
    • Community Regular
      coch went up a rank
      Community Regular
  • Popular Contributors

    1. 1
      +primortal
      508
    2. 2
      PsYcHoKiLLa
      185
    3. 3
      +Edouard
      158
    4. 4
      Steven P.
      83
    5. 5
      ATLien_0
      75
  • Tell a friend

    Love Neowin? Tell a friend!