MCPcopy
hub / github.com/connectrpc/connect-go / validateResponse

Method validateResponse

protocol_connect.go:506–567  ·  view source on GitHub ↗
(response *http.Response)

Source from the content-addressed store, hash-verified

504}
505
506func (cc *connectUnaryClientConn) validateResponse(response *http.Response) *Error {
507 for k, v := range response.Header {
508 if !strings.HasPrefix(k, connectUnaryTrailerPrefix) {
509 cc.responseHeader[k] = v
510 continue
511 }
512 cc.responseTrailer[k[len(connectUnaryTrailerPrefix):]] = v
513 }
514 if err := connectValidateUnaryResponseContentType(
515 cc.marshaler.codec.Name(),
516 cc.duplexCall.Method(),
517 response.StatusCode,
518 response.Status,
519 getHeaderCanonical(response.Header, headerContentType),
520 ); err != nil {
521 if IsNotModifiedError(err) {
522 // Allow access to response headers for this kind of error.
523 // RFC 9110 doesn't allow trailers on 304s, so we only need to include headers.
524 err.meta = cc.responseHeader.Clone()
525 }
526 return err
527 }
528 compression := getHeaderCanonical(response.Header, connectUnaryHeaderCompression)
529 if compression != "" &&
530 compression != compressionIdentity &&
531 !cc.compressionPools.Contains(compression) {
532 return errorf(
533 CodeInternal,
534 "unknown encoding %q: accepted encodings are %v",
535 compression,
536 cc.compressionPools.CommaSeparatedNames(),
537 )
538 }
539 cc.unmarshaler.compressionPool = cc.compressionPools.Get(compression)
540 if response.StatusCode != http.StatusOK {
541 unmarshaler := connectUnaryUnmarshaler{
542 ctx: cc.unmarshaler.ctx,
543 reader: response.Body,
544 compressionPool: cc.unmarshaler.compressionPool,
545 bufferPool: cc.bufferPool,
546 }
547 var wireErr connectWireError
548 if err := unmarshaler.UnmarshalFunc(&wireErr, json.Unmarshal); err != nil {
549 return NewError(
550 httpToCode(response.StatusCode),
551 errors.New(response.Status),
552 )
553 }
554 if wireErr.Code == 0 {
555 // code not set? default to one implied by HTTP status
556 wireErr.Code = httpToCode(response.StatusCode)
557 }
558 serverErr := wireErr.asError()
559 if serverErr == nil {
560 return nil
561 }
562 serverErr.meta = cc.responseHeader.Clone()
563 mergeHeaders(serverErr.meta, cc.responseTrailer)

Callers

nothing calls this directly

Calls 14

UnmarshalFuncMethod · 0.95
asErrorMethod · 0.95
getHeaderCanonicalFunction · 0.85
IsNotModifiedErrorFunction · 0.85
errorfFunction · 0.85
NewErrorFunction · 0.85
httpToCodeFunction · 0.85
mergeHeadersFunction · 0.85
NameMethod · 0.65
MethodMethod · 0.65
ContainsMethod · 0.65

Tested by

no test coverage detected