I am writing a website with Struts and Tomcat as the server.
On a page there's an ajax post request using jQuery (not cross-domain). The returned value is plain html.
The problem is, I sometimes (not always, not even frequent) get 412 (Precondition Failed) error. What could be the cause of this unstable error?
I'm posting an answer because I've just had this issue today. It's obviously an update to Mod Security in my case.
I was sending data to the server via AJAX and some Javascript which was part of this message caused the 412. It turned out to be the word HTML (I was passing element.innerHTML within the code)
ModSecurity treats that as a potential threat by the looks of it. For a quick fix I replaced all HTML strings with H%T%M%L and reversed the process on the server and it's now running.
You've probably long-since solved this but posting in case it's useful for anyone else.
Just today i was facing the same problem "412 Precondition Failed".
It is a Codeigntier app that uploads audio and Image files.
Till now a lot of files uploaded through the Ajax File uploader. But today i file was not uploading and through chrome Inspect > Network i found that error 412 Precondition Failed.
I re-uploaded the file so many file by changing my ajax script multiple times.
Suddenly some special character caught my attention. I renamed the file and tried to re-upload. Trust me it worked.
Before:
AFTER:
I don't have proper explanation but it works for me.
Thanks
I've added my code to pastebin at the following address:
http://pastebin.com/L03zGPhS
The service is up and running.
I can invoke it. I am additionally using firebug and getting the following results on the POST:
POST http://localhost:51204/AddrService.asmx/GetZipCode
15ms
HeadersPostResponse
JSON
zip
"40"
Source
{'zip': '40' }
Showing the service function:
[WebMethod]
public List<Zip> GetZipCode(string zip)
I can get this to work with jQuery 1.4.2, but I'm upgrading a lot of jQuery widgets to 1.8 and can't get the autocomplete to work. Am I missing something they changed in the AJAX autocomplete call. Documentation to a correct answer will suffice if it is useful.
UPDATE I found through Google Chrome that I'm getting a 500 error. I'm not certain why because I'm hitting localhost on both the service and the aspx page. Does anybody know if they changed something that would affect the security of hitting localhost, or if I could have possibly left out and important jQuery reference that would let autocomplete work for 1.4 but not 1.8?
Maybe this sheds light on your problem — the autocomplete API states that :
"You must always call the response callback even if you encounter an
error. This ensures that the widget always has the correct state."
(source : http://api.jqueryui.com/autocomplete/#option-source)
I'm not sure if I'm right or not but it seems that Eclipse PDT + Zend Debugger have problems when it comes to debugging Ajax projects. I'm working on a project in which all of the requests are passed through a single PHP file (even resource requests like downloading images). And when I want to start a debug session in Eclipse after the first request returns successfully, second forth requests return the following error message:
A communication error occurred with the Zend Studio debugger due
to an unfinished debug session. Uncaught SyntaxError: Unexpected token
<
To reload the page click Refresh
It seems to me that since the first request is keeping the Zend Server busy, the second forth requests can not make a successful connection to it. It's in the case that I've configured the Eclipse so it won't stop at the first line of every page but still no luck.
Does this mean that in PHP + Ajax projects which requests are sent freely, it is impossible to debug? Has anyone tested this and/or the xdebug in a similar scenario?
Regards,
I just wanted to let my fellow developers to know that the same problem DOES NOT exist when I switched to xdebug.
I have a web application that crashes on ajax requests with google chrome (it works with every other web browser it was tested it). After debugging I found that the error is caused by response.responseText being undefined. The xhr object looks like this:
argument: undefined
isAbort: false
isTimeout: undefined
status: 0
statusText: "communication failure"
tId: 3
In debugger in the 'network' tab I get "(failed)", however all the headers are there and I can even copy into clipboard the response body (which is a valid JSON).
My question is - how can I debug this problem? Where to find additional information, what causes this request to fail?
I finally found the solution to my problem : AdBlocks, when it blocks an ajax request, it just says "communication failure".
The first thing I would double-check is that the data coming back from the response is valid JSON. Just pass it through a JSON validator like this online JSONLint: http://jsonlint.com/
I assume that you are using something like jQuery to make your AJAX requests. If so, then make sure that you are using the development version of that library. Now that you are using the development version (uncompressed) of the script, find the particular function that you are using (eg. $.ajax) and then, within the Chrome inspector, insert a breakpoint in the code where the AJAX response is first handled (eg. https://github.com/jquery/jquery/blob/master/src/ajax.js#L579). Then proceed to step through the code, inspecting various return-values to see exactly what is going wrong.
If you are not using something like jQuery to make AJAX calls, then I'd recommend using a framework to avoid possible cross-browser compatibility issues like you might be experiencing right now.
For some reason, while using AJAX (with my dashcode developed application) the browser just stops uploading and returns status codes of 0. Why does this happen?
Another case:
It could be possible to get a status code of 0 if you have sent an AJAX call and a refresh of the browser was triggered before getting the AJAX response. The AJAX call will be cancelled and you will get this status.
In my experience, you'll see a status of 0 when:
doing cross-site scripting (where access is denied)
requesting a URL that is unreachable (typo, DNS issues, etc)
the request is otherwise intercepted (check your ad blocker)
as above, if the request is interrupted (browser navigates away from the page)
Same problem here when using <button onclick="">submit</button>. Then solved by using <input type="button" onclick="">
Status code 0 means the requested url is not reachable. By changing http://something/something to https://something/something worked for me. IE throwns an error saying "permission denied" when the status code is 0, other browsers dont.
It is important to note, that ajax calls can fail even within a session which is defined by a cookie with a certain domain prefixed with www. When you then call your php script e.g. without the www. prefix in the url, the call will fail and viceversa, too.
Because this shows up when you google ajax status 0 I wanted to leave some tip that just took me hours of wasted time... I was using ajax to call a PHP service which happened to be Phil's REST_Controller for Codeigniter (not sure if this has anything to do with it or not) and kept getting status 0, readystate 0 and it was driving me nuts. I was debugging it and noticed when I would echo and return instead of exit the message I'd get a success. Finally I turned debugging off and tried and it worked. Seems the xDebug debugger with PHP was somehow modifying the response. If your using a PHP debugger try turning it off to see if that helps.
I found another case where jquery gives you status code 0 -- if for some reason XMLHttpRequest is not defined, you'll get this error.
Obviously this won't normally happen on the web, but a bug in a nightly firefox build caused this to crop up in an add-on I was writing. :)
This article helped me. I was submitting form via AJAX and forgotten to use return false (after my ajax request) which led to classic form submission but strangely it was not completed.
"Accidental" form submission was exactly the problem I was having. I just removed the FORM tags altogether and that seems to fix the problem. Thank you, everybody!
I had the same problem, and it was related to XSS (cross site scripting) block by the browser. I managed to make it work using a server.
Take a look at: http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0
We had similar problem - status code 0 on jquery ajax call - and it took us whole day to diagnose it. Since no one had mentioned this reason yet, I thought I'll share.
In our case the problem was HTTP server crash. Some bug in PHP was blowing Apache, so on client end it looked like this:
mirek#toccata:~$ telnet our.server.com 80
Trying 180.153.xxx.xxx...
Connected to our.server.com.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: our.server.com
Connection closed by foreign host.
mirek#toccata:~$
where test.php contained the crashing code.
No data returned from the server (not even headers) => ajax call was aborted with status 0.
In my case, it was caused by running my django server under http://127.0.0.1:8000/ but sending the ajax call to http://localhost:8000/. Even though you would expect them to map to the same address, they don't so make sure you're not sending your requests to localhost.
In our case, the page link was changed from https to http. Even though the users were logged in, they were prevented from loading with AJAX.
In my case, setting url: '' in ajax settings would result in a status code 0 in ie8.. It seems ie just doesn't tolerate such a setting.
For me, the problem was caused by the hosting company (Godaddy) treating POST operations which had substantial response data (anything more than tens of kilobytes) as some sort of security threat. If more than 6 of these occurred in one minute, the host refused to execute the PHP code that responded to the POST request during the next minute. I'm not entirely sure what the host did instead, but I did see, with tcpdump, a TCP reset packet coming as the response to a POST request from the browser. This caused the http status code returned in a jqXHR object to be 0.
Changing the operations from POST to GET fixed the problem. It's not clear why Godaddy impose this limit, but changing the code was easier than changing the host.
I think I know what may cause this error.
In google chrome there is an in-built feature to prevent ddos attacks for google chrome extensions.
When ajax requests continuously return 500+ status errors, it starts to throttle the requests.
Hence it is possible to receive status 0 on following requests.
In an attempt to win the prize for most dumbest reason for the problem described.
Forgetting to call
xmlhttp.send(); //yes, you need this pivotal line!
Yes, I was still getting status returns of zero from the 'open' call.
In my case, I was getting this but only on Safari Mobile. The problem is that I was using the full URL (http://example.com/whatever.php) instead of the relative one (whatever.php). This doesn't make any sense though, it can't be a XSS issue because my site is hosted at http://example.com. I guess Safari looks at the http part and automatically flags it as an insecure request without inspecting the rest of the URL.
In my troubleshooting, I found this AJAX xmlhttpRequest.status == 0 could mean the client call had NOT reached the server yet, but failed due to issue on the client side. If the response was from server, then the status must be either those 1xx/2xx/3xx/4xx/5xx HTTP Response code. Henceforth, the troubleshooting shall focus on the CLIENT issue, and could be internet network connection down or one of those described by #Langdon above.
In my case, I was making a Firefox Add-on and forgot to add the permission for the url/domain I was trying to ajax, hope this saves someone a lot of time.
Observe the browser Console while making the request, if you are seeing "The Same Origin Policy disallows reading the remote resource at http ajax..... reason: cors header ‘access-control-allow-origin’ missing" then you need to add "Access-Control-Allow-Origin" in response header. exa: in java you can set this like response.setHeader("Access-Control-Allow-Origin", "*") where response is HttpServletResponse.