' Cheapie http file snatcher for Rapid-Q (Windows) by William Yu 
' Fixed a header problem, sorry about that, should work for all webpages now. 
' Your program might hang (ie. block a few minutes) if it can't locate the 
' http server. 

$APPTYPE GUI
$TYPECHECK ON
$INCLUDE "RAPIDQ.INC"

DECLARE SUB ButtonClick

CONST PortNum = 80        '' Standard HTTP port. 

DIM Socket AS QSOCKET
DIM Sock AS INTEGER

CREATE Form AS QForm
  Width = 400
  Height = 400
  Center
  Caption = "Cheapie http file snatcher"
  CREATE URLLabel AS QLabel
    Left = 8
    Top = 12
    Caption = "URL: "
  END CREATE
  CREATE Edit AS QEdit
    Left = 45
    Top = 8
    Width = 230
    Text = "http://www.yahoo.com/"
  END CREATE
  CREATE Button AS QButton
    Left = 300
    Top = 6
    Caption = "&Get it!"
    OnClick = ButtonClick
  END CREATE
  CREATE RichEdit AS QRichEdit
    Top = 45
    Width = Form.ClientWidth
    Height = 307
    PlainText = True
    WordWrap = False
    ScrollBars = ssBoth
  END CREATE
  CREATE StatusBar AS QStatusBar
    AddPanels "",""
    Panel(0).Width = 130
    Panel(0).Caption = str$(StatusBar.Panel(0).Width)
  END CREATE
  ShowModal
END CREATE


SUB ButtonClick
  DIM Text AS STRING
  DIM Bytes AS LONG
  DIM Server AS STRING, PathToFile AS STRING
  DIM I AS INTEGER

  PathToFile = ""
  Server = Edit.Text - "http://"       '' Take out http:// 

  I = INSTR(Server, "/")
  IF I THEN
    PathToFile = MID$(Server, I, LEN(Server)+1-I)
    Server = LEFT$(Server, I-1)
  END IF

  Sock = Socket.Connect(Server, PortNum)

  IF Sock < 0 THEN
    ShowMessage "Could not make connection"
    EXIT SUB
  END IF

  StatusBar.Panel(1).Caption = "Getting "+PathToFile+" from "+Server

  '-- Send request, end with a blank line. 
  Socket.WriteLine(Sock, "GET "+PathToFile+" HTTP/1.0")
  '-- This line is optional... 
  Socket.WriteLine(Sock, "HOST "+Server+":"+STR$(PortNum))

  Socket.WriteLine(Sock, "")    '-- End request 

  Text = ""
  Bytes = 0
  '-- Might not actually retrieve the whole file... 
  DO
    Text = Text + Socket.Read(Sock, 32000)     '' 32000 bytes... whatever they give us 
    Bytes = Bytes + Socket.Transferred
    StatusBar.Panel(0).Caption = "Bytes Read: " + STR$(Bytes)
  LOOP UNTIL Socket.Transferred = 0
  RichEdit.Clear
  RichEdit.Text = Text
  Socket.Close
END SUB