void receiveHeaders(List<String> headers, HeadersMode headersMode) {
   assert (!Thread.holdsLock(SpdyStream.this));
   ErrorCode errorCode = null;
   boolean open = true;
   synchronized (this) {
     if (responseHeaders == null) {
       if (headersMode.failIfHeadersAbsent()) {
         errorCode = ErrorCode.PROTOCOL_ERROR;
       } else {
         responseHeaders = headers;
         open = isOpen();
         notifyAll();
       }
     } else {
       if (headersMode.failIfHeadersPresent()) {
         errorCode = ErrorCode.STREAM_IN_USE;
       } else {
         List<String> newHeaders = new ArrayList<String>();
         newHeaders.addAll(responseHeaders);
         newHeaders.addAll(headers);
         this.responseHeaders = newHeaders;
       }
     }
   }
   if (errorCode != null) {
     closeLater(errorCode);
   } else if (!open) {
     connection.removeStream(id);
   }
 }
Exemple #2
0
 void receiveHeaders(List<Header> paramList, HeadersMode paramHeadersMode)
 {
   assert (!Thread.holdsLock(this));
   Object localObject = null;
   boolean bool = true;
   label97:
   do
   {
     for (;;)
     {
       try
       {
         if (this.responseHeaders == null)
         {
           if (paramHeadersMode.failIfHeadersAbsent())
           {
             paramList = ErrorCode.PROTOCOL_ERROR;
             if (paramList == null) {
               break;
             }
             closeLater(paramList);
             return;
           }
           this.responseHeaders = paramList;
           bool = isOpen();
           notifyAll();
           paramList = (List<Header>)localObject;
           continue;
         }
         if (!paramHeadersMode.failIfHeadersPresent()) {
           break label97;
         }
       }
       finally {}
       paramList = ErrorCode.STREAM_IN_USE;
       continue;
       paramHeadersMode = new ArrayList();
       paramHeadersMode.addAll(this.responseHeaders);
       paramHeadersMode.addAll(paramList);
       this.responseHeaders = paramHeadersMode;
       paramList = (List<Header>)localObject;
     }
   } while (bool);
   this.connection.removeStream(this.id);
 }
    @Override
    public void headers(
        boolean outFinished,
        boolean inFinished,
        int streamId,
        int associatedStreamId,
        int priority,
        List<Header> headerBlock,
        HeadersMode headersMode) {
      if (pushedStream(streamId)) {
        pushHeadersLater(streamId, headerBlock, inFinished);
        return;
      }
      SpdyStream stream;
      synchronized (SpdyConnection.this) {
        // If we're shutdown, don't bother with this stream.
        if (shutdown) return;

        stream = getStream(streamId);

        if (stream == null) {
          // The headers claim to be for an existing stream, but we don't have one.
          if (headersMode.failIfStreamAbsent()) {
            writeSynResetLater(streamId, ErrorCode.INVALID_STREAM);
            return;
          }

          // If the stream ID is less than the last created ID, assume it's already closed.
          if (streamId <= lastGoodStreamId) return;

          // If the stream ID is in the client's namespace, assume it's already closed.
          if (streamId % 2 == nextStreamId % 2) return;

          // Create a stream.
          final SpdyStream newStream =
              new SpdyStream(
                  streamId, SpdyConnection.this, outFinished, inFinished, priority, headerBlock);
          lastGoodStreamId = streamId;
          streams.put(streamId, newStream);
          executor.submit(
              new NamedRunnable("OkHttp %s stream %d", hostName, streamId) {
                @Override
                public void execute() {
                  try {
                    handler.receive(newStream);
                  } catch (IOException e) {
                    throw new RuntimeException(e);
                  }
                }
              });
          return;
        }
      }

      // The headers claim to be for a new stream, but we already have one.
      if (headersMode.failIfStreamPresent()) {
        stream.closeLater(ErrorCode.PROTOCOL_ERROR);
        removeStream(streamId);
        return;
      }

      // Update an existing stream.
      stream.receiveHeaders(headerBlock, headersMode);
      if (inFinished) stream.receiveFin();
    }