예제 #1
0
 // Ensures that reply field is non-null
 //
 private void build() throws IOException {
   Request.Action action = request.action();
   if ((action != Request.Action.GET) && (action != Request.Action.HEAD)) {
     reply = new Reply(Reply.Code.METHOD_NOT_ALLOWED, new StringContent(request.toString()));
   }
   reply = new Reply(Reply.Code.OK, new FileContent(request.uri()), action);
 }
예제 #2
0
 ExchangeImpl(String m, URI u, Request req, int len, HttpConnection connection)
     throws IOException {
   this.req = req;
   this.reqHdrs = req.headers();
   this.rspHdrs = new Headers();
   this.method = m;
   this.uri = u;
   this.connection = connection;
   this.reqContentLen = len;
   /* ros only used for headers, body written directly to stream */
   this.ros = req.outputStream();
   this.ris = req.inputStream();
   server = getServerImpl();
   server.startExchange();
 }
예제 #3
0
 // When parse is successfull, saves request and returns true
 //
 private boolean parse() throws IOException {
   try {
     request = Request.parse(rbb);
     return true;
   } catch (MalformedRequestException x) {
     reply = new Reply(Reply.Code.BAD_REQUEST, new StringContent(x));
   }
   return false;
 }
예제 #4
0
  // Returns true when request is complete
  // May expand rbb if more room required
  //
  private boolean receive(SelectionKey sk) throws IOException {
    ByteBuffer tmp = null;

    if (requestReceived) {
      return true;
    }

    if (!cio.doHandshake(sk)) {
      return false;
    }

    if ((cio.read() < 0) || Request.isComplete(cio.getReadBuf())) {
      rbb = cio.getReadBuf();
      return (requestReceived = true);
    }
    return false;
  }
예제 #5
0
 public void sendResponseHeaders(int rCode, long contentLen) throws IOException {
   if (sentHeaders) {
     throw new IOException("headers already sent");
   }
   this.rcode = rCode;
   String statusLine = "HTTP/1.1 " + rCode + Code.msg(rCode) + "\r\n";
   OutputStream tmpout = new BufferedOutputStream(ros);
   PlaceholderOutputStream o = getPlaceholderResponseBody();
   tmpout.write(bytes(statusLine, 0), 0, statusLine.length());
   boolean noContentToSend = false; // assume there is content
   rspHdrs.set("Date", df.format(new Date()));
   if (contentLen == 0) {
     if (http10) {
       o.setWrappedStream(new UndefLengthOutputStream(this, ros));
       close = true;
     } else {
       rspHdrs.set("Transfer-encoding", "chunked");
       o.setWrappedStream(new ChunkedOutputStream(this, ros));
     }
   } else {
     if (contentLen == -1) {
       noContentToSend = true;
       contentLen = 0;
     }
     /* content len might already be set, eg to implement HEAD resp */
     if (rspHdrs.getFirst("Content-length") == null) {
       rspHdrs.set("Content-length", Long.toString(contentLen));
     }
     o.setWrappedStream(new FixedLengthOutputStream(this, ros, contentLen));
   }
   write(rspHdrs, tmpout);
   this.rspContentLen = contentLen;
   tmpout.flush();
   tmpout = null;
   sentHeaders = true;
   if (noContentToSend) {
     WriteFinishedEvent e = new WriteFinishedEvent(this);
     server.addEvent(e);
     closed = true;
   }
   server.logReply(rCode, req.requestLine(), null);
 }
예제 #6
0
 public String getProtocol() {
   String reqline = req.requestLine();
   int index = reqline.lastIndexOf(' ');
   return reqline.substring(index + 1);
 }