Simon Grossenbacher 3 년 전
부모
커밋
bc39bc8dff
8개의 변경된 파일192개의 추가작업 그리고 40개의 파일을 삭제
  1. 18 27
      Example Config.rdproj
  2. BIN
      RESTDebugger.exe
  3. 3 3
      prj/RESTDebugger.dproj
  4. BIN
      prj/RESTDebugger.res
  5. 21 0
      src/_frmMain.dfm
  6. 69 5
      src/_frmMain.pas
  7. 60 4
      src/_frmVariables.dfm
  8. 21 1
      src/_frmVariables.pas

+ 18 - 27
Example Config.rdproj

@@ -1,11 +1,11 @@
 {
 	"Presets": {
-		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n0952520cdbe749fe92660e7da45e6bcc:SGFjaw==\r\n",
-		"LastUsed": 1,
+		"Presets": "faf2be76254543f9ad9cc8fca91cef5e:R0VUOiBTaW1wbGUgR0VU\r\n7d37b798c22748eebf92ffa281ba982a:R0VUOiBHRVQgRXh0cmEgSGVhZGVycw==\r\n777045dda27d466fab6c051d3e8094e8:R0VUOiBVc2UgQmFzaWMgQXV0aCBFeGFtcGxl\r\na0745bab53eb4c78a6034f1a9d4559de:R0VUOiBFeGFtcGxlIFVSTCBQYXJhbWV0ZXJz\r\n292047e733934bc48429c4d746cae53a:UE9TVDogSnNvbiBQb3N0IERhdGE=\r\nc02b437c22474cf7b44a96c72f430f18:REVMRVRFOiBEZWxldGUgRGF0YQ==\r\n9609fe373b9b4865a2ea83a3dd35be30:UFVUOiBKc29uIFB1dCBEYXRh\r\ncbbcebba6f30425caec540f517cb3524:UEFUQ0g6IEpzb24gUGF0Y2ggRGF0YQ==\r\n",
+		"LastUsed": 0,
 		"ConfigVersion": 2
 	},
 	"Preset_faf2be76254543f9ad9cc8fca91cef5e": {
-		"BaseURL": "https://httpbin.org/get",
+		"BaseURL": "%BaseURL%/get",
 		"Method": 0,
 		"URLParams": "",
 		"PostData": "",
@@ -17,11 +17,11 @@
 		"ResponseAutoFormat": true
 	},
 	"Preset_7d37b798c22748eebf92ffa281ba982a": {
-		"BaseURL": "https://httpbin.org/headers",
+		"BaseURL": "%BaseURL%/headers",
 		"Method": 0,
 		"URLParams": "",
 		"PostData": "",
-		"ExtraHeaders": "X-TestHeader=TestValue",
+		"ExtraHeaders": "X-TestHeader=TestValue\r\nX-TestHeaderBaseURL=%BaseURL%",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
 		"AuthUsername": "",
@@ -29,7 +29,7 @@
 		"ResponseAutoFormat": false
 	},
 	"Preset_777045dda27d466fab6c051d3e8094e8": {
-		"BaseURL": "https://httpbin.org/basic-auth/user/pwd",
+		"BaseURL": "%BaseURL%/basic-auth/user/pwd",
 		"Method": 0,
 		"URLParams": "",
 		"PostData": "",
@@ -41,9 +41,9 @@
 		"ResponseAutoFormat": false
 	},
 	"Preset_a0745bab53eb4c78a6034f1a9d4559de": {
-		"BaseURL": "https://httpbin.org/get",
+		"BaseURL": "%BaseURL%/get",
 		"Method": 0,
-		"URLParams": "arg1=value1\r\narg2=value2",
+		"URLParams": "arg1=value1\r\narg2=%BaseURL%",
 		"PostData": "",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
@@ -53,19 +53,19 @@
 		"ResponseAutoFormat": false
 	},
 	"Preset_292047e733934bc48429c4d746cae53a": {
-		"BaseURL": "https://httpbin.org/post",
+		"BaseURL": "%BaseURL%/post",
 		"Method": 1,
 		"URLParams": "",
-		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"Hurra\": \"ole\"\r\n}\r\n",
+		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"BaseURL\": \"%BaseURL%\",\r\n  \"CustomVar\": \"%CustomPostData%\"\r\n}\r\n",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
 		"AuthUsername": "",
 		"AuthPassword": "",
-		"ResponseAutoFormat": false
+		"ResponseAutoFormat": true
 	},
 	"Preset_c02b437c22474cf7b44a96c72f430f18": {
-		"BaseURL": "http://jsonplaceholder.typicode.com/posts/1",
+		"BaseURL": "%BaseURL%/delete",
 		"Method": 4,
 		"URLParams": "",
 		"PostData": "",
@@ -77,10 +77,10 @@
 		"ResponseAutoFormat": false
 	},
 	"Preset_9609fe373b9b4865a2ea83a3dd35be30": {
-		"BaseURL": "https://httpbin.org/put",
+		"BaseURL": "%BaseURL%/put",
 		"Method": 3,
 		"URLParams": "",
-		"PostData": "{\r\n  \"Demo\": \"Demo Data\"\r\n}",
+		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"BaseURL\": \"%BaseURL%\"\r\n}",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
@@ -89,10 +89,10 @@
 		"ResponseAutoFormat": false
 	},
 	"Preset_cbbcebba6f30425caec540f517cb3524": {
-		"BaseURL": "https://httpbin.org/patch",
+		"BaseURL": "%BaseURL%/patch",
 		"Method": 2,
 		"URLParams": "",
-		"PostData": "{\r\n  \"Demo\": \"Demo Data\"\r\n}",
+		"PostData": "{\r\n  \"Demo\": \"Demo Data\",\r\n  \"BaseURL\": \"%BaseURL%\"\r\n}",
 		"ExtraHeaders": "",
 		"PostDataContentType": "application/json",
 		"UseBasicAuth": false,
@@ -100,16 +100,7 @@
 		"AuthPassword": "",
 		"ResponseAutoFormat": false
 	},
-	"Preset_0952520cdbe749fe92660e7da45e6bcc": {
-		"BaseURL": "https://www.hackthebox.eu/api/invite/generate",
-		"Method": 1,
-		"URLParams": "",
-		"PostData": "",
-		"ExtraHeaders": "",
-		"PostDataContentType": "application/json",
-		"ResponseAutoFormat": false,
-		"UseBasicAuth": false,
-		"AuthUsername": "",
-		"AuthPassword": ""
+	"Main": {
+		"GlobalVar": "fldName\tfldValue\r\n%CustomPostData%\tData 1\r\n%BaseURL%\thttps://httpbin.org\r\n"
 	}
 }

BIN
RESTDebugger.exe


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 3
prj/RESTDebugger.dproj


BIN
prj/RESTDebugger.res


+ 21 - 0
src/_frmMain.dfm

@@ -234,6 +234,8 @@ object frmMain: TfrmMain
     Align = alTop
     BevelOuter = bvNone
     TabOrder = 0
+    ExplicitLeft = -8
+    ExplicitTop = 71
     DesignSize = (
       725
       370)
@@ -1884,4 +1886,23 @@ object frmMain: TfrmMain
     Left = 565
     Top = 588
   end
+  object memDataVariables: TdxMemData
+    Active = True
+    Indexes = <>
+    SortOptions = []
+    Left = 135
+    Top = 600
+    object memDataVariablesfldName: TStringField
+      FieldName = 'fldName'
+    end
+    object memDataVariablesfldValue: TStringField
+      FieldName = 'fldValue'
+      Size = 255
+    end
+  end
+  object dsVariables: TDataSource
+    DataSet = memDataVariables
+    Left = 135
+    Top = 670
+  end
 end

+ 69 - 5
src/_frmMain.pas

@@ -16,7 +16,7 @@ uses
   SynEdit, SynHighlighterJSON, SynEditHighlighter, SynHighlighterIni,
   SynHighlighterXML, SynHighlighterHtml, SynEditRegexSearch, SynEditMiscClasses,
   SynEditSearch, _SearchTextHightlighterSynEditPlugin, SynEditTypes, cxSplitter,
-  SynEditCodeFolding, dxCore;
+  SynEditCodeFolding, dxCore, Data.DB, dxmdaset;
 
 type
   TMethodType = (mtGET, mtPOST, mtPATCH, mtPUT, mtDELETE);
@@ -121,6 +121,10 @@ type
     dxBarButton8: TdxBarButton;
     dxBarSubItem8: TdxBarSubItem;
     tbbtnVariables: TdxBarButton;
+    memDataVariables: TdxMemData;
+    memDataVariablesfldName: TStringField;
+    memDataVariablesfldValue: TStringField;
+    dsVariables: TDataSource;
     procedure FormShow(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
@@ -215,6 +219,7 @@ type
     function GenerateGuid: string;
     function Encode(const AText: string): string;
     function Decode(const AText: string): string;
+    function ReplaceGlobalVar(const AText: string): string;
 
   public
     MainConfig: TJSONConfig;
@@ -269,6 +274,8 @@ end;
 procedure TfrmMain.tbbtnVariablesClick(Sender: TObject);
 begin
   frmVariables.ShowModal;
+  SaveProject;
+  UpdateFullURL;
 end;
 
 procedure TfrmMain.UpdateEditor(const AText: string);
@@ -282,7 +289,7 @@ var
   dmy: string;
   strlist: TStringList;
 begin
-  edtFullURL.Text := edtBaseURL.Text;
+  edtFullURL.Text := ReplaceGlobalVar(edtBaseURL.Text);
   if EditorURLParams.Lines.Count > 0 then
   begin
     dmy := '?';
@@ -291,7 +298,7 @@ begin
       if dmy <> '?' then dmy := dmy + '&';
       strlist := TStringList.Create;
       try
-        strlist.Text := StringReplace(EditorURLParams.Lines[i], '=', #13#10, [rfReplaceAll]);
+        strlist.Text := StringReplace(ReplaceGlobalVar(EditorURLParams.Lines[i]), '=', #13#10, [rfReplaceAll]);
         if strlist.Count = 2 then
         begin
           dmy := dmy + TNetEncoding.URL.Encode(strlist[0]) + '=' + TNetEncoding.URL.Encode(strlist[1]);
@@ -450,6 +457,11 @@ begin
   begin
     bNewVersion := False;
     HTTP := TIdHTTP.Create(nil);
+    HTTP.IOHandler := SSLIOHandlerSocketOpenSSL;
+    HTTP.HTTPOptions := [hoKeepOrigProtocol];
+    HTTP.HandleRedirects := True;
+    HTTP.AllowCookies := True;
+    HTTP.Request.UserAgent := 'Simnet REST Debugger/' + GetAppVersion;
     strlist := TStringList.Create;
     try
       try
@@ -706,7 +718,7 @@ var
   dmy: string;
   strstream: TStringStream;
 begin
-  strstream := TStringStream.Create(EditorPostData.Lines.Text, TEncoding.UTF8);
+  strstream := TStringStream.Create(ReplaceGlobalVar(EditorPostData.Lines.Text), TEncoding.UTF8);
   try
     FHTTP.Request.ContentType := comboPostContentType.Text;
     FHTTP.Request.CharSet := 'utf-8';
@@ -1263,6 +1275,19 @@ begin
 
   PageControlParams.ActivePage := tabURLParams;
   PageControlResponse.ActivePage := tabContent;
+
+
+  strlist := TStringList.Create;
+  try
+    strlist.Text := FProjectConfig.ReadString('Main', 'GlobalVar');
+    memDataVariables.Active := False;
+    memDataVariables.LoadFromStrings(strlist);
+    memDataVariables.Active := True;
+  finally
+    strlist.Free;
+  end;
+
+  UpdateFullURL;
 end;
 
 procedure TfrmMain.pmnuPasteJsonContentClick(Sender: TObject);
@@ -1390,9 +1415,22 @@ begin
   end;
 end;
 
+function TfrmMain.ReplaceGlobalVar(const AText: string): string;
+begin
+  Result := AText;
+  memDataVariables.First;
+  while not memDataVariables.Eof do
+  begin
+    Result := StringReplace(Result, memDataVariablesfldName.Value, memDataVariablesfldValue.Value, [rfReplaceAll]);
+    memDataVariables.Next;
+  end;
+end;
+
 procedure TfrmMain.Run;
 var
   tick: Cardinal;
+  strlist: TStringList;
+  i: Integer;
 begin
   FHTTP := TIdHTTP.Create(nil);
   FHTTP.IOHandler := SSLIOHandlerSocketOpenSSL;
@@ -1408,7 +1446,20 @@ begin
     tick := GetTickCount;
     try
       FHTTP.Request.CustomHeaders.Clear;
-      FHTTP.Request.CustomHeaders.AddStrings(EditorExtraHeaders.Lines);
+
+      strlist := TStringList.Create;
+      try
+        strlist.Text := EditorExtraHeaders.Lines.Text;
+        for i := 0 to strlist.Count - 1 do
+        begin
+          strlist[i] := ReplaceGlobalVar(strlist[i]);
+        end;
+
+        FHTTP.Request.CustomHeaders.AddStrings(strlist);
+      finally
+        strlist.Free;
+      end;
+
 
       if chkUseBasicAuth.Checked then
       begin
@@ -1523,9 +1574,22 @@ begin
 end;
 
 procedure TfrmMain.SaveProject;
+var
+  strlist: TStringList;
 begin
   SavePreset;
+
   FProjectConfig.WriteInteger('Presets', 'ConfigVersion', iCurrentConfigVersion);
+
+  strlist := TStringList.Create;
+  try
+    memDataVariables.SaveToStrings(strlist);
+    FProjectConfig.WriteString('Main', 'GlobalVar', strlist.Text);
+  finally
+    strlist.Free;
+  end;
+
+
   FProjectConfig.Save;
 end;
 

+ 60 - 4
src/_frmVariables.dfm

@@ -4,8 +4,8 @@ object frmVariables: TfrmVariables
   BorderIcons = [biSystemMenu]
   BorderStyle = bsSingle
   Caption = 'Variables'
-  ClientHeight = 609
-  ClientWidth = 751
+  ClientHeight = 461
+  ClientWidth = 648
   Color = clBtnFace
   Font.Charset = DEFAULT_CHARSET
   Font.Color = clWindowText
@@ -19,14 +19,14 @@ object frmVariables: TfrmVariables
   object Panel1: TPanel
     Left = 0
     Top = 0
-    Width = 751
+    Width = 648
     Height = 76
     Align = alTop
     BevelOuter = bvNone
     Color = clWhite
     ParentBackground = False
     TabOrder = 0
-    ExplicitWidth = 725
+    ExplicitWidth = 751
     object Label1: TLabel
       Left = 25
       Top = 31
@@ -41,4 +41,60 @@ object frmVariables: TfrmVariables
       ParentFont = False
     end
   end
+  object cxButton1: TcxButton
+    Left = 290
+    Top = 420
+    Width = 75
+    Height = 25
+    Caption = 'Close'
+    TabOrder = 1
+    OnClick = cxButton1Click
+  end
+  object cxGrid1: TcxGrid
+    Left = 0
+    Top = 76
+    Width = 648
+    Height = 325
+    Align = alTop
+    TabOrder = 2
+    object cxGrid1DBTableView1: TcxGridDBTableView
+      Navigator.Buttons.CustomButtons = <>
+      Navigator.Buttons.First.Visible = False
+      Navigator.Buttons.PriorPage.Visible = False
+      Navigator.Buttons.Prior.Visible = False
+      Navigator.Buttons.Next.Visible = False
+      Navigator.Buttons.NextPage.Visible = False
+      Navigator.Buttons.Last.Visible = False
+      Navigator.Buttons.Insert.Visible = True
+      Navigator.Buttons.Edit.Visible = False
+      Navigator.Buttons.Cancel.Visible = False
+      Navigator.Buttons.Refresh.Visible = False
+      Navigator.Buttons.SaveBookmark.Visible = False
+      Navigator.Buttons.GotoBookmark.Visible = False
+      Navigator.Buttons.Filter.Visible = False
+      Navigator.Visible = True
+      ScrollbarAnnotations.CustomAnnotations = <>
+      DataController.DataSource = frmMain.dsVariables
+      DataController.Summary.DefaultGroupSummaryItems = <>
+      DataController.Summary.FooterSummaryItems = <>
+      DataController.Summary.SummaryGroups = <>
+      OptionsView.NoDataToDisplayInfoText = '< No variables defined >'
+      OptionsView.GroupByBox = False
+      object cxGrid1DBTableView1fldName: TcxGridDBColumn
+        Caption = 'Name'
+        DataBinding.FieldName = 'fldName'
+        SortIndex = 0
+        SortOrder = soAscending
+        Width = 150
+      end
+      object cxGrid1DBTableView1fldValue: TcxGridDBColumn
+        Caption = 'Value'
+        DataBinding.FieldName = 'fldValue'
+        Width = 490
+      end
+    end
+    object cxGrid1Level1: TcxGridLevel
+      GridView = cxGrid1DBTableView1
+    end
+  end
 end

+ 21 - 1
src/_frmVariables.pas

@@ -4,12 +4,25 @@ interface
 
 uses
   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
-  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
+  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, dxSkinsCore,
+  dxSkinOffice2019Colorful, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters,
+  Vcl.Menus, cxControls, cxStyles, cxCustomData, cxFilter, cxData,
+  cxDataStorage, cxEdit, cxNavigator, dxDateRanges, dxScrollbarAnnotations,
+  Data.DB, cxDBData, cxGridLevel, cxClasses, cxGridCustomView,
+  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid, cxButtons,
+  cxDropDownEdit;
 
 type
   TfrmVariables = class(TForm)
     Panel1: TPanel;
     Label1: TLabel;
+    cxButton1: TcxButton;
+    cxGrid1DBTableView1: TcxGridDBTableView;
+    cxGrid1Level1: TcxGridLevel;
+    cxGrid1: TcxGrid;
+    cxGrid1DBTableView1fldName: TcxGridDBColumn;
+    cxGrid1DBTableView1fldValue: TcxGridDBColumn;
+    procedure cxButton1Click(Sender: TObject);
   private
     { Private-Deklarationen }
   public
@@ -23,4 +36,11 @@ implementation
 
 {$R *.dfm}
 
+uses _frmMain;
+
+procedure TfrmVariables.cxButton1Click(Sender: TObject);
+begin
+  Close;
+end;
+
 end.

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.