Just as a follow-up, I think the answer to this question is to fork the 
net/http library to add a line that handles an error type ErrIgnore without 
the ramifications of a temporary error.  With all the good and bad that it 
entails (for this use case, it should be fine).

This is just a niche use case, I can't imagine a change to support this 
getting into the net/http package.  

On Monday, March 28, 2022 at 8:28:31 PM UTC-7 John wrote:

> Hey Sean and Robert,
>
> Thanks for the suggestions. 
>
> I can see how the temporary error would work, but as Sean is saying, this 
> is going to add delays that are going to go against what I'm wanting to do. 
>
> Sean, I'm not sure I understand the part about looping my code.  Here is a 
> sample on the playground, is it possible you can show me what I'm missing:
> https://go.dev/play/p/_B4jkTzWcS0
>
> Cheers.
>
> On Mon, Mar 28, 2022 at 4:47 PM 'Sean Liao' via golang-nuts <
> golan...@googlegroups.com> wrote:
>
>> abusing temporary delays like that could result in unpredictable 
>> performance with up to a second between accepts, not something you want if 
>> you are flooded with things you want to deny (which is what an ACL is for).
>>
>> On Mon, Mar 28, 2022, 23:46 robert engels <ren...@ix.netcom.com> wrote:
>>
>>> You just need to return a temporary error. It should not be exiting 
>>> anyway - unless the “done” channel is valid.
>>>
>>> ctx := context.WithValue(baseCtx, ServerContextKey, srv)
>>> for {
>>>    rw, err := l.Accept()
>>>    if err != nil {
>>>       select {
>>>       case <-srv.getDoneChan():
>>>          return ErrServerClosed
>>>       default:
>>>       }
>>>       if ne, ok := err.(net.Error); ok && ne.Temporary() {
>>>          if tempDelay == 0 {
>>>             tempDelay = 5 * time.Millisecond
>>>          } else {
>>>             tempDelay *= 2
>>>          }
>>>          if max := 1 * time.Second; tempDelay > max {
>>>             tempDelay = max
>>>          }
>>>          srv.logf("http: Accept error: %v; retrying in 
>>> %v", err, tempDelay)
>>>          time.Sleep(tempDelay)
>>>          continue
>>>       }
>>>       return err
>>>    }
>>>
>>>
>>>
>>> On Mar 28, 2022, at 5:35 PM, 'Sean Liao' via golang-nuts <
>>> golan...@googlegroups.com> wrote:
>>>
>>> I would just add a for loop around your code and only return when you 
>>> have a connection you want to allow, otherwise just log / pass the error 
>>> elsewhere.
>>>
>>>
>>> On Mon, Mar 28, 2022 at 11:26 PM John <johns...@gmail.com> wrote:
>>>
>>>> I'm looking to satisfy this:
>>>>
>>>>    - If you are in an ACL, you can make a TLS connection
>>>>    - If you are not in an ACL, you can only a TCP connection, but not 
>>>>    a TLS connection*
>>>>
>>>> ** It would be better if it didn't honor TCP either, unless it is a 
>>>> health probe*
>>>>
>>>> Basically I want to move my denials into the listener and not in the 
>>>> http.Server handlers.
>>>>
>>>> I thought I was clever recently, trying to do this with:
>>>>
>>>> func (a *aclListener) Accept() (net.Conn, error) {
>>>> conn, err := a.ln.Accept()
>>>> if err != nil {
>>>> return nil, err
>>>> }
>>>>
>>>> host, _, err := net.SplitHostPort(conn.RemoteAddr().String())
>>>> if err != nil {
>>>> return nil, fmt.Errorf("connection's remote address(%s) could not be 
>>>> split: %s", conn.RemoteAddr().String(), err)
>>>> }
>>>>
>>>> // The probe connected, so close the connection and exit.
>>>> if a.acls.isProbe(host) {
>>>> log.Printf("TCP probe(%s) connection", host)
>>>> conn.Close()
>>>> return nil, ErrIsProbe
>>>> }
>>>>
>>>>   // Block anything that isn't in our ACL.
>>>> if err := a.acls.ipAuth(host); err != nil {
>>>> return nil, err
>>>> }
>>>> log.Println("accepting connection from: ", conn.RemoteAddr().String())
>>>> return conn, nil
>>>> }
>>>>
>>>> aclListener implements a net.Listener and I was going to allow the TCP 
>>>> probe from this
>>>> health service, but nothing more (like seeing the TLS header).
>>>> However, it turns out erroring on an Accept() will cause the 
>>>> http.Server to stop.
>>>>
>>>> Of course, if this code did work, the difference between the prober and 
>>>> non-ACL connections is the same, they both can get the TCP socket 
>>>> before being denied.
>>>>
>>>> Does anyone know if I can achieve this in my code without getting super 
>>>> hacky? I can see
>>>> some ways to that, but figured someone here might have done this in a 
>>>> simple way.
>>>>
>>>> Cheers and 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.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/golang-nuts/4ab235c1-ab52-42de-a22a-a31bde21eb0cn%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/golang-nuts/4ab235c1-ab52-42de-a22a-a31bde21eb0cn%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...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/CAGabyPowCpbccC3Hr1_QYqC0qJnqsbP8W9C7z%3DU%2BPdD_%3DWxEpQ%40mail.gmail.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/CAGabyPowCpbccC3Hr1_QYqC0qJnqsbP8W9C7z%3DU%2BPdD_%3DWxEpQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>>
>>> -- 
>>
> You received this message because you are subscribed to a topic in the 
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/golang-nuts/tqT_Cv574rU/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> golang-nuts...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/CAGabyPoLQr5Te5VxXpyvoZn4Cs3Lh64GKPWk%2Bk-LyQNA3KnS1w%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/CAGabyPoLQr5Te5VxXpyvoZn4Cs3Lh64GKPWk%2Bk-LyQNA3KnS1w%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
> John Doak
> www.obscuredworld.com
>

-- 
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/6658c50a-32c9-4f6d-a713-e84a97c56868n%40googlegroups.com.

Reply via email to