(resp *http.Response)
| 174 | } |
| 175 | |
| 176 | func (x *XHRSession) handleResp(resp *http.Response) (msg string, again bool, err error) { |
| 177 | defer resp.Body.Close() |
| 178 | |
| 179 | switch resp.StatusCode { |
| 180 | case http.StatusOK: |
| 181 | case http.StatusNotFound: |
| 182 | x.Close(3000, "session not found") // invalidate session - see details: sockjs/sockjs-client#66 |
| 183 | |
| 184 | return "", false, &ErrSession{ |
| 185 | Type: config.XHRPolling, |
| 186 | State: sockjs.SessionClosed, |
| 187 | Err: errors.New("session does not exist: " + x.sessionID), |
| 188 | } |
| 189 | default: |
| 190 | return "", false, fmt.Errorf("Receiving data failed. Want: 200 Got: %d", resp.StatusCode) |
| 191 | } |
| 192 | |
| 193 | fr := newFrameReader(resp.Body, x.timeout) |
| 194 | |
| 195 | frame, err := fr.ReadByte() |
| 196 | if err == ErrPollTimeout { |
| 197 | return "", true, nil |
| 198 | } |
| 199 | if err != nil { |
| 200 | return "", false, err |
| 201 | } |
| 202 | |
| 203 | switch frame { |
| 204 | case 'o': |
| 205 | x.setState(sockjs.SessionActive) |
| 206 | |
| 207 | return "", true, nil |
| 208 | case 'm': |
| 209 | var message string |
| 210 | if err := json.NewDecoder(fr).Decode(&message); err != nil { |
| 211 | return "", false, err |
| 212 | } |
| 213 | |
| 214 | if message == "" { |
| 215 | return "", false, errors.New("unexpected empty message") |
| 216 | } |
| 217 | |
| 218 | x.messages = append(x.messages, message) |
| 219 | |
| 220 | message, x.messages = x.messages[0], x.messages[1:] |
| 221 | |
| 222 | return message, false, nil |
| 223 | case 'a': |
| 224 | // received an array of messages |
| 225 | var messages []string |
| 226 | if err := json.NewDecoder(fr).Decode(&messages); err != nil { |
| 227 | return "", false, err |
| 228 | } |
| 229 | |
| 230 | x.messages = append(x.messages, messages...) |
| 231 | |
| 232 | if len(x.messages) == 0 { |
| 233 | return "", false, errors.New("no message") |
no test coverage detected