{ This file is part of restemplate. Copyright (C) 2015 Andreas Schneider restemplate is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. sqlvision is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with restemplate. If not, see . } program restemplate; uses SysUtils, Classes, strutils, JTemplate, httpsend, IniFiles, ssl_openssl; var data: TextFile; line: String; parser: TJTemplateParser; http: THTTPSend; method: String; content: TStringList; commandMode: Boolean; configDir, templateDir: String; templateFile, templateName: String; sessionIni: TIniFile; procedure CmdAskUser(AName: String); var value, default: String; begin Write(AName); default := sessionIni.ReadString(templateName, AName, ''); if default <> '' then Write(' [', default, ']: ') else Write(': '); ReadLn(value); if value = '' then value := default; parser.Fields.Add(AName, value); sessionIni.WriteString(templateName, AName, value); end; procedure CmdHeader(AHeader: String); begin parser.Content := AHeader; parser.Replace; http.Headers.Add(parser.Content); end; procedure CmdCall(AURL: String); var s: String; begin parser.Content := AURL; parser.Replace; writeln('Calling ', parser.Content); if content.Count > 0 then content.SaveToStream(http.Document); if http.HTTPMethod(method, parser.Content) then begin writeln; writeln('Status: ', http.ResultCode); writeln; writeln('Headers:'); for s in http.Headers do writeln(' ', s); writeln; content.LoadFromStream(http.Document); writeln(content.Text); end else begin ExitCode := 2; writeln; writeln('FAILED! Last Socket Error: ', http.Sock.SocksLastError); end; end; function ProcessCommand(ALine: String): Boolean; begin Result := False; if AnsiStartsStr('Ask ', ALine) then begin Result := True; CmdAskUser(Copy(ALine, 5, Length(ALine))); end else if AnsiStartsStr('Header ', ALine) then begin Result := True; CmdHeader(Copy(ALine, 8, Length(ALine))); end else if AnsiStartsStr('Method ', ALine) then begin Result := True; method := Copy(ALine, 8, Length(ALine)); end else if AnsiStartsStr('Call ', ALine) then begin Result := True; CmdCall(Copy(ALine, 6, Length(ALine))); end; end; procedure ListProfiles; var sr: TSearchRec; begin Writeln('Known profiles:'); if FindFirst(templateDir + '*.rest', faAnyFile, sr) = 0 then begin repeat writeln(' ', Copy(sr.Name, 1, Length(sr.Name) - 5)); until FindNext(sr) <> 0; end; end; begin configDir := GetAppConfigDir(False); templateDir := configDir + 'templates' + PathDelim; templateFile := templateDir + ParamStr(1) + '.rest'; if ParamCount <> 1 then begin Writeln('Usage: ', ExtractFileName(ParamStr(0)), ' '); Writeln; ListProfiles; Halt(0); end; if FileExists(ParamStr(1)) then begin AssignFile(data, ParamStr(1)); templateName := ExtractFileName(ParamStr(1)); if AnsiEndsStr('.rest', templateName) then templateName := Copy(templateName, 1, Length(templateName) - 5); end else if FileExists(templateFile) then begin AssignFile(data, templateFile); templateName := ParamStr(1); end else begin writeln('Template not found!'); Halt(1); end; Reset(data); sessionIni := TIniFile.Create(configDir + 'session.ini'); parser := TJTemplateParser.Create; http := THTTPSend.Create; content := TStringList.Create; commandMode := True; while not EOF(data) do begin ReadLn(data, line); if commandMode and (line <> '') and not ProcessCommand(line) then commandMode := False; if not commandMode then content.Add(line); end; sessionIni.Free; parser.Free; http.Free; content.Free; CloseFile(data); end.