2015-05-11 1 views
0

У меня есть следующая проблема: я пытаюсь уловить ответ HTTP 500 с сервера, но перехват не получает ответ 500. Это порождается IMG SRC вызова несанкционированном URL (технически сервер должен быть возвращающей 4xx, но она возвращает 5xx -> свой 3-й сервер партииПочему мой запрос об ошибке HTTP не вызывается при вызове img ng-src?

Update 2:. Мой перехват с отказом HTTP называется, если я делаю прямой $ http.get, но он не вызывается, если http get неявно вызывается img ng-src или img-src. Забавная часть - это мой перехват httptimeout, но ответный перехват ответа никогда не вызывается. Как это решить?

Обновление 1: Я добавил скриншот ошибки 500, которая была получена моим браузером через веб-инспектора, но не была промежуточной pted. Посмотрите на конец.

код

перехватчик:

.factory('timeoutHttpIntercept', function ($rootScope, $q) { 
      //console.log("*** HTTP INTERCEPTOR CALLED ***"); 
      return { 
       'request': function (config) { 
        config.timeout = 15000; 
        //console.log("*** HTTP INTERCEPTOR CALLED ***"); 
        return config; 
       } 


      }; 
     }) 

.factory ('httpAuthIntercept', function ($rootScope, $q) 
{ 
    return { 
    requestError: function (response) { 
     console.log ("**** REJECT REQUEST: "+JSON.stringify(response)); 
     return $q.reject(response); 
    }, 

    responseError: function (response) { 
     console.log ("**** REJECT RESPONSE: "+JSON.stringify(response)); 
     return $q.reject(response); 
    }, 
    response: function (response) 
     { 
      console.log("*******RESPONSE with status: "+response.status+"****************"); 
      if (response.status == 500) 
      { 
      console.log ("**** RESPONSE: "+JSON.stringify(response)); 
      } 
       return (response); 
     } 
    }; 
}) 

Далее следуют, в .config:

$httpProvider.interceptors.push('timeoutHttpIntercept'); 
$httpProvider.interceptors.push('httpAuthIntercept'); 

Теперь в моем шаблоне я звоню следующий код:

<img ng-src="{{LoginData.url}}/cgi-bin/zms?mode=jpeg&amp;monitor={{monitorId}}&maxfps=3&buffer=1000&auth=1234&rand={{rand}}" width="100%" />

выше срабатывает ответ 500. Я вижу журналы сервер генерации этого, а также:

Starting capture on eth0 interface 
2015-05-11 05:12:44 xx.xx.xx.xx 192.168.1.13 > GET <server.com> /cgi-bin/zms?mode=jpeg&monitor=1&maxfps=3&buffer=1000&auth=1234&rand=116426 HTTP/1.1 - 
2015-05-11 05:12:44 192.168.1.13 xx.xx.xx.xx < - - - HTTP/1.1 500 Internal Server Error 

Но по какой-то причине, авторизация перехватывать не улавливать это 500. Если удалить 500 проверки в Идент перехвате, я могу видеть его захват успешных ответов с 200 ОК.

Что я делаю неправильно?

500 скриншот Ответ принимается -> Веб-инспектор Safari:

500 error being received

Благодарности

+0

Вы должны сделать 500 проверок статуса в 'responseError', а не в' response' – harishr

+0

entre, моя проблема - responseError никогда не вызывается, когда сервер возвращает 500 & фактически, и не вызван обработчик ответа. – user1361529

+0

затем попробуйте 'requestError', кажется, что ваш запрос не доходит до сервера, или ваш перехватчик не зарегистрирован. – harishr

ответ

0

Будет angularjs версию вы используете? если его < 1,3 может быть стоит пытаться подталкивая перехватчик к $httpProvider.responseInterceptors вместо этого на $httpProvider

app.factory('MyHttpInterceptor', function($q) { 
     return function (promise) { 
      return promise.then(function (response) { 
       return response; 
      }, 
      function (response) { 
       if (response.status === 500) { 
        // you should hit this for HTTP 500 
       } 
       return $q.reject(response); 
      }); 
     }; 
    }); 


app.config(function ($routeProvider, $httpProvider) { 

    // rest of the config code 

    $httpProvider.responseInterceptors.push('MyHttpInterceptor'); 
}) 

другой реализации

app.factory('MyHttpInterceptor', ['$q', function ($q) { 
    function success(response) { 
     // all good 
    return response; 
    } 
    function error(response) { 
     var status = response.status; 
     if (status == 500) { 
      return; 
     } 
     // otherwise 
     return $q.reject(response); 
    } 
    return function (promise) { 
     return promise.then(success, error); 
    } 
}]); 
+0

Chintana, спасибо. Я использую 1.3.15. Это довольно запутанно - мой ответный перехватчик вызывается для 200 ответов, только не для 500 (я не знаю, будет ли вызвано для 4xx, поскольку сервер не отправляет 4xx). Я даже вижу 500 внутренних серверов через веб-консоль в Safari - так что ответ получен, но не перехвачен – user1361529

+0

Я также добавил моментальный снимок ответа 500, получаемого клиентским браузером, если это помогает – user1361529

+0

странно. По какой причине, я включил другую реализацию перехватчика. Пожалуйста, взгляните на нее и посмотрите, работает ли она на вас - cheers –

0

У меня была аналогичная проблема.

Мой ответ Метод устранения перехватчика не был вызван после создания ошибки 500 с помощью Fiddler (прокси). В fiddler вы можете создавать свои собственные ответы для определенных файлов. Проблема как-то была в моем собственном созданном ответе. Не знаю, где проблема. Но после того, как я скопировал один из ответов allready в Fiddler, я получил метод responseError.

Возможно, ответ, который вы получаете с сервера третьей стороны, некорректен.

Если вы хотите попробовать Fiddler. В папке програмной у вас есть определенные ResponseTemplates C: \ Program Files \ Fiddler2 \ ResponseTemplates

Скопирован «502_unreachable.dat» в «500_servererror.dat» и только изменил код ответа 500 и левое тело ответа нетронутый.

перезапустил Fiddler, и я мог применить свой новый созданный ответ Fiddler как автоответчик. И да, это вызвало метод responseError.

Смежные вопросы