Exemple #1
0
  private void addHeader(ClientSocket stream, WriteStream ws, CharBuffer key, String value)
      throws IOException {
    int keyLen = key.getLength();
    int valLen = value.length();

    int len = keyLen + valLen;

    if (keyLen < 0x80) len += 1;
    else len += 4;

    if (valLen < 0x80) len += 1;
    else len += 4;

    writeHeader(ws, FCGI_PARAMS, len);

    if (keyLen < 0x80) ws.write(keyLen);
    else {
      ws.write(0x80 | (keyLen >> 24));
      ws.write(keyLen >> 16);
      ws.write(keyLen >> 8);
      ws.write(keyLen);
    }

    if (valLen < 0x80) ws.write(valLen);
    else {
      ws.write(0x80 | (valLen >> 24));
      ws.write(valLen >> 16);
      ws.write(valLen >> 8);
      ws.write(valLen);
    }

    ws.print(key.getBuffer(), 0, keyLen);
    ws.print(value);
  }
  /**
   * Fills the time buffer with the formatted time.
   *
   * @param date current time in milliseconds
   */
  private void fillTime(long date) throws IOException {
    synchronized (_timeBuffer) {
      if (date / 1000 == _lastTime / 1000) return;

      if (_timeFormatSecondOffset >= 0 && date / 3600000 == _lastTime / 3600000) {
        byte[] bBuf = _timeBuffer.getBuffer();

        int min = (int) (date / 60000 % 60);
        int sec = (int) (date / 1000 % 60);

        bBuf[_timeFormatMinuteOffset + 0] = (byte) ('0' + min / 10);
        bBuf[_timeFormatMinuteOffset + 1] = (byte) ('0' + min % 10);

        bBuf[_timeFormatSecondOffset + 0] = (byte) ('0' + sec / 10);
        bBuf[_timeFormatSecondOffset + 1] = (byte) ('0' + sec % 10);

        _lastTime = date;

        return;
      }

      _timeCharBuffer.clear();
      QDate.formatLocal(_timeCharBuffer, date, _timeFormat);

      if (_timeFormatSecondOffset >= 0) {
        _timeFormatSecondOffset = _timeCharBuffer.lastIndexOf(':') + 1;
        _timeFormatMinuteOffset = _timeFormatSecondOffset - 3;
      }

      char[] cBuf = _timeCharBuffer.getBuffer();
      int length = _timeCharBuffer.getLength();

      _timeBuffer.setLength(length);
      byte[] bBuf = _timeBuffer.getBuffer();

      for (int i = length - 1; i >= 0; i--) bBuf[i] = (byte) cBuf[i];
    }

    _lastTime = date;
  }
  /**
   * Logs a request using the current format.
   *
   * @param request the servlet request.
   * @param response the servlet response.
   * @param buffer byte buffer containing the response
   * @param offset buffer starting offset
   * @param length length allowed in the buffer
   * @return the new tail of the buffer
   */
  private int log(
      HttpServletRequestImpl request,
      HttpServletResponseImpl responseFacade,
      AbstractHttpResponse response,
      byte[] buffer,
      int offset,
      int length)
      throws IOException {
    AbstractHttpRequest absRequest = request.getAbstractHttpRequest();

    int len = _segments.length;
    for (int i = 0; i < len; i++) {
      Segment segment = _segments[i];
      String value = null;
      CharSegment csValue = null;

      switch (segment._code) {
        case Segment.TEXT:
          int sublen = segment._data.length;
          byte[] data = segment._data;
          for (int j = 0; j < sublen; j++) buffer[offset++] = data[j];
          break;

        case Segment.CHAR:
          buffer[offset++] = segment._ch;
          break;

        case 'b':
          if (responseFacade.getStatus() == 304) buffer[offset++] = (byte) '-';
          else offset = print(buffer, offset, response.getContentLength());
          break;

          // cookie
        case 'c':
          Cookie cookie = request.getCookie(segment._string);
          if (cookie == null) cookie = responseFacade.getCookie(segment._string);
          if (cookie == null) buffer[offset++] = (byte) '-';
          else offset = print(buffer, offset, cookie.getValue());
          break;

          // set cookie
        case Segment.SET_COOKIE:
          ArrayList<Cookie> cookies = responseFacade.getCookies();
          if (cookies == null || cookies.size() == 0) buffer[offset++] = (byte) '-';
          else {
            _cb.clear();
            response.fillCookie(_cb, (Cookie) cookies.get(0), 0, 0, false);

            offset = print(buffer, offset, _cb.getBuffer(), 0, _cb.getLength());
          }
          break;

        case 'h':
          if (isHostnameDnsLookup()) {
            String addrName = request.getRemoteAddr();
            InetAddress addr = InetAddress.getByName(addrName);

            offset = print(buffer, offset, addr.getHostName());
          } else offset = absRequest.printRemoteAddr(buffer, offset);
          break;

          // input header
        case 'i':
          csValue = absRequest.getHeaderBuffer(segment._string);
          if (csValue == null) buffer[offset++] = (byte) '-';
          else offset = print(buffer, offset, csValue);
          break;

        case 'l':
          buffer[offset++] = (byte) '-';
          break;

          // request attribute
        case 'n':
          Object oValue = request.getAttribute(segment._string);
          if (oValue == null) buffer[offset++] = (byte) '-';
          else offset = print(buffer, offset, String.valueOf(oValue));
          break;

          // output header
        case 'o':
          value = response.getHeader(segment._string);
          if (value == null) buffer[offset++] = (byte) '-';
          else offset = print(buffer, offset, value);
          break;

        case 'r':
          offset = print(buffer, offset, request.getMethod());

          buffer[offset++] = (byte) ' ';

          data = absRequest.getUriBuffer();
          sublen = absRequest.getUriLength();

          // server/02e9
          if (buffer.length - offset - 128 < sublen) {
            sublen = buffer.length - offset - 128;
            System.arraycopy(data, 0, buffer, offset, sublen);
            offset += sublen;
            buffer[offset++] = (byte) '.';
            buffer[offset++] = (byte) '.';
            buffer[offset++] = (byte) '.';
          } else {
            System.arraycopy(data, 0, buffer, offset, sublen);
            offset += sublen;
          }

          buffer[offset++] = (byte) ' ';

          offset = print(buffer, offset, request.getProtocol());
          break;

        case 's':
          int status = responseFacade.getStatus();
          buffer[offset++] = (byte) ('0' + (status / 100) % 10);
          buffer[offset++] = (byte) ('0' + (status / 10) % 10);
          buffer[offset++] = (byte) ('0' + status % 10);
          break;

        case 't':
          long date = Alarm.getCurrentTime();

          if (date / 1000 != _lastTime / 1000) fillTime(date);

          sublen = _timeBuffer.getLength();
          data = _timeBuffer.getBuffer();

          synchronized (_timeBuffer) {
            System.arraycopy(data, 0, buffer, offset, sublen);
          }

          offset += sublen;
          break;

        case 'T':
          {
            long startTime = request.getStartTime();
            long endTime = Alarm.getCurrentTime();

            offset = print(buffer, offset, (int) ((endTime - startTime + 500) / 1000));
            break;
          }

        case 'D':
          {
            long startTime = request.getStartTime();
            long endTime = Alarm.getCurrentTime();

            offset = print(buffer, offset, (int) ((endTime - startTime) * 1000));
            break;
          }

        case 'u':
          value = request.getRemoteUser(false);
          if (value == null) buffer[offset++] = (byte) '-';
          else {
            buffer[offset++] = (byte) '"';
            offset = print(buffer, offset, value);
            buffer[offset++] = (byte) '"';
          }
          break;

        case 'v':
          value = request.getServerName();
          if (value == null) buffer[offset++] = (byte) '-';
          else {
            offset = print(buffer, offset, value);
          }
          break;

        case 'U':
          offset = print(buffer, offset, request.getRequestURI());
          break;

        default:
          throw new IOException();
      }
    }

    return offset;
  }
  private void handleBody(BodyContentImpl body) throws JspException, ServletException, IOException {
    String url = _url;

    if (url == null || url.equals(""))
      throw new JspTagException(L.l("URL may not be null for `{0}'", _url));

    int p;
    if (_query == null || _query.getLength() == 0) {
    } else if ((p = url.indexOf('?')) > 0) {
      // jsp/1cip
      // url = url + '&' + _query;
      url = url.substring(0, p) + '?' + _query + '&' + url.substring(p + 1);
    } else url = url + '?' + _query;

    JspWriter out = body;
    if (out instanceof ResinJspWriter) ((ResinJspWriter) out).flushBuffer();
    else {
      // jsp/1ei0
      // out.flush();
    }

    if (_context != null) {
      String context = _context;

      if (!url.startsWith("/"))
        throw new JspException(
            L.l("URL `{0}' must start with `/' with context `{0}'", url, context));

      if (context != null && context.startsWith("/")) {
        ServletContext app = pageContext.getServletContext().getContext(context);

        RequestDispatcher disp = app.getRequestDispatcher(url);

        if (disp == null) throw new JspException(L.l("URL `{0}' does not map to any servlet", url));

        CauchoResponse response = (CauchoResponse) pageContext.getResponse();

        String charEncoding = getCharEncoding();

        if (charEncoding != null) response.getResponseStream().setEncoding(charEncoding);

        final ServletRequest request = pageContext.getRequest();

        disp.include(request, response);

        final Integer statusCode =
            (Integer) request.getAttribute("com.caucho.dispatch.response.statusCode");

        // jsp/1jif
        if (statusCode != null) {
          final int status = statusCode.intValue();

          if (status < 200 || status > 299) {
            String message =
                L.l(
                    "c:import status code {0} received while serving {1}",
                    statusCode, context + url);

            throw new JspException(message);
          }
        }

        /*
        int status = response.getStatus();

        if (status < 200 || status > 299) {
          String message = L.l(
            "c:import status code {0} received while serving {1}",
            status,
            context + url);

          throw new JspException(message);
        }
        */
      } else {
        handleExternalBody(context + url);
      }

      return;
    }

    int colon = url.indexOf(':');
    int slash = url.indexOf('/');
    if (slash == 0 || colon < 0 || slash < 0 || slash < colon) {
      ServletRequest request = pageContext.getRequest();
      CauchoResponse response = (CauchoResponse) pageContext.getResponse();

      String charEncoding = getCharEncoding();

      if (charEncoding != null) response.getResponseStream().setEncoding(charEncoding);

      RequestDispatcher disp = request.getRequestDispatcher(url);

      JstlImportResponseWrapper wrapper = new JstlImportResponseWrapper(response);
      disp.include(request, wrapper);

      // jsp/1jie
      int status = wrapper.getStatus();

      if (status < 200 || status > 299) {
        String message = L.l("c:import status code {0} recieved while serving {1}", status, url);

        throw new JspException(message);
      }
      /* jsp/1jii - response does not change status by JSTL spec.
      } else {
        response.setStatus(status);
      }
      */

    } else handleExternalBody(url);
  }