diff --git a/contrib/codecs/http/client.go b/contrib/codecs/http/client.go
index 2f01aa93798a961877848ac33415bef57b8fb4de..a707be42aa7d56c6a842c2b6768f18873ce5f6b5 100644
--- a/contrib/codecs/http/client.go
+++ b/contrib/codecs/http/client.go
@@ -59,7 +59,9 @@ func Dial(ctx context.Context, client *http.Client, target string) (*Client, err
 	if client == nil {
 		client = http.DefaultClient
 	}
-	return &Client{remote: target, c: client, headers: http.Header{}}, nil
+	return &Client{remote: target, c: client, headers: http.Header{
+		"Content-Type": []string{"application/json"},
+	}}, nil
 }
 
 func (c *Client) SetHeader(key string, value string) {
@@ -196,6 +198,5 @@ func (c *Client) postBuf(ctx context.Context, rd io.Reader) (*http.Response, err
 			}
 		}
 	}()
-	hreq.Header.Add("Content-Type", "application/json")
 	return c.c.Do(hreq)
 }
diff --git a/contrib/codecs/http/codec.go b/contrib/codecs/http/codec.go
index caa126e40886f0479ab7149899d0c24d43d02914..3a8e68066cd0483a77f07e407139dad074cba402 100644
--- a/contrib/codecs/http/codec.go
+++ b/contrib/codecs/http/codec.go
@@ -11,6 +11,7 @@ import (
 	"net/http"
 	"net/url"
 	"strings"
+	"sync"
 
 	"gfx.cafe/open/jrpc/pkg/codec"
 	"gfx.cafe/open/jrpc/pkg/serverutil"
@@ -29,6 +30,8 @@ type Codec struct {
 	msgs  chan *serverutil.Bundle
 	errCh chan httpError
 
+	mu sync.Mutex
+
 	i codec.PeerInfo
 }
 
diff --git a/pkg/server/responsewriter.go b/pkg/server/responsewriter.go
index e23a03eeacbd46dcb94215bf66c4766400a7aa5f..404e5858664c8901e8f9da98275ab6cc4900e737 100644
--- a/pkg/server/responsewriter.go
+++ b/pkg/server/responsewriter.go
@@ -65,6 +65,11 @@ func (c *callRespWriter) Send(v any, e error) (err error) {
 	if err != nil {
 		return err
 	}
+	select {
+	case <-c.ctx.Done():
+		return c.ctx.Err()
+	default:
+	}
 	defer c.cr.mu.Release(1)
 	if c.err != nil {
 		e = c.err
@@ -77,7 +82,6 @@ func (c *callRespWriter) Send(v any, e error) (err error) {
 	if v != nil {
 		ce.v = &v
 	}
-
 	err = c.cr.send(c.ctx, ce)
 	if err != nil {
 		return err