Yeah, I'm not agreeing with you.

On Thu, 2019-02-07 at 07:07 -0600, Robert Engels wrote:
> You are agreeing with me. A type switch on concrete types (that you
> control) is far different than using an available Len() method and
> assuming the same semantics. 
> 
> > 
> > On Feb 7, 2019, at 1:05 AM, Dan Kortschak <d...@kortschak.io> wrote:
> > 
> > Addressing the first sentence, it was a direct answer to a comment
> > you
> > made:
> > 
> > > 
> > > But is it really? If you read the description for Len() on
> > > bytes.Buffer it is the length of unread portion. But that doesn’t
> > > mean the buffer isn’t just a portion of the entire body - it can
> > > be a
> > > chunk which is continually reloaded.
> > As far as the claim that there is a need to have a Len method in
> > io.Reader, have a look at the code in question. It type asserts on
> > three concrete types that are known to the function, all three have
> > a
> > Len method and this is used to obtain the known length. All other
> > io.Readers are considered to have an unknown length.
> > 
> > Whether it's wrong to use Len depends on whether there is a
> > generally
> > accepted and consistent set of semantics to Len() int. There is.
> > This
> > is strengthened if the use of an existing Len method is noted in
> > the
> > docs.
> > 
> > > 
> > > On Wed, 2019-02-06 at 15:50 -0600, robert engels wrote:
> > > I am not sure what that has to do with the discussion. My point
> > > was
> > > that for it to be applicable here, it needs to be defined as part
> > > of
> > > io.Reader, since that is what Body is declared as. It is not, so
> > > using in the manner outlined is not correct IMO.
> > > 
> > > > 
> > > > 
> > > > On Feb 6, 2019, at 3:37 PM, Dan Kortschak <d...@kortschak.io>
> > > > wrote:
> > > > 
> > > > The generalised semantics of Len are that it returns the number
> > > > of
> > > > available elements in the collection, being a cognate of the
> > > > len
> > > > built-
> > > > in. This means that as you consume elements from a buffer, the
> > > > Len
> > > > value reduces. This is directly equivalent to
> > > > 
> > > > for len(buf) != 0 {
> > > >    println(buf[0])
> > > >    buf = buf[1:]
> > > > }
> > > > 
> > > > > 
> > > > > On Wed, 2019-02-06 at 08:56 -0600, Robert Engels wrote:
> > > > > 
> > > > > But is it really? If you read the description for Len() on
> > > > > bytes.Buffer it is the length of unread portion. But that
> > > > > doesn’t
> > > > > mean the buffer isn’t just a portion of the entire body - it
> > > > > can
> > > > > be a
> > > > > chunk which is continually reloaded. 
> > > > > 
> > > > > This is the danger in using private APIs publically based
> > > > > upon
> > > > > the
> > > > > existence of a method - it leads to very brittle code - and
> > > > > there
> > > > > are
> > > > > almost certainly better ways to design it to avoid these
> > > > > issues.
> > > > > If
> > > > > the core api is not expressive enough then it will be more
> > > > > difficult. 
> > > > > 
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > On Feb 6, 2019, at 8:30 AM, Burak Serdar <bser...@ieee.org>
> > > > > > wrote:
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > On Wed, Feb 6, 2019 at 5:15 AM Robert Engels <rengels@ix.
> > > > > > > netc
> > > > > > > om.c
> > > > > > > om> wrote:
> > > > > > > 
> > > > > > > I see now, but if that can be the case, shouldn’t the
> > > > > > > Body be
> > > > > > > documented that the Reader may be a ReaderWithLen, and
> > > > > > > the
> > > > > > > consumer is free to type check/cast? If not, you are
> > > > > > > using
> > > > > > > internal details that you should not be.
> > > > > > Yes, the documentation should say if the reader has a Len()
> > > > > > method
> > > > > > it
> > > > > > would be used to set the ContentLength. Len is no longer an
> > > > > > internal
> > > > > > detail then.
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > This is a problem with Go in general. Because the
> > > > > > > returned
> > > > > > > object
> > > > > > > “implements” some interface because it happens to have
> > > > > > > the
> > > > > > > required method, doesn’t mean it was designed to be used
> > > > > > > that
> > > > > > > way, or that it has the required semantics - unless
> > > > > > > documented to
> > > > > > > have them.
> > > > > > I agree with you there. Len() is straight forward, but in
> > > > > > general
> > > > > > just
> > > > > > because a function is named something doesn't mean it'll do
> > > > > > the
> > > > > > same
> > > > > > thing for all implementations. On the other end of the
> > > > > > spectrum
> > > > > > is
> > > > > > Java-like interfaces where you want explicit inheritance of
> > > > > > a
> > > > > > specific
> > > > > > interface. I don't know if there's anything in between, but
> > > > > > I
> > > > > > like
> > > > > > Go's approach much better.
> > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > On Feb 6, 2019, at 2:22 AM, Matteo Biagetti
> > > > > > > <matteo.biagetti@
> > > > > > > gmai
> > > > > > > l.com> wrote:
> > > > > > > 
> > > > > > > Make sense, thanks for explanation
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > Il giorno mercoledì 6 febbraio 2019 07:28:54 UTC+1, Burak
> > > > > > > Serdar
> > > > > > > ha scritto:
> > > > > > > > 
> > > > > > > > 
> > > > > > > > 
> > > > > > > > 
> > > > > > > > On Tue, Feb 5, 2019 at 8:13 PM robert engels <ren...@ix
> > > > > > > > .net
> > > > > > > > com.
> > > > > > > > com> wrote:
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > That’s what I was trying to point out. Your design is
> > > > > > > > > not
> > > > > > > > > correct. The Body is a Reader, not a Buffer - the
> > > > > > > > > length
> > > > > > > > > of
> > > > > > > > > the request/body may be indeterminate - that is, a
> > > > > > > > > stream.
> > > > > > > > > Attempting to get the length of an underlying buffer
> > > > > > > > > is
> > > > > > > > > not
> > > > > > > > > only probably not possible, but not correct in many
> > > > > > > > > situations.
> > > > > > > > The length of the body *may* be indeterminate, and if
> > > > > > > > that's
> > > > > > > > the case,
> > > > > > > > the underlying Reader will not have a Len method. The
> > > > > > > > design is
> > > > > > > > to
> > > > > > > > handle the case where the underlying Reader is a Buffer
> > > > > > > > with a
> > > > > > > > Len
> > > > > > > > method. If the Reader has Len, then the NopCloser
> > > > > > > > derived
> > > > > > > > from
> > > > > > > > that
> > > > > > > > will also have a Len, and NewRequest can set the
> > > > > > > > content
> > > > > > > > length. If
> > > > > > > > the Reader does not have Len, then the content length
> > > > > > > > is
> > > > > > > > unknown.
> > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > There is a reason the Body is a ReaderCloser and not
> > > > > > > > > a
> > > > > > > > > buffer. It is part of the http specification.
> > > > > > > > > 
> > > > > > > > > On Feb 5, 2019, at 9:00 PM, Burak Serdar <bse...@ieee
> > > > > > > > > .org
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > wrote:
> > > > > > > > > 
> > > > > > > > > On Tue, Feb 5, 2019 at 7:00 PM Robert Engels <ren...@
> > > > > > > > > ix.n
> > > > > > > > > etco
> > > > > > > > > m.com> wrote:
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > Shouldn’t you just be taking the content length from
> > > > > > > > > the
> > > > > > > > > header if forwarding the same body. There is no need
> > > > > > > > > for
> > > > > > > > > the
> > > > > > > > > length of the body.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > True. What I was suggesting is a fix for the general
> > > > > > > > > case.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > On Feb 5, 2019, at 6:53 PM, Burak Serdar <bse...@ieee
> > > > > > > > > .org
> > > > > > > > > > 
> > > > > > > > > > 
> > > > > > > > > wrote:
> > > > > > > > > 
> > > > > > > > > On Tue, Feb 5, 2019 at 5:18 PM Dan Kortschak <d...@ko
> > > > > > > > > rtsc
> > > > > > > > > hak.
> > > > > > > > > io> wrote:
> > > > > > > > > 
> > > > > > > > > Personally, I think this is a bug in the behaviour of
> > > > > > > > > NewRequest. See h
> > > > > > > > > ttps://github.com/golang/go/issues/18117 for some
> > > > > > > > > additional
> > > > > > > > > context.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > Agreed. One solution could be to have:
> > > > > > > > > 
> > > > > > > > > type HasLen interface {
> > > > > > > > > int Len()
> > > > > > > > > }
> > > > > > > > > 
> > > > > > > > > Then have NopCloser return a nopCloser with len if
> > > > > > > > > the
> > > > > > > > > underlying
> > > > > > > > > implementation has len, with the obvious changes to
> > > > > > > > > NewRequest.Ugly,
> > > > > > > > > but can be done without API changes.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > On Tue, 2019-02-05 at 05:18 -0800, matteo....@gmail.c
> > > > > > > > > om
> > > > > > > > > wrote:
> > > > > > > > > I've the following situation:
> > > > > > > > > I proxy a request to another server and when I made a
> > > > > > > > > POST
> > > > > > > > > and create
> > > > > > > > > a new
> > > > > > > > > request, the contentLength is zero:
> > > > > > > > > 
> > > > > > > > >      req2, _ := http.NewRequest(req.Method, newApiUrl
> > > > > > > > > ,
> > > > > > > > > req.Body)
> > > > > > > > >      fmt.Println("New request from body:",
> > > > > > > > > req2.ContentLength) //
> > > > > > > > > print 0
> > > > > > > > > 
> > > > > > > > > Checking in the source code of the NewRequest func
> > > > > > > > > Body
> > > > > > > > > don't
> > > > > > > > > respect
> > > > > > > > > some
> > > > > > > > > interface and populate the ContentLength field.
> > > > > > > > > 
> > > > > > > > > Could be a bug? Which could be a valid approach in
> > > > > > > > > order
> > > > > > > > > to
> > > > > > > > > create a
> > > > > > > > > new
> > > > > > > > > request from an existing one and correct set the Body
> > > > > > > > > length?
> > > > > > > > > 
> > > > > > > > > A working example here:
> > > > > > > > > 
> > > > > > > > > https://play.golang.org/p/SvCDLj0NrXb
> > > > > > > > > 
> > > > > > > > > Thanks!
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > --
> > > > > > > > > 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.
> > > > > > > > > For more options, visit https://groups.google.com/d/o
> > > > > > > > > ptou
> > > > > > > > > t.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > --
> > > > > > > > > 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.
> > > > > > > > > For more options, visit https://groups.google.com/d/o
> > > > > > > > > ptou
> > > > > > > > > t.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > --
> > > > > > > > > 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.
> > > > > > > > > For more options, visit https://groups.google.com/d/o
> > > > > > > > > ptou
> > > > > > > > > t.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > > > --
> > > > > > > > > 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.
> > > > > > > > > For more options, visit https://groups.google.com/d/o
> > > > > > > > > ptou
> > > > > > > > > t.
> > > > > > > > > 
> > > > > > > > > 
> > > > > > > --
> > > > > > > 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
> > > > > > > .
> > > > > > > For more options, visit https://groups.google.com/d/optou
> > > > > > > t.
> > > > > > > 
> > > > > > > --
> > > > > > > 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
> > > > > > > .
> > > > > > > For more options, visit https://groups.google.com/d/optou
> > > > > > > t.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to