1. Куча / Говнокод #21737

    −28

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    GET /file HTTP/1.0
    Host: site.com
    
    HTTP/1.1 302 Found
    Location: http://site.com

    Так вообще можно?

    Запостил: 3_14dar, 27 Ноября 2016

    Комментарии (67) RSS

    • Рвемся в сток!
      Ответить
    • Может, это вместо 404?
      Я у себя тоже такое запилил. Если страница не найдена, редиректит обратно на хост.
      Ответить
      • Кэп! Но представь себе, если какая-то программа попытается скачать файл. Не скачает ли она вместо этого глагне?
        Ответить
        • > HTTP/1.0
          > Host:

          Вы либо крестик снимите, либо трусы наденьте.
          Ответить
          • А в чем дело?
            Ответить
            • В стандартах. В HTTP/1.0 нет заголовка Host, проверь:
              https://tools.ietf.org/html/rfc1945#section-10

              Сервер может проигнорировать заголовок Host, если указан протокол HTTP/1.0. А может вообще послать куда подальше с кодом 400 Bad Request (ибо нестандартные заголовки должны начинаться с буквы X).

              Первоначально предполагалось, что одной паре IP:порт может соответствовать один сайт (как в FTP). Ни о каких хостах в запросе и не думали.

              Потом айпишников перестало хватать и стали думать, как это можно исправить. В HTTP/1.0 можно сделать запрос так:
              GET http://site.com/file HTTP/1.0

              А в HTTP/1.1 добавили заголовок Host:
              GET /file HTTP/1.1
              Host: site.com

              Причём Host теперь нужно указывать: https://tools.ietf.org/html/rfc2616#section-14.23

              Однако, если имя сервера можно вывести из URL, то заголовок Host пустой:
              GET http://site.com/file HTTP/1.1
              Host:

              Итак, Host — неотъемлемая часть HTTP/1.1.
              Ответить
              • > В HTTP/1.0 нет заголовка Host, проверь:
                О нет, Инканус заразился!
                Ответить
                • Ещё и от кого заразился - от пидара.
                  Мы не можем до конца исключать тот факт, что г. проверяющий - и есть инканус.
                  Ответить
                  • Да это прямо эпидемия: http://image.prntscr.com/image/75a9802f7cd64085873e10478b6cf724.png
                    Ответить
            • В общем, при указании протокола HTTP/1.0 сервер не может узнать имя хоста, если его нет в URL запроса (в той строчке, где GET). Он будет искать в конфиге сайт, который настроен по айпишнику, а не по домену, а заголовок Host проигнорирует.
              Ответить
              • Но работает же :)
                Ответить
                • Работает, если на айпишнике единственный сайт. Или если сервер вместо того, чтобы строго следовать RFC, читает заголовок Host и для HTTP/1.0 тоже.

                  А в общем случае можно обломаться.
                  Ответить
        • Глагне она скачает и в случае 404. Нужно смотреть код ответа.
          Ответить
          • Наркоман? Как она главную скачает, если 404?
            Ответить
            • .!.
              Ответить
            • Вот тебе человек правильно пишет, а что будет в случае 302?
              Ответить
              • Это мне вопрос? В случае 302 качнет главную. Не вижу в этом чего-то необычного. В интернете полно говеных сайтов.
                Ответить
                • Стертору, а вообще всем.
                  Как правильно делать такую вещь?
                  Ответить
                  • Какую?
                    Ответить
                    • Возвращать юзара на главную, но чтобы качалки не качали хрень вместо файла.
                      Ответить
                      • Ну я там ниже ответил, как делать надо. Еще жаваскриптом можно, но лучше рефрешем.
                        Ответить
                  • Подать прямую ссылку, избегая редиректов.
                    Если сервер не вернул 200, обнулить буфер и вернуть фолс.
                    Ответить
                    • Ой блядь, что ты несешь. Редиректы - это нормально и их надо обрабатывать.
                      Ответить
                      • Где их обрабатывать, мать твою? В процедуре для скачивания файла?
                        Сам хоть понимаешь, какой хуйню сморозил?
                        Ответить
                        • Везде, при любом хттп запросе. Если твоя дельфя не умеет в редиректы, то это проблемы твоей дельфи. Любой нормальный хттп клиент, включая вгет и питонячий urllib умеет.
                          Ответить
                          • При чем тут делфи?.. Обрабатывать редиректы нужно ВНЕ процедуры для скачивания, - так яснее? Процедуре нужно подать прямую ссылку, предварительно перейдя по всем редиректам и проверив ответ сервера.
                            Ответить
                            • Мне сложно обсуждать какую-то процедуру, которую ты сам откуда-то придумал. Иди на хуй.
                              Ответить
                              • UrlDownloadToFile. Это базовая API для скачивания файлов. Наверняка, даже твоя питонья либа ее вызывает - но после того, как все редиректы уже обработаны.
                                Ответить
                                • Нельзя сначала обработать все редиректы, потом звать какую-то функцию для "окончательного" урла. Потому что при запросе ты не знаешь, вернут тебе редирект или сразу нужный ресурс.
                                  Вообще, я не понял зачем ты стал говорить о какой-то ненужной процедуре. Мне это не интересно.
                                  Ответить
                                • фуфуфу
                                  это же моникер из кома
                                  Ответить
                      • но если тут обработать редирект ты скачаешь html вместо файла.
                        Ответить
                        • Ну так потому что сайт такой говеный. Говеный сайт и по ссылке site.com/file мог отдать хтмл с content-type text/html.
                          Ответить
                  • Корочи, если тебе надо на главную вместо страницы с ошибкой, то возвращаешь 404 с заголовком Refresh. Так бы и сказал, что это твой говнокод и ты не знаешь, как сделать нормально, и просишь помощи, пидар.
                    Ответить
                    • Это не мой говнокод и пидар твой папа, а мать - членодевка.

                      404 с http заголовком?
                      Ответить
                      • От балабол.
                        Ответить
                      • Да, 404 с хттп заголовком. На всякий случай поясню, что у хттп-ответа с любым кодом могут быть хттп-заголовки. А у ответов с кодом 404 может быть еще и тело. Это на случай, если ты думаешь, что 404 - это какая-то особая фигня, у которой не может быть заголовков.
                        Ответить
                        • Не епи моск, я знаю что у 404 могут быть заголовки, но то что заголовок refresh будет обрабатываться клиентом для меня новое.
                          Ответить
                          • Никогда не встречал "редирект для бедных"?
                            <meta http-equiv="refresh" content="0; URL=/gtfo.html">

                            Если почитать http://www.w3schools.com/tags/att_meta_http_equiv.asp
                            "The http-equiv attribute can be used to simulate an HTTP response header."

                            Заголовок Refresh вполне себе существует, и (по идее) должен обрабатываться если отдан сервером. Правда, ЕМНИП, он строго HTTP/1.0, но клиенты(читай - браузеры) часто закрывают на это глаза.

                            Я даже как-то делал говно-скринкаст на этом принципе - отдавал картинку с этим заголовком, и периодически сбрасывал в файл свежий скриншот.
                            Ответить
                      • И зря ты так про моих родителей.
                        Ответить
              • В любом случае, кроме 200, будет содержимое страницы. API для скачивания файлов слишком глупые, чтобы перейти по редиректу, это Вам не браузер.
                Ответить
                • "API для скачивания файлов" не существует. Есть библиотеки, предоставляющие функциональность HTTP-клиента, а они должны поддерживать не только редиректы, но и прочее, начиная с кукисов, и заканчивая Basic Auth и вариантами на тему Encoding.
                  Если не поддерживают, значит, либа говно.
                  Ответить
                  • @"API для скачивания файлов" не существует.
                    https://msdn.microsoft.com/en-us/library/ms775122%28v=vs.85%29.aspx
                    https://msdn.microsoft.com/en-us/library/ms775123%28v=vs.85%29.aspx

                    Она проверяет только код 404 (в этом случае вернет фолc). По редиректу не пойдёт.

                    @ Есть библиотеки, предоставляющие функциональность HTTP-клиента, а они должны поддерживать не только редиректы, но и прочее, начиная с кукисов

                    Согласен. Но таких, что поддерживает редиректы - раз и обчёлся. Во многих случаях приходилось писать обработчик самому. CURL их точно поддерживает - я с ней работал,- а еще Indy.
                    Ответить
                    • Выкинь свое пиздоговноделфи и будет поддерживать, даже по умолчанию.
                      Редиректы 302 при скачивании файлов вижу не первый раз.
                      Ответить
    • function TSynHttpClient.ProcessResponse: TSynHttpWhatsNext;
      function BuildLocation(Location:string):string;
      var
        Prot, User, Pass, Host, Port, Path, Para: string;
      begin
        ParseURL(FRequest.URL, Prot, User, Pass, Host, Port, Path, Para);
        if Pos('://', Location)=0 then
        begin
          if Prot='' then Prot:='http';
          if (Copy(Host,Length(Host),1) <> '/') and (Copy(Location,1,1) <> '/') then
          Host:=Host+'/';
          Result:=Prot+'://'+Host+Location;
        end
        else
        Result:=Location;
      end;
      
      var
        LresponseDigit,LResponseCode:Integer;
        LLocation:string;
        LMethod:TSynHTTPMethod;
        Prot, User, Pass, Host, Port, Path, Para: string;
      begin
        LResponseCode := FHTTP.ResultCode;
        LResponseDigit := LResponseCode div 100;
      
        if (LResponseDigit = 3) and (LResponseCode <> 304) then
        begin
          if Response.Location = '' then
          begin
            Result := wnJustExit;
            Exit;
          end;
      
          Inc(FRedirectCount);
          LLocation := Trim(Response.Location);
          LLocation:=BuildLocation(LLocation);
          LMethod := Request.Method;
      
          if FHandleRedirects then
          if Assigned(FOnredirect) then
          FOnRedirect(LLocation, LMethod, FRedirectCount);
      
          if (FHandleRedirects) and (FRedirectCount < FRedirectsMaximum) then
          begin
            Result := wnGoToURL;
            Request.URL := LLocation;
            ParseURL(FRequest.URL, Prot, User, Pass, Host, Port, Path, Para);
            Request.Host:=Host;
            if (LResponseCode = 302) or
                (LResponseCode = 303) then
            begin
              Request.Source := nil;
              Request.Method := HTTPMethodGet;
            end
            else
            begin
              Request.Method := LMethod;
            end;
          end
          else
           begin
            Result := wnJustExit;
            Response.Location := LLocation;
          end;
        end
        else begin
            Result := wnJustExit;
          end;
      end;
      Ответить
    • procedure TSynHttpClient.DoRequest(AMethod: TSynHttpMethod; URL: string;
        Asource, AResponse: TStream);
      
      procedure PrepareResponse;
      var
        tmp:string;
        i:integer;
      begin
        FResponse.FResponseCode:=FHTTP.ResultCode;
        FResponse.ResponseText:=FHTTP.ResultString;
        FResponse.Headers.Clear;
        FResponse.Headers.Assign(FHTTP.Headers);
        FHTTP.Headers.Clear;
        tmp:=FResponse.Headers.Values['Content-Length'];
        if trystrtoint(tmp,i) then
        FResponse.ContentLength:=I
        else
        FResponse.ContentLength:=-1;
      end;
      
      
      var
        _URL:string;
      begin
        FRedirectCount:=-1;
        FRequest.URL:=URL;
        FRequest.Method:=AMethod;
        FRequest.PrepareRequest;
        if FallowCompression then
        FRequest.AcceptEncoding:='gzip, deflate';
        repeat
          FHTTP.Document.Clear;
          FHTTP.Headers.Clear;
          FResponse.Headers.Clear;
          if Assigned(Asource) then
          FHTTP.Document.LoadFromStream(Asource);
          FHTTP.Headers.Assign(FRequest.Headers);
          FHTTP.HTTPMethod(Request.Method, FRequest.URL);
          FResponse.Headers.Clear;
          FResponse.Headers.Assign(FHTTP.Headers);
          //FHTTP.Headers.Clear;
          _Url:=FRequest.URL;
      
          case ProcessResponse of
            wnGoToURL:
            begin
              //FRequest.Referer:=_URL;
            //  FHTTP.Document.Clear;
              FHTTP.Headers.Clear;
              FHTTP.Headers.Assign(FRequest.FHeaders);
            end;
            wnJustExit:
            begin
              PrepareResponse;
              FHTTP.Document.SaveToStream(AResponse);
              FHTTP.Document.Clear;
              Break;
            end;
            wnDontKnow:
            begin
              FHTTP.Document.SaveToStream(AResponse);
              FHTTP.Document.Clear;
              Break;
            end;
          end;
        until False;
      end;
      Ответить
    • Принцип спизжен из Indy, конкретно из IdHTTP.pas

      1. Перед отправкой на сайт, процедура заполняет заголовки запроса и в цикле начинает слать запросы, каждый раз проверяя код, который вернул сервер.
      Если код в пределах 300...303, функция парсит значение поля Location, подставляет его вместо URL и повторяет запрос (при этом, если запрос был POST, он меняется на GET, чтобы предотвратить повторную отправку формы), если нет - то цикл прерывается.
      Ответить
      • Нахуй ты это запостил, шизик?
        Ответить
        • Я, шизик в лице доктора Стертора, запостил сие бренное, паскальное кодие токмо лишь затем, чтобы твоё расширенное, играющее анальное отверстие сузилось от радости, - но боюсь, пидар не оценил моих потуг. Мой волосатый, шестнадцатисантиметровый половой гигант оступился и упал от огорчения...

          Запили что-то похожее.
          Ответить

    Добавить комментарий