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 <reng...@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 <
> golang-nuts@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 <johnsiil...@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+unsubscr...@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+unsubscr...@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 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/CAGabyPoLQr5Te5VxXpyvoZn4Cs3Lh64GKPWk%2Bk-LyQNA3KnS1w%40mail.gmail.com.

Reply via email to