<!doctype html>
<html>
	<head> 
		<title>Request Recover Example</title>
       	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
       	<style>
       		body, textarea {
       			font-family: 'Lucida Grande';
				font-size: 13px;
				color: black;
       		}
       		.result {
       			color: blue;
       		}
       		.code-block {
       			margin-top: 20px;
       		}
       		.code-block textarea {
		       	border: none;
				background-color: white;
				resize: none;
				width: 100%;
				height: 800px;
			}
       	</style>
	</head>

	<body ng-app="request-recover-example">
		<div ng-controller="ExampleController" class="result">
			Request <span ng-bind="requestStatus"></span>.
			<span ng-if="isRecovered">(Request was recovered)</span>
		</div>

		<div class="code-block">
			Code:
			<textarea disabled="true">
<!doctype html>
<html>
	<head> 
		<title>Request Recover Example</title>
       	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
	</head>

	<body ng-app="request-recover-example">
		<div ng-controller="ExampleController" class="result">
			Request <span ng-bind="requestStatus"></span>.
			<span ng-if="isRecovered">(Request was recovered)</span>
		</div>

		<script type="text/javascript">
		var module = angular.module('request-recover-example', []);
		module.factory('requestRejector', ['$q', function($q) {
		    var requestRejector = {
		        request: function(config) {
		            return $q.reject('requestRejector');
		        }
		    };
		    return requestRejector;
		}]);
		module.factory('requestRecoverer', ['$q', '$rootScope', function($q, $rootScope) {
		    var requestRecoverer = {
		        requestError: function(rejectReason) {
		        	if (rejectReason === 'requestRejector') {
		        		$rootScope.isRecovered = true;
		        		// Recover the request
		        		return {
		        			transformRequest: [],
		        			transformResponse: [],
		        			method: 'GET',
		        			url: 'https://api.github.com/users/naorye/repos',
		        			headers: {
		        				Accept: 'application/json, text/plain, */*'
		        			}
		        		};
		        	} else {
		        		return $q.reject(rejectReason);
		        	}
		        }
		    };
		    return requestRecoverer;
		}]);
		module.config(['$httpProvider', function($httpProvider) {
		    $httpProvider.interceptors.push('requestRejector');
		    // Removing 'requestRecoverer' will result to failed requesr 
		    $httpProvider.interceptors.push('requestRecoverer'); 
		}]);

		module.controller('ExampleController', ['$scope', '$http', function($scope, $http) {
			$scope.requestTime = '[waiting]';
			$http.get('https://api.github.com/users/naorye/repos').then(function() {
			    $scope.requestStatus = 'success';
			}, function(rejectReason) {
				$scope.requestStatus = 'failure due to ' + rejectReason;
			});
		}]);
		</script>
	</body>
</html>
			</textarea>
		</div>

		<script type="text/javascript">
		var module = angular.module('request-recover-example', []);
		module.factory('requestRejector', ['$q', function($q) {
		    var requestRejector = {
		        request: function(config) {
		            return $q.reject('requestRejector');
		        }
		    };
		    return requestRejector;
		}]);
		module.factory('requestRecoverer', ['$q', '$rootScope', function($q, $rootScope) {
		    var requestRecoverer = {
		        requestError: function(rejectReason) {
		        	if (rejectReason === 'requestRejector') {
		        		$rootScope.isRecovered = true;
		        		// Recover the request
		        		return {
		        			transformRequest: [],
		        			transformResponse: [],
		        			method: 'GET',
		        			url: 'https://api.github.com/users/naorye/repos',
		        			headers: {
		        				Accept: 'application/json, text/plain, */*'
		        			}
		        		};
		        	} else {
		        		return $q.reject(rejectReason);
		        	}
		        }
		    };
		    return requestRecoverer;
		}]);
		module.config(['$httpProvider', function($httpProvider) {
		    $httpProvider.interceptors.push('requestRejector');
		    // Removing 'requestRecoverer' will result to failed request
		    $httpProvider.interceptors.push('requestRecoverer'); 
		}]);

		module.controller('ExampleController', ['$scope', '$http', function($scope, $http) {
			$scope.requestTime = '[waiting]';
			$http.get('https://api.github.com/users/naorye/repos').then(function() {
			    $scope.requestStatus = 'success';
			}, function(rejectReason) {
				$scope.requestStatus = 'failure due to ' + rejectReason;
			});
		}]);
		</script>
	</body>
</html>