Question about idhttp GET

I've seen an interesting posting here: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_23286908.html

Where I could get a filename for an url which looks like this: http://www.deadlybossmods.com/download.php?id=1

the problem is, it does not result any filename if the url looks like this one: http://www.delphipages.com/edit/count.cfm?ID=3338

can someone make it work with most if not all urls?

kindest regards
s!
LVL 1
stOrMAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

2266180Commented:
>> the problem is, it does not result any filename if the url looks like this one: http://www.delphipages.com/edit/count.cfm?ID=3338

needs a little modification
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHeaderList;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fn:string;
    procedure IdHTTP1HeadersAvailable(Sender: TObject;
      AHeaders: TIdHeaderList; var VContinue: Boolean);
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses idhttp;
 
{$R *.dfm}
 
procedure TForm1.IdHTTP1HeadersAvailable(Sender: TObject;
  AHeaders: TIdHeaderList; var VContinue: Boolean);
var
  ContentDisposition: string;
begin
  ContentDisposition := AHeaders.Values['Content-Disposition'];
  if ContentDisposition='' then
    exit;
  ContentDisposition := Copy(ContentDisposition, 1 + Pos(';', ContentDisposition), MaxInt);
  ContentDisposition := StringReplace(ContentDisposition, 'filename=', '', [rfIgnoreCase]);
  ContentDisposition := StringReplace(ContentDisposition, '"', '', [rfReplaceAll]);
  fn := ContentDisposition;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var h:tidhttp;
    s:TMemoryStream;
    url:string;
begin
  h:=tidhttp.create(nil);
  try
    h.HandleRedirects:=false;
    h.OnHeadersAvailable:=IdHTTP1HeadersAvailable;
    url:='http://www.delphipages.com/edit/count.cfm?ID=3338';
    s:=TMemoryStream.Create;
    try
      repeat
        try
          fn:=ExtractFileName(StringReplace(url, '/', '\', [rfReplaceAll]));
          fn:=StringReplace(fn, '?', '_', [rfReplaceAll]);
          fn:=StringReplace(fn, '&', '_', [rfReplaceAll]);
          fn:=StringReplace(fn, '=', '_', [rfReplaceAll]);
          h.Get(url, s);
          s.SaveToFile(fn);
          break;
        except
          on e:EIdHTTPProtocolException do
          begin
            if (e.ErrorCode mod 300) in [1, 2, 3, 7] then
              url:=h.response.location
            else
              raise
          end;
          on exception do
            raise;
        end;
      until false;
    finally
      freeandnil(s);
    end;
  finally
    freeandnil(h);
  end;
end;
 
end.

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
stOrMAuthor Commented:
Hi ciuly,
maybe I did a mistake but if I execute your code, I run into an exception telling me:

'EIdHTTPProtocolException HTTP/1.1.302 Object Moved'

kindest regards
s!
0
2266180Commented:
that only happens when running in the IDE and not having the delphi exceptions ignored :)

so, either run it from outside of the ide, or, in ide, menu, tools - debugger options - language exceptions : uncheck stop on delphi exceptions.
0
Cloud Class® Course: C++ 11 Fundamentals

This course will introduce you to C++ 11 and teach you about syntax fundamentals.

stOrMAuthor Commented:
Ah I see, perfect job!
Thank you very much!

Maybe one last word, does this version you have done now works with all of those urls which hides filenames or is it alsmost impossible to extract every one?

kindest regards
s!
0
2266180Commented:
can't say. if the methods used are standardized and are the 2 which I implemented, then yes :) there might be other standard ways of doing it. when you find one, just ask and we'll solve it ;)
0
stOrMAuthor Commented:
Ok I'll look if I stumble about another one, I'll let you know!
Again thank you very much!

s!
0
2266180Commented:
you're welcome
0
stOrMAuthor Commented:
Hi ciuly,
I didn't thought I would come back so fast but try this url: http://go.microsoft.com/FWLink/?LinkId=84399
for the example above it will not generate the filename :-(
0
2266180Commented:
it works for me
0
stOrMAuthor Commented:
Hmm don't know why probably my mistake I got as filename result: _LinkId_84399 instead of wuredist.cab
0
2266180Commented:
yes, in first instance. but when doing the get, it will redirect (302) which will give the new url and thus changing the filename from _LinkId_84399 to wuredist.cab

unless you changed something in the code :P

run my code as it is (only change the url) and you will see it works.
0
stOrMAuthor Commented:
seems to be something with my other code inside the thread not sure whats wrong in the moment i need more testing
0
2266180Commented:
tae your time. just keep in mind that according to EE rules, since you are having another problem, even though it is related to this question, you need to open a new question because it is actually another problem ;)
there is an ask a related question link just above the memo box you type in, this one: http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/newQuestionWizardRelated.jsp?qid=23860762
0
stOrMAuthor Commented:
Ok I'll see I now found the problem myself.
While running your code inside a seperate thread, I was freeing the MemoryStream and IDHHTP Object not inside the thread execution but in destroy. That was my mistake so the downloaded file couldn't be saved to hdd!
I now moved the freeing of both objects into the finally statements in thread execute method and it works like a charm!

kindest regards
s!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Editors IDEs

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.