|
@@ -12,7 +12,7 @@ uses
|
|
IdTCPConnection, IdTCPClient, IdHTTP, _JSONConfig, dxSkinsdxBarPainter, dxBar,
|
|
IdTCPConnection, IdTCPClient, IdHTTP, _JSONConfig, dxSkinsdxBarPainter, dxBar,
|
|
cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit, Vcl.Menus,
|
|
cxContainer, cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit, Vcl.Menus,
|
|
cxButtons, BCEditor.Editor.Base, BCEditor.Editor, dxSkinscxPCPainter,
|
|
cxButtons, BCEditor.Editor.Base, BCEditor.Editor, dxSkinscxPCPainter,
|
|
- dxBarBuiltInMenu, cxPC, System.ImageList, Vcl.ImgList;
|
|
|
|
|
|
+ dxBarBuiltInMenu, cxPC, System.ImageList, Vcl.ImgList, cxCheckBox;
|
|
|
|
|
|
type
|
|
type
|
|
TfrmMain = class(TForm)
|
|
TfrmMain = class(TForm)
|
|
@@ -76,6 +76,16 @@ type
|
|
Label7: TLabel;
|
|
Label7: TLabel;
|
|
tabPostData: TcxTabSheet;
|
|
tabPostData: TcxTabSheet;
|
|
EditorPostData: TBCEditor;
|
|
EditorPostData: TBCEditor;
|
|
|
|
+ tbbtnAutoOpenLastUsed: TdxBarButton;
|
|
|
|
+ Label8: TLabel;
|
|
|
|
+ Panel5: TPanel;
|
|
|
|
+ comboPostContentType: TcxComboBox;
|
|
|
|
+ cxTabSheet3: TcxTabSheet;
|
|
|
|
+ chkUseBasicAuth: TcxCheckBox;
|
|
|
|
+ Label9: TLabel;
|
|
|
|
+ edtAuthUsername: TcxTextEdit;
|
|
|
|
+ edtAuthPassword: TcxTextEdit;
|
|
|
|
+ Label10: TLabel;
|
|
procedure FormShow(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
@@ -101,6 +111,7 @@ type
|
|
procedure edtBaseURLPropertiesChange(Sender: TObject);
|
|
procedure edtBaseURLPropertiesChange(Sender: TObject);
|
|
procedure EditorURLParamsChange(Sender: TObject);
|
|
procedure EditorURLParamsChange(Sender: TObject);
|
|
procedure comboMethodPropertiesChange(Sender: TObject);
|
|
procedure comboMethodPropertiesChange(Sender: TObject);
|
|
|
|
+ procedure tbbtnAutoOpenLastUsedClick(Sender: TObject);
|
|
private
|
|
private
|
|
FMainConfig: TJSONConfig;
|
|
FMainConfig: TJSONConfig;
|
|
FProjectConfig: TJSONConfig;
|
|
FProjectConfig: TJSONConfig;
|
|
@@ -129,7 +140,7 @@ implementation
|
|
|
|
|
|
{$R *.dfm}
|
|
{$R *.dfm}
|
|
|
|
|
|
-uses System.Net.URLClient;
|
|
|
|
|
|
+uses System.NetEncoding, System.UITypes, _EncryptStr;
|
|
|
|
|
|
procedure TfrmMain.tbbtnRunClick(Sender: TObject);
|
|
procedure TfrmMain.tbbtnRunClick(Sender: TObject);
|
|
begin
|
|
begin
|
|
@@ -166,7 +177,7 @@ begin
|
|
strlist.Text := StringReplace(EditorURLParams.Lines[i], '=', #13#10, [rfReplaceAll]);
|
|
strlist.Text := StringReplace(EditorURLParams.Lines[i], '=', #13#10, [rfReplaceAll]);
|
|
if strlist.Count = 2 then
|
|
if strlist.Count = 2 then
|
|
begin
|
|
begin
|
|
- dmy := dmy + TURI.URLEncode(strlist[0]) + '=' + TURI.URLEncode(strlist[1]);
|
|
|
|
|
|
+ dmy := dmy + TNetEncoding.URL.Encode(strlist[0]) + '=' + TNetEncoding.URL.Encode(strlist[1]);
|
|
end;
|
|
end;
|
|
finally
|
|
finally
|
|
strlist.Free;
|
|
strlist.Free;
|
|
@@ -177,6 +188,11 @@ begin
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TfrmMain.tbbtnAutoOpenLastUsedClick(Sender: TObject);
|
|
|
|
+begin
|
|
|
|
+ FMainConfig.WriteBool('Project', 'AutoOpenLastUsed', tbbtnAutoOpenLastUsed.Down);
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure TfrmMain.dxBarButton3Click(Sender: TObject);
|
|
procedure TfrmMain.dxBarButton3Click(Sender: TObject);
|
|
begin
|
|
begin
|
|
OpenDialog.InitialDir := FMainConfig.ReadString('Dialogs', 'LastOpenDir', ExtractFilePath(ParamStr(0)));
|
|
OpenDialog.InitialDir := FMainConfig.ReadString('Dialogs', 'LastOpenDir', ExtractFilePath(ParamStr(0)));
|
|
@@ -306,7 +322,7 @@ end;
|
|
|
|
|
|
procedure TfrmMain.dxBarButton7Click(Sender: TObject);
|
|
procedure TfrmMain.dxBarButton7Click(Sender: TObject);
|
|
begin
|
|
begin
|
|
- ShowMessage('About REST Debugger');
|
|
|
|
|
|
+ MessageDlg('Simnet REST Debugger', mtInformation, [mbOK], 0);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TfrmMain.dxBarSubItem3Popup(Sender: TObject);
|
|
procedure TfrmMain.dxBarSubItem3Popup(Sender: TObject);
|
|
@@ -370,8 +386,16 @@ begin
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- FActiveProject := GetTempProjectFile;
|
|
|
|
- FIsTempProjectLoaded := True;
|
|
|
|
|
|
+ if (FMainConfig.ReadBool('Project', 'AutoOpenLastUsed')) and (FileExists(FMainConfig.ReadString('Project', 'LastUsed'))) then
|
|
|
|
+ begin
|
|
|
|
+ FActiveProject := FMainConfig.ReadString('Project', 'LastUsed');
|
|
|
|
+ FIsTempProjectLoaded := False;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ FActiveProject := GetTempProjectFile;
|
|
|
|
+ FIsTempProjectLoaded := True;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
LoadProject;
|
|
LoadProject;
|
|
@@ -394,8 +418,8 @@ begin
|
|
|
|
|
|
Left := FMainConfig.ReadInteger('MainWindowPos', 'Left', Round((Screen.Width - Width) div 2));
|
|
Left := FMainConfig.ReadInteger('MainWindowPos', 'Left', Round((Screen.Width - Width) div 2));
|
|
Top := FMainConfig.ReadInteger('MainWindowPos', 'Top', Round((Screen.Height - Height) div 2));
|
|
Top := FMainConfig.ReadInteger('MainWindowPos', 'Top', Round((Screen.Height - Height) div 2));
|
|
- Width := FMainConfig.ReadInteger('MainWindowPos', 'Width', 1000);
|
|
|
|
- Height := FMainConfig.ReadInteger('MainWindowPos', 'Height', 800);
|
|
|
|
|
|
+ Width := FMainConfig.ReadInteger('MainWindowPos', 'Width', 720);
|
|
|
|
+ Height := FMainConfig.ReadInteger('MainWindowPos', 'Height', 930);
|
|
if FMainConfig.ReadBool('MainWindowPos', 'StayOnTop') then
|
|
if FMainConfig.ReadBool('MainWindowPos', 'StayOnTop') then
|
|
begin
|
|
begin
|
|
FormStyle := fsStayOnTop;
|
|
FormStyle := fsStayOnTop;
|
|
@@ -407,13 +431,27 @@ begin
|
|
tbbtnStayOnTop.Down := False;
|
|
tbbtnStayOnTop.Down := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ tbbtnAutoOpenLastUsed.Down := FMainConfig.ReadBool('Project', 'AutoOpenLastUsed', True);
|
|
|
|
+
|
|
EditorContent.Lines.Clear;
|
|
EditorContent.Lines.Clear;
|
|
EditorHeaders.Lines.Clear;
|
|
EditorHeaders.Lines.Clear;
|
|
|
|
+
|
|
|
|
+ dxStatusBar.Panels[1].Text := '';
|
|
end;
|
|
end;
|
|
|
|
|
|
function TfrmMain.GetTempProjectFile: string;
|
|
function TfrmMain.GetTempProjectFile: string;
|
|
|
|
+var
|
|
|
|
+ iSize: Integer;
|
|
|
|
+ guid: TGUID;
|
|
begin
|
|
begin
|
|
- Result := 'c:\temp\temp.rdproj';
|
|
|
|
|
|
+ iSize := Winapi.Windows.GetTempPath(0, nil);
|
|
|
|
+ SetLength(Result, iSize);
|
|
|
|
+ iSize := Winapi.Windows.GetTempPath(iSize, @Result[1]);
|
|
|
|
+ SetLength(Result, iSize);
|
|
|
|
+ Result := IncludeTrailingPathDelimiter(Result);
|
|
|
|
+ CreateGUID(guid);
|
|
|
|
+
|
|
|
|
+ Result := Result + guid.ToString + '.rdproj';
|
|
FTempProjectFile := Result;
|
|
FTempProjectFile := Result;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -431,6 +469,12 @@ begin
|
|
EditorURLParams.Lines.Text := FProjectConfig.ReadString(preset, 'URLParams');
|
|
EditorURLParams.Lines.Text := FProjectConfig.ReadString(preset, 'URLParams');
|
|
EditorExtraHeaders.Lines.Text := FProjectConfig.ReadString(preset, 'ExtraHeaders');
|
|
EditorExtraHeaders.Lines.Text := FProjectConfig.ReadString(preset, 'ExtraHeaders');
|
|
EditorPostData.Lines.Text := FProjectConfig.ReadString(preset, 'PostData');
|
|
EditorPostData.Lines.Text := FProjectConfig.ReadString(preset, 'PostData');
|
|
|
|
+ comboPostContentType.Text := FProjectConfig.ReadString(preset, 'PostDataContentType', 'application/json');
|
|
|
|
+
|
|
|
|
+ chkUseBasicAuth.Checked := FProjectConfig.ReadBool(preset, 'UseBasicAuth');
|
|
|
|
+ edtAuthUsername.Text := TEncryptStr.DecryptString(FProjectConfig.ReadString(preset, 'AuthUsername'));
|
|
|
|
+ edtAuthPassword.Text := TEncryptStr.DecryptString(FProjectConfig.ReadString(preset, 'AuthPassword'));
|
|
|
|
+
|
|
UpdateFullURL;
|
|
UpdateFullURL;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
@@ -439,11 +483,12 @@ procedure TfrmMain.LoadProject;
|
|
begin
|
|
begin
|
|
if FIsTempProjectLoaded then
|
|
if FIsTempProjectLoaded then
|
|
begin
|
|
begin
|
|
- dxStatusBar.Panels[1].Text := 'Default project loaded.';
|
|
|
|
|
|
+ dxStatusBar.Panels[2].Text := 'Default project loaded.';
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- dxStatusBar.Panels[1].Text := 'Loaded project: ' + FActiveProject;
|
|
|
|
|
|
+ dxStatusBar.Panels[2].Text := 'Loaded project: ' + FActiveProject;
|
|
|
|
+ FMainConfig.WriteString('Project', 'LastUsed', FActiveProject);
|
|
end;
|
|
end;
|
|
|
|
|
|
if Assigned(FProjectConfig) then
|
|
if Assigned(FProjectConfig) then
|
|
@@ -474,12 +519,50 @@ end;
|
|
procedure TfrmMain.Run;
|
|
procedure TfrmMain.Run;
|
|
var
|
|
var
|
|
dmy: string;
|
|
dmy: string;
|
|
|
|
+ tick: Cardinal;
|
|
begin
|
|
begin
|
|
- dmy := HTTP.Get(edtFullURL.Text);
|
|
|
|
- EditorContent.Lines.Text := dmy;
|
|
|
|
|
|
+ tick := GetTickCount;
|
|
|
|
+ try
|
|
|
|
+ HTTP.Request.CustomHeaders.AddStrings(EditorExtraHeaders.Lines);
|
|
|
|
+
|
|
|
|
+ if chkUseBasicAuth.Checked then
|
|
|
|
+ begin
|
|
|
|
+ HTTP.Request.Username := edtAuthUsername.Text;
|
|
|
|
+ HTTP.Request.Password := edtAuthPassword.Text;
|
|
|
|
+ end;
|
|
|
|
|
|
|
|
+ if comboMethod.ItemIndex = 0 then
|
|
|
|
+ begin
|
|
|
|
+ // GET
|
|
|
|
+ try
|
|
|
|
+ dmy := HTTP.Get(edtFullURL.Text);
|
|
|
|
+ except
|
|
|
|
+ on E: Exception do
|
|
|
|
+ begin
|
|
|
|
+ MessageDlg(E.Message, mtError, [mbOK], 0);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ if comboMethod.ItemIndex = 1 then
|
|
|
|
+ begin
|
|
|
|
+ // POST
|
|
|
|
+ HTTP.Request.ContentType := comboPostContentType.Text;
|
|
|
|
+ try
|
|
|
|
+ dmy := HTTP.Post(edtFullURL.Text, EditorPostData.Lines);
|
|
|
|
+ except
|
|
|
|
+ on E: Exception do
|
|
|
|
+ begin
|
|
|
|
+ MessageDlg(E.Message, mtError, [mbOK], 0);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
|
|
- EditorHeaders.Lines.Text := HTTP.Response.RawHeaders.Text;
|
|
|
|
|
|
+ EditorContent.Lines.Text := dmy;
|
|
|
|
+ EditorHeaders.Lines.Text := HTTP.Response.RawHeaders.Text;
|
|
|
|
+ finally
|
|
|
|
+ dxStatusBar.Panels[1].Text := FormatFloat('Response Time: 0, ms', GetTickCount - tick);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TfrmMain.SavePreset;
|
|
procedure TfrmMain.SavePreset;
|
|
@@ -496,7 +579,11 @@ begin
|
|
FProjectConfig.WriteString(preset, 'URLParams', EditorURLParams.Lines.Text);
|
|
FProjectConfig.WriteString(preset, 'URLParams', EditorURLParams.Lines.Text);
|
|
FProjectConfig.WriteString(preset, 'PostData', EditorPostData.Lines.Text);
|
|
FProjectConfig.WriteString(preset, 'PostData', EditorPostData.Lines.Text);
|
|
FProjectConfig.WriteString(preset, 'ExtraHeaders', EditorExtraHeaders.Lines.Text);
|
|
FProjectConfig.WriteString(preset, 'ExtraHeaders', EditorExtraHeaders.Lines.Text);
|
|
|
|
+ FProjectConfig.WriteString(preset, 'PostDataContentType', comboPostContentType.Text);
|
|
|
|
|
|
|
|
+ FProjectConfig.WriteBool(preset, 'UseBasicAuth', chkUseBasicAuth.Checked);
|
|
|
|
+ FProjectConfig.WriteString(preset, 'AuthUsername', TEncryptStr.EncryptString(edtAuthUsername.Text));
|
|
|
|
+ FProjectConfig.WriteString(preset, 'AuthPassword', TEncryptStr.EncryptString(edtAuthPassword.Text));
|
|
|
|
|
|
FProjectConfig.WriteInteger('Presets', 'LastUsed', idx);
|
|
FProjectConfig.WriteInteger('Presets', 'LastUsed', idx);
|
|
end;
|
|
end;
|