77 "io"
88 "io/ioutil"
99 "net/http"
10+ "net/http/httptrace"
1011 "os"
1112 "regexp"
1213 "strconv"
2223 version = flag .Bool ("version" , false , "Prints program version" )
2324 networkAddress = flag .String ("address" , "localhost" , "The address of the board" )
2425 networkPort = flag .String ("port" , "80" , "The board needs to be listening on this port" )
26+ username = flag .String ("username" , "" , "Username for authentication" )
27+ password = flag .String ("password" , "" , "Password for authentication" )
2528 sketchPath = flag .String ("sketch" , "" , "Sketch path" )
2629 uploadEndpoint = flag .String ("upload" , "" , "Upload endpoint" )
2730 resetEndpoint = flag .String ("reset" , "" , "Upload endpoint" )
@@ -46,6 +49,10 @@ func main() {
4649 os .Exit (0 )
4750 }
4851
52+ var httpClient = & http.Client {
53+ Timeout : time .Second * 10 ,
54+ }
55+
4956 httpheader := "http://"
5057
5158 if * useSsl != "" {
@@ -68,7 +75,7 @@ func main() {
6875 fmt .Println ("Resetting the board" )
6976 }
7077
71- resp , err := http .Post (httpheader + * networkAddress + ":" + * networkPort + * syncEndpoint , "" , nil )
78+ resp , err := httpClient .Post (httpheader + * networkAddress + ":" + * networkPort + * syncEndpoint , "" , nil )
7279 if err != nil || resp .StatusCode != syncRetCode {
7380 if * verbose {
7481 fmt .Println ("Failed to reset the board, upload failed" )
@@ -86,7 +93,7 @@ func main() {
8693 timeout := 0
8794
8895 for timeout < 10 {
89- resp , err := http .Get (httpheader + * networkAddress + ":" + * networkPort + * syncEndpoint )
96+ resp , err := httpClient .Get (httpheader + * networkAddress + ":" + * networkPort + * syncEndpoint )
9097 if err != nil {
9198 if * verbose {
9299 fmt .Println ("Failed to reset the board, upload failed" )
@@ -108,10 +115,6 @@ func main() {
108115 }
109116
110117 if * uploadEndpoint != "" {
111- if * verbose {
112- fmt .Println ("Uploading the sketch" )
113- }
114-
115118 f , err := os .Open (* sketchPath )
116119 if err != nil {
117120 if * verbose {
@@ -139,9 +142,44 @@ func main() {
139142 }
140143 os .Exit (1 )
141144 }
142- req .Header .Set ("Content-Type" , "application/x-www-form-urlencoded" )
143145
144- resp , err := http .DefaultClient .Do (req )
146+ if * binMode {
147+ req .Header .Set ("Content-Type" , "application/octet-stream" )
148+ } else {
149+ req .Header .Set ("Content-Type" , "application/x-www-form-urlencoded" )
150+ }
151+
152+ if len (* username ) > 0 && len (* password ) != 0 {
153+ req .SetBasicAuth (* username , * password )
154+ }
155+
156+ if * verbose {
157+ trace := & httptrace.ClientTrace {
158+ ConnectStart : func (network , addr string ) {
159+ fmt .Print ("Connecting to board ... " )
160+ },
161+ ConnectDone : func (network , addr string , err error ) {
162+ if err != nil {
163+ fmt .Println ("failed!" )
164+ } else {
165+ fmt .Println (" done" )
166+ }
167+ },
168+ WroteHeaders : func () {
169+ fmt .Print ("Uploading sketch ... " )
170+ },
171+ WroteRequest : func (wri httptrace.WroteRequestInfo ) {
172+ fmt .Println (" done" )
173+ fmt .Print ("Flashing sketch ... " )
174+ },
175+ GotFirstResponseByte : func () {
176+ fmt .Println (" done" )
177+ },
178+ }
179+ req = req .WithContext (httptrace .WithClientTrace (req .Context (), trace ))
180+ }
181+
182+ resp , err := httpClient .Do (req )
145183 if err != nil {
146184 if * verbose {
147185 fmt .Println ("Error flashing the sketch" )
@@ -170,7 +208,7 @@ func main() {
170208 fmt .Println ("Resetting the board" )
171209 }
172210
173- resp , err := http .Post (httpheader + * networkAddress + ":" + * networkPort + * resetEndpoint , "" , nil )
211+ resp , err := httpClient .Post (httpheader + * networkAddress + ":" + * networkPort + * resetEndpoint , "" , nil )
174212 if err != nil {
175213 if * verbose {
176214 fmt .Println ("Failed to reset the board, please reset maually" )
0 commit comments