PS. My choice of http.Request with client.Do was misleading, http.Post can be used as well:
func uploadStdin(url string) error { resp, err := http.Post(url, "text/plain", os.Stdin) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode >= 400 { return fmt.Errorf("bad status: %s", resp.Status) } _, err = io.Copy(os.Stdout, resp.Body) return err } wtorek, 7 marca 2023 o 22:41:39 UTC+1 Wojciech Kaczmarek napisał(a): > Hello, > > I think this code example rather streams back the response the server sent > from its POST handler > and it is not exactly what the OP requested ;) (not to mention that the > typical result of a POST is > an immediate redirect, possibly without body at all). > > I believe what Jim needs is constructing http.Request with a body in a > form of an io.Reader, then executing it. > Here's the minimal example showing that it can be streamed: > > ```go > > func uploadStdin(url string) error { > req, err := http.NewRequest("POST", url, os.Stdin) > > if err != nil { > return err > } > resp, err := http.DefaultClient.Do(req) > > if err != nil { > return err > } > defer resp.Body.Close() > if resp.StatusCode >= 400 { > return fmt.Errorf("bad status: %s", resp.Status) > > } > _, err = io.Copy(os.Stdout, resp.Body) > return err > } > ``` > > I just tested it and indeed, it gets uploaded after I give some input via > stdin and hit ctrl+D. > > Best, > Wojtek > > > > wtorek, 7 marca 2023 o 06:36:38 UTC+1 Amnon napisał(a): > > As Bruno said. > > Try something like this: > > func uploadBig(url string ) error { > file, err := os.Open("bigfile.txt") > if err != nil { > return err > } > defer file.Close() > resp, err := http.Post(url, "text/plain", file) > if err != nil { > return err > } > defer resp.Body.Close() > if resp.StatusCode >= 400 { > return fmt.Errorf("Bad Status %s", resp.Status) > } > _, err = io.Copy(os.Stdout, resp.Body) > return err > } > > > On Monday, 6 March 2023 at 15:17:36 UTC Bruno Albuquerque wrote: > > The body is just an io.Reader. You just need to write one that > materializes and streams the data you want instead of using a buffer with > all of it. The entire design is to allow things like what you want to do. :) > > -Bruno > > > On Mon, Mar 6, 2023 at 10:08 AM 'Jim Smart' via golang-nuts < > golan...@googlegroups.com> wrote: > > Hi all, > > I'm looking for an HTTP client that allows my code to write the body > content down the pipe while doing a POST. > > The use case here is that I'm wishing to send very large UPDATE/INSERT > queries/commands to an HTTP endpoint, and the body content of those > queries/commands is actually generated from a database. So it would be > better, memory- and performance- wise, if I could write that straight down > the pipe during the request, as opposed to manifesting the whole of the > query/command into a buffer before doing the POST. > > Is this possible at all with the stdlib http.Client? Perhaps with an > io.Pipe as the request body? > > I did look at the code for http.Client a little, but there's a lot of it, > and it's not the simplest of code to follow. I do have a base understanding > of the HTTP 1.1 protocol, but there's a lot more to http.Client than just > that, of course. > > I've also tried looking for existing examples showing similar > functionality, but did not seem to find anything. Which is partly what > makes me wonder if perhaps the stdlib http.Client cannot operate like this. > > If I can't do this with the stdlib http.Client, and I have to roll-my-own > client of sorts, are there any parts of the existing http package that I > should be making use of? > > Any tips / pointers / info greatly appreciated. > > Thanks, > /Jim > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/545d0597-66a0-4412-8ca7-3d447f88ccafn%40googlegroups.com > > <https://groups.google.com/d/msgid/golang-nuts/545d0597-66a0-4412-8ca7-3d447f88ccafn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/93606431-b8f8-4032-b7e5-a4ffa0898ac5n%40googlegroups.com.