Как установить заголовки HTTP-запросов при использовании Go-Github и http.Transport? - PullRequest
0 голосов
/ 30 сентября 2019

Я пишу приложение, которое использует API GitHub для просмотра репозиториев в моих организациях GitHub. Я использую библиотеку github.com/google/go-github.

Я также использую github.com/gregjones/httpcache, чтобы я мог выполнять аутентификацию на основе токенов, а также устанавливать условные заголовки для вызовов API. У меня аутентификация работает следующим образом:

ctx := context.Background()

// GitHUb API authentication
transport = &oauth2.Transport{
    Source: oauth2.StaticTokenSource(
        &oauth2.Token{
            AccessToken: gh.tokens.GitHub.Token,
        },
    ),
}

// Configure HTTP memory caching
transport = &httpcache.Transport{
    Transport:           transport,
    Cache:               httpcache.NewMemoryCache(),
    MarkCachedResponses: true,
}

// Create the http client that GutHUb will use
httpClient := &http.Client{
    Transport: transport,
}

// Attempt to login to GitHub
client := github.NewClient(httpClient)

Однако я не могу понять, как добавить необходимый заголовок If-Match, когда я использую client.Repositories.Get, например. Это так, чтобы я мог работать, если репозиторий изменился за последние 24 часа для примера.

Я искал, как это сделать, но примеры, с которыми я сталкиваюсь, показывают, как создать клиент HTTP, а затем создатьзапрос (чтобы можно было добавить заголовки), а затем выполнить действие Do. Однако, поскольку я использую клиент напрямую, у меня нет этой опции.

В документации для go-github говорится, что для условных запросов:

API GitHub имеет хорошую поддержку для условныхзапросы, которые помогут вам избежать прожига лимита и ускорить работу вашего приложения. go-github не обрабатывает условные запросы напрямую, а предназначен для работы с кэширующим http.Transport. Для этого мы рекомендуем использовать https://github.com/gregjones/httpcache.

Подробнее об условных запросах GitHub можно узнать по адресу https://developer.github.com/v3/#conditional-requests.

Я не знаю, как добавить его в свойкод, любая помощь с благодарностью.

1 Ответ

1 голос
/ 30 сентября 2019

Как и в случае с этими вещами, вскоре после публикации моего вопроса я нашел ответ.

Хитрость заключается в том, чтобы установить заголовки, используя Base в транспорте Oauth2, таким образом:

transport = &oauth2.Transport{
    Source: oauth2.StaticTokenSource(
        &oauth2.Token{
            AccessToken: gh.tokens.GitHub.Token,
        },
    ),
    Base: &transportHeaders{
        modifiedSince: modifiedSince,
    },
}

Структура и метод выглядят следующим образом:

type transportHeaders struct {
    modifiedSince string
}

func (t *transportHeaders) RoundTrip(req *http.Request) (*http.Response, error) {

    // Determine the last modified date based on the transportHeader options
    // Do not add any headers if blank or zero
    if t.modifiedSince != "" {
        req.Header.Set("If-Modified-Since", t.modifiedSince)
    }

    return http.DefaultTransport.RoundTrip(req)
}

Таким образом, я могу перехватить вызов RoundTrip и добавить свой собственный заголовок. Теперь это означает, что я могу проверить ресурсы и посмотреть, возвращают ли они код состояния HTTP 304. Например:

ERRO[0001] Error retrieving repository                   error="GET https://api.github.com/repos/chef-partners/camsa-setup: 304  []" name=camsa-setup vcs=github

Я понял, как это сделать, когда наткнулся на эту страницу - https://github.com/rmichela/go-reddit/blob/bd882abbb7496c54dbde66d92c35ad95d4db1211/authenticator.go#L117

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...