11package tools
22
33import (
4+ "bytes"
5+ "crypto/tls"
46 "encoding/json"
7+ "io"
58 "log"
69 "net/http"
10+ "os"
11+ "strconv"
712)
813
914// These variables must be set by main.go before calling RegisterParseableTools
@@ -13,18 +18,67 @@ var (
1318 ParseablePass string
1419)
1520
21+ // package-level HTTP client; initialized in init() to respect UNSECURE env var
22+ var HTTPClient * http.Client
23+
24+ func init () {
25+ // UNSECURE environment variable controls whether TLS verification is skipped.
26+ // Accepts the same values as strconv.ParseBool (true/1/t etc.).
27+ unsecureEnv := os .Getenv ("UNSECURE" )
28+ if ok , _ := strconv .ParseBool (unsecureEnv ); ok {
29+ HTTPClient = & http.Client {
30+ Transport : & http.Transport {
31+ TLSClientConfig : & tls.Config {InsecureSkipVerify : true },
32+ },
33+ }
34+ log .Printf ("UNSECURE=true: HTTP client will skip TLS verification" )
35+ } else {
36+ HTTPClient = http .DefaultClient
37+ }
38+ }
39+
1640func addBasicAuth (req * http.Request ) {
1741 req .SetBasicAuth (ParseableUser , ParseablePass )
1842}
1943
44+ func doParseableQuery (query string , streamName string , startTime string , endTime string ) ([]map [string ]interface {}, error ) {
45+ payload := map [string ]string {
46+ "query" : query ,
47+ "streamName" : streamName ,
48+ "startTime" : startTime ,
49+ "endTime" : endTime ,
50+ }
51+ jsonPayload , _ := json .Marshal (payload )
52+ url := ParseableBaseURL + parseableSQLPath
53+ httpReq , err := http .NewRequest ("POST" , url , bytes .NewBuffer (jsonPayload ))
54+ if err != nil {
55+ return nil , err
56+ }
57+ httpReq .Header .Set ("Content-Type" , "application/json" )
58+ addBasicAuth (httpReq )
59+ resp , err := HTTPClient .Do (httpReq )
60+ if err != nil {
61+ return nil , err
62+ }
63+ defer resp .Body .Close ()
64+ body , _ := io .ReadAll (resp .Body )
65+
66+ // Try to unmarshal as array of rows
67+ var arrResult []map [string ]interface {}
68+ if err := json .Unmarshal (body , & arrResult ); err != nil {
69+ return nil , err
70+ }
71+ return arrResult , nil
72+ }
73+
2074func listParseableStreams () ([]string , error ) {
2175 url := ParseableBaseURL + "/api/v1/logstream"
2276 httpReq , err := http .NewRequest ("GET" , url , nil )
2377 if err != nil {
2478 return nil , err
2579 }
2680 addBasicAuth (httpReq )
27- resp , err := http . DefaultClient .Do (httpReq )
81+ resp , err := HTTPClient .Do (httpReq )
2882 if err != nil {
2983 return nil , err
3084 }
@@ -53,7 +107,7 @@ func getParseableSchema(stream string) (map[string]string, error) {
53107 return nil , err
54108 }
55109 addBasicAuth (httpReq )
56- resp , err := http . DefaultClient .Do (httpReq )
110+ resp , err := HTTPClient .Do (httpReq )
57111 if err != nil {
58112 return nil , err
59113 }
@@ -85,46 +139,58 @@ func getParseableSchema(stream string) (map[string]string, error) {
85139
86140func getParseableStats (streamName string ) (map [string ]interface {}, error ) {
87141 url := ParseableBaseURL + "/api/v1/logstream/" + streamName + "/stats"
88- httpReq , err := http . NewRequest ( "GET" , url , nil )
142+ stats , m , err := doSimpleGet ( url )
89143 if err != nil {
90- return nil , err
91- }
92- addBasicAuth (httpReq )
93- resp , err := http .DefaultClient .Do (httpReq )
94- if err != nil {
95- return nil , err
96- }
97- defer func () {
98- if err := resp .Body .Close (); err != nil {
99- log .Printf ("failed to close response body: %v" , err )
100- }
101- }()
102- var stats map [string ]interface {}
103- if err := json .NewDecoder (resp .Body ).Decode (& stats ); err != nil {
104- return nil , err
144+ return m , err
105145 }
106146 return stats , nil
107147}
108148
109149func getParseableInfo (streamName string ) (map [string ]interface {}, error ) {
110150 url := ParseableBaseURL + "/api/v1/logstream/" + streamName + "/info"
151+ info , m , err := doSimpleGet (url )
152+ if err != nil {
153+ return m , err
154+ }
155+ return info , nil
156+ }
157+
158+ func getParseableAbout () (map [string ]interface {}, error ) {
159+ url := ParseableBaseURL + "/api/v1/about"
160+ about , m , err := doSimpleGet (url )
161+ if err != nil {
162+ return m , err
163+ }
164+ return about , nil
165+ }
166+
167+ func getParseableRoles () (map [string ]interface {}, error ) {
168+ url := ParseableBaseURL + "/api/v1/roles"
169+ roles , m , err := doSimpleGet (url )
170+ if err != nil {
171+ return m , err
172+ }
173+ return roles , nil
174+ }
175+
176+ func doSimpleGet (url string ) (map [string ]interface {}, map [string ]interface {}, error ) {
111177 httpReq , err := http .NewRequest ("GET" , url , nil )
112178 if err != nil {
113- return nil , err
179+ return nil , nil , err
114180 }
115181 addBasicAuth (httpReq )
116- resp , err := http . DefaultClient .Do (httpReq )
182+ resp , err := HTTPClient .Do (httpReq )
117183 if err != nil {
118- return nil , err
184+ return nil , nil , err
119185 }
120186 defer func () {
121187 if err := resp .Body .Close (); err != nil {
122188 log .Printf ("failed to close response body: %v" , err )
123189 }
124190 }()
125- var info map [string ]interface {}
126- if err := json .NewDecoder (resp .Body ).Decode (& info ); err != nil {
127- return nil , err
191+ var stats map [string ]interface {}
192+ if err := json .NewDecoder (resp .Body ).Decode (& stats ); err != nil {
193+ return nil , nil , err
128194 }
129- return info , nil
195+ return stats , nil , nil
130196}
0 commit comments