You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. // Copyright 2019 Huawei Technologies Co.,Ltd.
  2. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use
  3. // this file except in compliance with the License. You may obtain a copy of the
  4. // License at
  5. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software distributed
  9. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  10. // CONDITIONS OF ANY KIND, either express or implied. See the License for the
  11. // specific language governing permissions and limitations under the License.
  12. package obs
  13. import (
  14. "bytes"
  15. "errors"
  16. "fmt"
  17. "io"
  18. "math/rand"
  19. "net"
  20. "net/http"
  21. "net/url"
  22. "os"
  23. "strings"
  24. "time"
  25. )
  26. func prepareHeaders(headers map[string][]string, meta bool, isObs bool) map[string][]string {
  27. _headers := make(map[string][]string, len(headers))
  28. if headers != nil {
  29. for key, value := range headers {
  30. key = strings.TrimSpace(key)
  31. if key == "" {
  32. continue
  33. }
  34. _key := strings.ToLower(key)
  35. if _, ok := allowedRequestHTTPHeaderMetadataNames[_key]; !ok && !strings.HasPrefix(key, HEADER_PREFIX) && !strings.HasPrefix(key, HEADER_PREFIX_OBS) {
  36. if !meta {
  37. continue
  38. }
  39. if !isObs {
  40. _key = HEADER_PREFIX_META + _key
  41. } else {
  42. _key = HEADER_PREFIX_META_OBS + _key
  43. }
  44. } else {
  45. _key = key
  46. }
  47. _headers[_key] = value
  48. }
  49. }
  50. return _headers
  51. }
  52. func (obsClient ObsClient) doActionWithoutBucket(action, method string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  53. return obsClient.doAction(action, method, "", "", input, output, true, true, extensions)
  54. }
  55. func (obsClient ObsClient) doActionWithBucketV2(action, method, bucketName string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  56. if strings.TrimSpace(bucketName) == "" && !obsClient.conf.cname {
  57. return errors.New("Bucket is empty")
  58. }
  59. return obsClient.doAction(action, method, bucketName, "", input, output, false, true, extensions)
  60. }
  61. func (obsClient ObsClient) doActionWithBucket(action, method, bucketName string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  62. if strings.TrimSpace(bucketName) == "" && !obsClient.conf.cname {
  63. return errors.New("Bucket is empty")
  64. }
  65. return obsClient.doAction(action, method, bucketName, "", input, output, true, true, extensions)
  66. }
  67. func (obsClient ObsClient) doActionWithBucketAndKey(action, method, bucketName, objectKey string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  68. return obsClient._doActionWithBucketAndKey(action, method, bucketName, objectKey, input, output, true, extensions)
  69. }
  70. func (obsClient ObsClient) doActionWithBucketAndKeyV2(action, method, bucketName, objectKey string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  71. if strings.TrimSpace(bucketName) == "" && !obsClient.conf.cname {
  72. return errors.New("Bucket is empty")
  73. }
  74. if strings.TrimSpace(objectKey) == "" {
  75. return errors.New("Key is empty")
  76. }
  77. return obsClient.doAction(action, method, bucketName, objectKey, input, output, false, true, extensions)
  78. }
  79. func (obsClient ObsClient) doActionWithBucketAndKeyUnRepeatable(action, method, bucketName, objectKey string, input ISerializable, output IBaseModel, extensions []extensionOptions) error {
  80. return obsClient._doActionWithBucketAndKey(action, method, bucketName, objectKey, input, output, false, extensions)
  81. }
  82. func (obsClient ObsClient) _doActionWithBucketAndKey(action, method, bucketName, objectKey string, input ISerializable, output IBaseModel, repeatable bool, extensions []extensionOptions) error {
  83. if strings.TrimSpace(bucketName) == "" && !obsClient.conf.cname {
  84. return errors.New("Bucket is empty")
  85. }
  86. if strings.TrimSpace(objectKey) == "" {
  87. return errors.New("Key is empty")
  88. }
  89. return obsClient.doAction(action, method, bucketName, objectKey, input, output, true, repeatable, extensions)
  90. }
  91. func (obsClient ObsClient) doAction(action, method, bucketName, objectKey string, input ISerializable, output IBaseModel, xmlResult bool, repeatable bool, extensions []extensionOptions) error {
  92. var resp *http.Response
  93. var respError error
  94. doLog(LEVEL_INFO, "Enter method %s...", action)
  95. start := GetCurrentTimestamp()
  96. params, headers, data, err := input.trans(obsClient.conf.signature == SignatureObs)
  97. if err != nil {
  98. return err
  99. }
  100. if params == nil {
  101. params = make(map[string]string)
  102. }
  103. if headers == nil {
  104. headers = make(map[string][]string)
  105. }
  106. for _, extension := range extensions {
  107. if extensionHeader, ok := extension.(extensionHeaders); ok {
  108. _err := extensionHeader(headers, obsClient.conf.signature == SignatureObs)
  109. if _err != nil {
  110. doLog(LEVEL_WARN, fmt.Sprintf("set header with error: %v", _err))
  111. }
  112. } else {
  113. doLog(LEVEL_WARN, "Unsupported extensionOptions")
  114. }
  115. }
  116. switch method {
  117. case HTTP_GET:
  118. resp, respError = obsClient.doHTTPGet(bucketName, objectKey, params, headers, data, repeatable)
  119. case HTTP_POST:
  120. resp, respError = obsClient.doHTTPPost(bucketName, objectKey, params, headers, data, repeatable)
  121. case HTTP_PUT:
  122. resp, respError = obsClient.doHTTPPut(bucketName, objectKey, params, headers, data, repeatable)
  123. case HTTP_DELETE:
  124. resp, respError = obsClient.doHTTPDelete(bucketName, objectKey, params, headers, data, repeatable)
  125. case HTTP_HEAD:
  126. resp, respError = obsClient.doHTTPHead(bucketName, objectKey, params, headers, data, repeatable)
  127. case HTTP_OPTIONS:
  128. resp, respError = obsClient.doHTTPOptions(bucketName, objectKey, params, headers, data, repeatable)
  129. default:
  130. respError = errors.New("Unexpect http method error")
  131. }
  132. if respError == nil && output != nil {
  133. respError = ParseResponseToBaseModel(resp, output, xmlResult, obsClient.conf.signature == SignatureObs)
  134. if respError != nil {
  135. doLog(LEVEL_WARN, "Parse response to BaseModel with error: %v", respError)
  136. }
  137. } else {
  138. doLog(LEVEL_WARN, "Do http request with error: %v", respError)
  139. }
  140. if isDebugLogEnabled() {
  141. doLog(LEVEL_DEBUG, "End method %s, obsclient cost %d ms", action, (GetCurrentTimestamp() - start))
  142. }
  143. return respError
  144. }
  145. func (obsClient ObsClient) doHTTPGet(bucketName, objectKey string, params map[string]string,
  146. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  147. return obsClient.doHTTP(HTTP_GET, bucketName, objectKey, params, prepareHeaders(headers, false, obsClient.conf.signature == SignatureObs), data, repeatable)
  148. }
  149. func (obsClient ObsClient) doHTTPHead(bucketName, objectKey string, params map[string]string,
  150. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  151. return obsClient.doHTTP(HTTP_HEAD, bucketName, objectKey, params, prepareHeaders(headers, false, obsClient.conf.signature == SignatureObs), data, repeatable)
  152. }
  153. func (obsClient ObsClient) doHTTPOptions(bucketName, objectKey string, params map[string]string,
  154. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  155. return obsClient.doHTTP(HTTP_OPTIONS, bucketName, objectKey, params, prepareHeaders(headers, false, obsClient.conf.signature == SignatureObs), data, repeatable)
  156. }
  157. func (obsClient ObsClient) doHTTPDelete(bucketName, objectKey string, params map[string]string,
  158. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  159. return obsClient.doHTTP(HTTP_DELETE, bucketName, objectKey, params, prepareHeaders(headers, false, obsClient.conf.signature == SignatureObs), data, repeatable)
  160. }
  161. func (obsClient ObsClient) doHTTPPut(bucketName, objectKey string, params map[string]string,
  162. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  163. return obsClient.doHTTP(HTTP_PUT, bucketName, objectKey, params, prepareHeaders(headers, true, obsClient.conf.signature == SignatureObs), data, repeatable)
  164. }
  165. func (obsClient ObsClient) doHTTPPost(bucketName, objectKey string, params map[string]string,
  166. headers map[string][]string, data interface{}, repeatable bool) (*http.Response, error) {
  167. return obsClient.doHTTP(HTTP_POST, bucketName, objectKey, params, prepareHeaders(headers, true, obsClient.conf.signature == SignatureObs), data, repeatable)
  168. }
  169. func (obsClient ObsClient) doHTTPWithSignedURL(action, method string, signedURL string, actualSignedRequestHeaders http.Header, data io.Reader, output IBaseModel, xmlResult bool) (respError error) {
  170. req, err := http.NewRequest(method, signedURL, data)
  171. if err != nil {
  172. return err
  173. }
  174. if obsClient.conf.ctx != nil {
  175. req = req.WithContext(obsClient.conf.ctx)
  176. }
  177. var resp *http.Response
  178. var isSecurityToken bool
  179. var securityToken string
  180. var query []string
  181. parmas := strings.Split(signedURL, "?")
  182. if len(parmas) > 1 {
  183. query = strings.Split(parmas[1], "&")
  184. for _, value := range query {
  185. if strings.HasPrefix(value, HEADER_STS_TOKEN_AMZ+"=") || strings.HasPrefix(value, HEADER_STS_TOKEN_OBS+"=") {
  186. if value[len(HEADER_STS_TOKEN_AMZ)+1:] != "" {
  187. securityToken = value[len(HEADER_STS_TOKEN_AMZ)+1:]
  188. isSecurityToken = true
  189. }
  190. }
  191. }
  192. }
  193. logSignedURL := signedURL
  194. if isSecurityToken {
  195. logSignedURL = strings.Replace(logSignedURL, securityToken, "******", -1)
  196. }
  197. doLog(LEVEL_INFO, "Do %s with signedUrl %s...", action, logSignedURL)
  198. req.Header = actualSignedRequestHeaders
  199. if value, ok := req.Header[HEADER_HOST_CAMEL]; ok {
  200. req.Host = value[0]
  201. delete(req.Header, HEADER_HOST_CAMEL)
  202. } else if value, ok := req.Header[HEADER_HOST]; ok {
  203. req.Host = value[0]
  204. delete(req.Header, HEADER_HOST)
  205. }
  206. if value, ok := req.Header[HEADER_CONTENT_LENGTH_CAMEL]; ok {
  207. req.ContentLength = StringToInt64(value[0], -1)
  208. delete(req.Header, HEADER_CONTENT_LENGTH_CAMEL)
  209. } else if value, ok := req.Header[HEADER_CONTENT_LENGTH]; ok {
  210. req.ContentLength = StringToInt64(value[0], -1)
  211. delete(req.Header, HEADER_CONTENT_LENGTH)
  212. }
  213. req.Header[HEADER_USER_AGENT_CAMEL] = []string{USER_AGENT}
  214. start := GetCurrentTimestamp()
  215. resp, err = obsClient.httpClient.Do(req)
  216. if isInfoLogEnabled() {
  217. doLog(LEVEL_INFO, "Do http request cost %d ms", (GetCurrentTimestamp() - start))
  218. }
  219. var msg interface{}
  220. if err != nil {
  221. respError = err
  222. resp = nil
  223. } else {
  224. doLog(LEVEL_DEBUG, "Response headers: %v", resp.Header)
  225. if resp.StatusCode >= 300 {
  226. respError = ParseResponseToObsError(resp, obsClient.conf.signature == SignatureObs)
  227. msg = resp.Status
  228. resp = nil
  229. } else {
  230. if output != nil {
  231. respError = ParseResponseToBaseModel(resp, output, xmlResult, obsClient.conf.signature == SignatureObs)
  232. }
  233. if respError != nil {
  234. doLog(LEVEL_WARN, "Parse response to BaseModel with error: %v", respError)
  235. }
  236. }
  237. }
  238. if msg != nil {
  239. doLog(LEVEL_ERROR, "Failed to send request with reason:%v", msg)
  240. }
  241. if isDebugLogEnabled() {
  242. doLog(LEVEL_DEBUG, "End method %s, obsclient cost %d ms", action, (GetCurrentTimestamp() - start))
  243. }
  244. return
  245. }
  246. func (obsClient ObsClient) doHTTP(method, bucketName, objectKey string, params map[string]string,
  247. headers map[string][]string, data interface{}, repeatable bool) (resp *http.Response, respError error) {
  248. bucketName = strings.TrimSpace(bucketName)
  249. method = strings.ToUpper(method)
  250. var redirectURL string
  251. var requestURL string
  252. maxRetryCount := obsClient.conf.maxRetryCount
  253. maxRedirectCount := obsClient.conf.maxRedirectCount
  254. var _data io.Reader
  255. if data != nil {
  256. if dataStr, ok := data.(string); ok {
  257. doLog(LEVEL_DEBUG, "Do http request with string: %s", dataStr)
  258. headers["Content-Length"] = []string{IntToString(len(dataStr))}
  259. _data = strings.NewReader(dataStr)
  260. } else if dataByte, ok := data.([]byte); ok {
  261. doLog(LEVEL_DEBUG, "Do http request with byte array")
  262. headers["Content-Length"] = []string{IntToString(len(dataByte))}
  263. _data = bytes.NewReader(dataByte)
  264. } else if dataReader, ok := data.(io.Reader); ok {
  265. _data = dataReader
  266. } else {
  267. doLog(LEVEL_WARN, "Data is not a valid io.Reader")
  268. return nil, errors.New("Data is not a valid io.Reader")
  269. }
  270. }
  271. var lastRequest *http.Request
  272. redirectFlag := false
  273. for i, redirectCount := 0, 0; i <= maxRetryCount; i++ {
  274. if redirectURL != "" {
  275. if !redirectFlag {
  276. parsedRedirectURL, err := url.Parse(redirectURL)
  277. if err != nil {
  278. return nil, err
  279. }
  280. requestURL, err = obsClient.doAuth(method, bucketName, objectKey, params, headers, parsedRedirectURL.Host)
  281. if err != nil {
  282. return nil, err
  283. }
  284. if parsedRequestURL, err := url.Parse(requestURL); err != nil {
  285. return nil, err
  286. } else if parsedRequestURL.RawQuery != "" && parsedRedirectURL.RawQuery == "" {
  287. redirectURL += "?" + parsedRequestURL.RawQuery
  288. }
  289. }
  290. requestURL = redirectURL
  291. } else {
  292. var err error
  293. requestURL, err = obsClient.doAuth(method, bucketName, objectKey, params, headers, "")
  294. if err != nil {
  295. return nil, err
  296. }
  297. }
  298. req, err := http.NewRequest(method, requestURL, _data)
  299. if obsClient.conf.ctx != nil {
  300. req = req.WithContext(obsClient.conf.ctx)
  301. }
  302. if err != nil {
  303. return nil, err
  304. }
  305. doLog(LEVEL_DEBUG, "Do request with url [%s] and method [%s]", requestURL, method)
  306. if isDebugLogEnabled() {
  307. auth := headers[HEADER_AUTH_CAMEL]
  308. delete(headers, HEADER_AUTH_CAMEL)
  309. var isSecurityToken bool
  310. var securityToken []string
  311. if securityToken, isSecurityToken = headers[HEADER_STS_TOKEN_AMZ]; isSecurityToken {
  312. headers[HEADER_STS_TOKEN_AMZ] = []string{"******"}
  313. } else if securityToken, isSecurityToken = headers[HEADER_STS_TOKEN_OBS]; isSecurityToken {
  314. headers[HEADER_STS_TOKEN_OBS] = []string{"******"}
  315. }
  316. doLog(LEVEL_DEBUG, "Request headers: %v", headers)
  317. headers[HEADER_AUTH_CAMEL] = auth
  318. if isSecurityToken {
  319. if obsClient.conf.signature == SignatureObs {
  320. headers[HEADER_STS_TOKEN_OBS] = securityToken
  321. } else {
  322. headers[HEADER_STS_TOKEN_AMZ] = securityToken
  323. }
  324. }
  325. }
  326. for key, value := range headers {
  327. if key == HEADER_HOST_CAMEL {
  328. req.Host = value[0]
  329. delete(headers, key)
  330. } else if key == HEADER_CONTENT_LENGTH_CAMEL {
  331. req.ContentLength = StringToInt64(value[0], -1)
  332. delete(headers, key)
  333. } else {
  334. req.Header[key] = value
  335. }
  336. }
  337. lastRequest = req
  338. req.Header[HEADER_USER_AGENT_CAMEL] = []string{USER_AGENT}
  339. if lastRequest != nil {
  340. req.Host = lastRequest.Host
  341. req.ContentLength = lastRequest.ContentLength
  342. }
  343. start := GetCurrentTimestamp()
  344. resp, err = obsClient.httpClient.Do(req)
  345. if isInfoLogEnabled() {
  346. doLog(LEVEL_INFO, "Do http request cost %d ms", (GetCurrentTimestamp() - start))
  347. }
  348. var msg interface{}
  349. if err != nil {
  350. msg = err
  351. respError = err
  352. resp = nil
  353. if !repeatable {
  354. break
  355. }
  356. } else {
  357. doLog(LEVEL_DEBUG, "Response headers: %v", resp.Header)
  358. if resp.StatusCode < 300 {
  359. break
  360. } else if !repeatable || (resp.StatusCode >= 400 && resp.StatusCode < 500) || resp.StatusCode == 304 {
  361. respError = ParseResponseToObsError(resp, obsClient.conf.signature == SignatureObs)
  362. resp = nil
  363. break
  364. } else if resp.StatusCode >= 300 && resp.StatusCode < 400 {
  365. if location := resp.Header.Get(HEADER_LOCATION_CAMEL); location != "" && redirectCount < maxRedirectCount {
  366. redirectURL = location
  367. doLog(LEVEL_WARN, "Redirect request to %s", redirectURL)
  368. msg = resp.Status
  369. maxRetryCount++
  370. redirectCount++
  371. if resp.StatusCode == 302 && method == HTTP_GET {
  372. redirectFlag = true
  373. } else {
  374. redirectFlag = false
  375. }
  376. } else {
  377. respError = ParseResponseToObsError(resp, obsClient.conf.signature == SignatureObs)
  378. resp = nil
  379. break
  380. }
  381. } else {
  382. msg = resp.Status
  383. }
  384. }
  385. if i != maxRetryCount {
  386. if resp != nil {
  387. _err := resp.Body.Close()
  388. if _err != nil {
  389. doLog(LEVEL_WARN, "Failed to close resp body")
  390. }
  391. resp = nil
  392. }
  393. if _, ok := headers[HEADER_AUTH_CAMEL]; ok {
  394. delete(headers, HEADER_AUTH_CAMEL)
  395. }
  396. doLog(LEVEL_WARN, "Failed to send request with reason:%v, will try again", msg)
  397. if r, ok := _data.(*strings.Reader); ok {
  398. _, err := r.Seek(0, 0)
  399. if err != nil {
  400. return nil, err
  401. }
  402. } else if r, ok := _data.(*bytes.Reader); ok {
  403. _, err := r.Seek(0, 0)
  404. if err != nil {
  405. return nil, err
  406. }
  407. } else if r, ok := _data.(*fileReaderWrapper); ok {
  408. fd, err := os.Open(r.filePath)
  409. if err != nil {
  410. return nil, err
  411. }
  412. defer func() {
  413. errMsg := fd.Close()
  414. if errMsg != nil {
  415. doLog(LEVEL_WARN, "Failed to close with reason: %v", errMsg)
  416. }
  417. }()
  418. fileReaderWrapper := &fileReaderWrapper{filePath: r.filePath}
  419. fileReaderWrapper.mark = r.mark
  420. fileReaderWrapper.reader = fd
  421. fileReaderWrapper.totalCount = r.totalCount
  422. _data = fileReaderWrapper
  423. _, err = fd.Seek(r.mark, 0)
  424. if err != nil {
  425. return nil, err
  426. }
  427. } else if r, ok := _data.(*readerWrapper); ok {
  428. _, err := r.seek(0, 0)
  429. if err != nil {
  430. return nil, err
  431. }
  432. }
  433. time.Sleep(time.Duration(float64(i+2) * rand.Float64() * float64(time.Second)))
  434. } else {
  435. doLog(LEVEL_ERROR, "Failed to send request with reason:%v", msg)
  436. if resp != nil {
  437. respError = ParseResponseToObsError(resp, obsClient.conf.signature == SignatureObs)
  438. resp = nil
  439. }
  440. }
  441. }
  442. return
  443. }
  444. type connDelegate struct {
  445. conn net.Conn
  446. socketTimeout time.Duration
  447. finalTimeout time.Duration
  448. }
  449. func getConnDelegate(conn net.Conn, socketTimeout int, finalTimeout int) *connDelegate {
  450. return &connDelegate{
  451. conn: conn,
  452. socketTimeout: time.Second * time.Duration(socketTimeout),
  453. finalTimeout: time.Second * time.Duration(finalTimeout),
  454. }
  455. }
  456. func (delegate *connDelegate) Read(b []byte) (n int, err error) {
  457. setReadDeadlineErr := delegate.SetReadDeadline(time.Now().Add(delegate.socketTimeout))
  458. flag := isDebugLogEnabled()
  459. if setReadDeadlineErr != nil && flag {
  460. doLog(LEVEL_DEBUG, "Failed to set read deadline with reason: %v, but it's ok", setReadDeadlineErr)
  461. }
  462. n, err = delegate.conn.Read(b)
  463. setReadDeadlineErr = delegate.SetReadDeadline(time.Now().Add(delegate.finalTimeout))
  464. if setReadDeadlineErr != nil && flag {
  465. doLog(LEVEL_DEBUG, "Failed to set read deadline with reason: %v, but it's ok", setReadDeadlineErr)
  466. }
  467. return n, err
  468. }
  469. func (delegate *connDelegate) Write(b []byte) (n int, err error) {
  470. setWriteDeadlineErr := delegate.SetWriteDeadline(time.Now().Add(delegate.socketTimeout))
  471. flag := isDebugLogEnabled()
  472. if setWriteDeadlineErr != nil && flag {
  473. doLog(LEVEL_DEBUG, "Failed to set write deadline with reason: %v, but it's ok", setWriteDeadlineErr)
  474. }
  475. n, err = delegate.conn.Write(b)
  476. finalTimeout := time.Now().Add(delegate.finalTimeout)
  477. setWriteDeadlineErr = delegate.SetWriteDeadline(finalTimeout)
  478. if setWriteDeadlineErr != nil && flag {
  479. doLog(LEVEL_DEBUG, "Failed to set write deadline with reason: %v, but it's ok", setWriteDeadlineErr)
  480. }
  481. setReadDeadlineErr := delegate.SetReadDeadline(finalTimeout)
  482. if setReadDeadlineErr != nil && flag {
  483. doLog(LEVEL_DEBUG, "Failed to set read deadline with reason: %v, but it's ok", setReadDeadlineErr)
  484. }
  485. return n, err
  486. }
  487. func (delegate *connDelegate) Close() error {
  488. return delegate.conn.Close()
  489. }
  490. func (delegate *connDelegate) LocalAddr() net.Addr {
  491. return delegate.conn.LocalAddr()
  492. }
  493. func (delegate *connDelegate) RemoteAddr() net.Addr {
  494. return delegate.conn.RemoteAddr()
  495. }
  496. func (delegate *connDelegate) SetDeadline(t time.Time) error {
  497. return delegate.conn.SetDeadline(t)
  498. }
  499. func (delegate *connDelegate) SetReadDeadline(t time.Time) error {
  500. return delegate.conn.SetReadDeadline(t)
  501. }
  502. func (delegate *connDelegate) SetWriteDeadline(t time.Time) error {
  503. return delegate.conn.SetWriteDeadline(t)
  504. }