X-Git-Url: https://code.kerkeslager.com/?p=bigly;a=blobdiff_plain;f=src%2Fbigly%2Fviews.py;fp=src%2Fbigly%2Fviews.py;h=46bccd6cebd0e2f394dc756d62e2dcd58089f9a0;hp=0000000000000000000000000000000000000000;hb=c2f61845f8372b4796bf4d10da7f57f99ee933c7;hpb=747322073bd51466bf220a256fbb9a3e157cf0c9 diff --git a/src/bigly/views.py b/src/bigly/views.py new file mode 100644 index 0000000..46bccd6 --- /dev/null +++ b/src/bigly/views.py @@ -0,0 +1,55 @@ +from django.views.generic.base import TemplateView + +from rest_framework import status, viewsets +from rest_framework.response import Response +import requests + +from . import serializers + +class IndexView(TemplateView): + template_name = 'bigly/index.html' + +index = IndexView.as_view() + +class FollowRedirectsViewSet(viewsets.ViewSet): + serializer_class = serializers.FollowRedirectsSerializer + + def follow_redirects(self, request): + serializer = serializers.FollowRedirectsSerializer(data=request.query_params) + + if not serializer.is_valid(): + return Response( + serializer.errors, + status=status.HTTP_400_BAD_REQUEST, + ) + + link = serializer.data['link'] + + while True: + response = requests.head(link) + + # TODO Handle timeouts + + if 301 <= response.status_code and response.status_code <= 308: + # TODO Handle the different kinds of redirects correctly + + link = response.headers.get('Location') + + if not link: + # TODO Handle this + raise Exception() + + # TODO Handle error responses + else: + return Response( + { + 'link': link, + 'status': response.status_code, + }, + status=status.HTTP_200_OK, + ) + + +api_follow_redirects = FollowRedirectsViewSet.as_view({ + 'get': 'follow_redirects', +})