in dialer.go [510:579]
func (d *Dialer) metadataExchange(conn net.Conn) error {
tok, err := d.iamTokenSource.Token()
if err != nil {
return err
}
authType := connectorspb.MetadataExchangeRequest_DB_NATIVE
if d.useIAMAuthN {
authType = connectorspb.MetadataExchangeRequest_AUTO_IAM
}
req := &connectorspb.MetadataExchangeRequest{
UserAgent: d.userAgent,
AuthType: authType,
Oauth2Token: tok.AccessToken,
}
m, err := proto.Marshal(req)
if err != nil {
return err
}
b := d.buffer.get()
defer d.buffer.put(b)
buf := *b
reqSize := proto.Size(req)
binary.BigEndian.PutUint32(buf, uint32(reqSize))
buf = append(buf[:4], m...)
// Set IO deadline before write
err = conn.SetDeadline(time.Now().Add(ioTimeout))
if err != nil {
return err
}
defer conn.SetDeadline(time.Time{})
_, err = conn.Write(buf)
if err != nil {
return err
}
// Reset IO deadline before read
err = conn.SetDeadline(time.Now().Add(ioTimeout))
if err != nil {
return err
}
defer conn.SetDeadline(time.Time{})
buf = buf[:4]
_, err = conn.Read(buf)
if err != nil {
return err
}
respSize := binary.BigEndian.Uint32(buf)
resp := buf[:respSize]
_, err = conn.Read(resp)
if err != nil {
return err
}
var mdxResp connectorspb.MetadataExchangeResponse
err = proto.Unmarshal(resp, &mdxResp)
if err != nil {
return err
}
if mdxResp.GetResponseCode() != connectorspb.MetadataExchangeResponse_OK {
return errors.New(mdxResp.GetError())
}
return nil
}