Skip to content

[#63] Fix HTTP transport by removing duplication of base transport #66

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 4 additions & 47 deletions transport/http/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,14 @@ import (
"encoding/json"
"fmt"
"net/http"
"sync"

"github.com/metoro-io/mcp-golang/transport"
)

// HTTPTransport implements a stateless HTTP transport for MCP
type HTTPTransport struct {
*baseTransport
server *http.Server
endpoint string
messageHandler func(ctx context.Context, message *transport.BaseJsonRpcMessage)
errorHandler func(error)
closeHandler func()
mu sync.RWMutex
addr string
responseMap map[int64]chan *transport.BaseJsonRpcMessage
server *http.Server
endpoint string
addr string
}

// NewHTTPTransport creates a new HTTP transport that listens on the specified endpoint
Expand All @@ -29,7 +21,6 @@ func NewHTTPTransport(endpoint string) *HTTPTransport {
baseTransport: newBaseTransport(),
endpoint: endpoint,
addr: ":8080", // Default port
responseMap: make(map[int64]chan *transport.BaseJsonRpcMessage),
}
}

Expand All @@ -52,49 +43,15 @@ func (t *HTTPTransport) Start(ctx context.Context) error {
return t.server.ListenAndServe()
}

// Send implements Transport.Send
func (t *HTTPTransport) Send(ctx context.Context, message *transport.BaseJsonRpcMessage) error {
key := message.JsonRpcResponse.Id
responseChannel := t.responseMap[int64(key)]
if responseChannel == nil {
return fmt.Errorf("no response channel found for key: %d", key)
}
responseChannel <- message
return nil
}

// Close implements Transport.Close
func (t *HTTPTransport) Close() error {
if t.server != nil {
if err := t.server.Close(); err != nil {
return err
}
}
if t.closeHandler != nil {
t.closeHandler()
}
return nil
}

// SetCloseHandler implements Transport.SetCloseHandler
func (t *HTTPTransport) SetCloseHandler(handler func()) {
t.mu.Lock()
defer t.mu.Unlock()
t.closeHandler = handler
}

// SetErrorHandler implements Transport.SetErrorHandler
func (t *HTTPTransport) SetErrorHandler(handler func(error)) {
t.mu.Lock()
defer t.mu.Unlock()
t.errorHandler = handler
}

// SetMessageHandler implements Transport.SetMessageHandler
func (t *HTTPTransport) SetMessageHandler(handler func(ctx context.Context, message *transport.BaseJsonRpcMessage)) {
t.mu.Lock()
defer t.mu.Unlock()
t.messageHandler = handler
return t.baseTransport.Close()
}

func (t *HTTPTransport) handleRequest(w http.ResponseWriter, r *http.Request) {
Expand Down
Loading