(w http.ResponseWriter, r *http.Request)
| 121 | } |
| 122 | |
| 123 | func (h *Hub) initSubscription(w http.ResponseWriter, r *http.Request) (span trace.Span, currentURL, lastEventID string, subscribers []*Subscriber, ok bool) { |
| 124 | ctx, span := startSpan(r.Context(), "mercure.subscriptions", trace.WithSpanKind(trace.SpanKindInternal)) |
| 125 | currentURL = r.URL.RequestURI() |
| 126 | |
| 127 | if h.subscriberJWTKeyFunc != nil { |
| 128 | claims, err := h.authorize(r, false) |
| 129 | if err != nil || claims == nil || claims.Mercure.Subscribe == nil || !canReceive(h.topicSelectorStore, []string{currentURL}, claims.Mercure.Subscribe) { |
| 130 | h.httpAuthorizationError(w, r, err) |
| 131 | |
| 132 | if err != nil { |
| 133 | recordSpanError(span, err) |
| 134 | } |
| 135 | |
| 136 | return span, "", "", nil, false |
| 137 | } |
| 138 | } |
| 139 | |
| 140 | transport, ok := h.transport.(TransportSubscribers) |
| 141 | if !ok { |
| 142 | panic("The transport isn't an instance of hub.TransportSubscribers") |
| 143 | } |
| 144 | |
| 145 | var err error |
| 146 | |
| 147 | lastEventID, subscribers, err = transport.GetSubscribers(ctx) |
| 148 | if err != nil { |
| 149 | http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) |
| 150 | |
| 151 | if h.logger.Enabled(ctx, slog.LevelError) { |
| 152 | h.logger.LogAttrs(ctx, slog.LevelError, "Error retrieving subscribers", slog.Any("error", err)) |
| 153 | } |
| 154 | |
| 155 | recordSpanError(span, err) |
| 156 | |
| 157 | return span, currentURL, lastEventID, subscribers, false |
| 158 | } |
| 159 | |
| 160 | if r.Header.Get("If-None-Match") == lastEventID { |
| 161 | w.WriteHeader(http.StatusNotModified) |
| 162 | |
| 163 | return span, "", "", nil, false |
| 164 | } |
| 165 | |
| 166 | header := w.Header() |
| 167 | header["Content-Type"] = jsonldContentType |
| 168 | header["ETag"] = []string{lastEventID} |
| 169 | |
| 170 | return span, currentURL, lastEventID, subscribers, true |
| 171 | } |
no test coverage detected