private void close(ErrorCode connectionCode, ErrorCode streamCode) throws IOException {
    assert (!Thread.holdsLock(this));
    IOException thrown = null;
    try {
      shutdown(connectionCode);
    } catch (IOException e) {
      thrown = e;
    }

    SpdyStream[] streamsToClose = null;
    Ping[] pingsToCancel = null;
    synchronized (this) {
      if (!streams.isEmpty()) {
        streamsToClose = streams.values().toArray(new SpdyStream[streams.size()]);
        streams.clear();
        setIdle(false);
      }
      if (pings != null) {
        pingsToCancel = pings.values().toArray(new Ping[pings.size()]);
        pings = null;
      }
    }

    if (streamsToClose != null) {
      for (SpdyStream stream : streamsToClose) {
        try {
          stream.close(streamCode);
        } catch (IOException e) {
          if (thrown != null) thrown = e;
        }
      }
    }

    if (pingsToCancel != null) {
      for (Ping ping : pingsToCancel) {
        ping.cancel();
      }
    }

    try {
      frameReader.close();
    } catch (IOException e) {
      thrown = e;
    }
    try {
      frameWriter.close();
    } catch (IOException e) {
      if (thrown == null) thrown = e;
    }

    if (thrown != null) throw thrown;
  }
예제 #2
0
 @Override
 protected void execute() {
   ErrorCode connectionErrorCode = ErrorCode.INTERNAL_ERROR;
   ErrorCode streamErrorCode = ErrorCode.INTERNAL_ERROR;
   try {
     if (!client) {
       frameReader.readConnectionPreface();
     }
     while (frameReader.nextFrame(this)) {}
     connectionErrorCode = ErrorCode.NO_ERROR;
     streamErrorCode = ErrorCode.CANCEL;
   } catch (IOException e) {
     connectionErrorCode = ErrorCode.PROTOCOL_ERROR;
     streamErrorCode = ErrorCode.PROTOCOL_ERROR;
   } finally {
     try {
       close(connectionErrorCode, streamErrorCode);
     } catch (IOException ignored) {
     }
     Util.closeQuietly(frameReader);
   }
 }