📄 httpconnection.java
字号:
/* * @see * org.mortbay.jetty.HttpParser.EventHandler#parsedHeaderValue(org.mortbay * .io.Buffer) */ public void parsedHeader(Buffer name, Buffer value) { int ho = HttpHeaders.CACHE.getOrdinal(name); switch (ho) { case HttpHeaders.HOST_ORDINAL: // TODO check if host matched a host in the URI. _host = true; break; case HttpHeaders.EXPECT_ORDINAL: value = HttpHeaderValues.CACHE.lookup(value); _expect = HttpHeaderValues.CACHE.getOrdinal(value); break; case HttpHeaders.ACCEPT_ENCODING_ORDINAL: case HttpHeaders.USER_AGENT_ORDINAL: value = HttpHeaderValues.CACHE.lookup(value); break; case HttpHeaders.CONTENT_TYPE_ORDINAL: value = MimeTypes.CACHE.lookup(value); _charset = MimeTypes.getCharsetFromContentType(value); break; case HttpHeaders.CONNECTION_ORDINAL: // looks rather clumsy, but the idea is to optimize for a // single valued header int ordinal = HttpHeaderValues.CACHE.getOrdinal(value); switch (ordinal) { case -1: { String[] values = value.toString().split(","); for (int i = 0; values != null && i < values.length; i++) { CachedBuffer cb = HttpHeaderValues.CACHE.get(values[i].trim()); if (cb != null) { switch (cb.getOrdinal()) { case HttpHeaderValues.CLOSE_ORDINAL: _responseFields.add(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.CLOSE_BUFFER); _generator.setPersistent(false); break; case HttpHeaderValues.KEEP_ALIVE_ORDINAL: if (_version == HttpVersions.HTTP_1_0_ORDINAL) _responseFields.add(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.KEEP_ALIVE_BUFFER); break; } } } break; } case HttpHeaderValues.CLOSE_ORDINAL: _responseFields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.CLOSE_BUFFER); _generator.setPersistent(false); break; case HttpHeaderValues.KEEP_ALIVE_ORDINAL: if (_version == HttpVersions.HTTP_1_0_ORDINAL) _responseFields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.KEEP_ALIVE_BUFFER); break; } } _requestFields.add(name,value); } /* * @see org.mortbay.jetty.HttpParser.EventHandler#headerComplete() */ public void headerComplete() throws IOException { _requests++; _generator.setVersion(_version); switch (_version) { case HttpVersions.HTTP_0_9_ORDINAL: break; case HttpVersions.HTTP_1_0_ORDINAL: _generator.setHead(_head); break; case HttpVersions.HTTP_1_1_ORDINAL: _generator.setHead(_head); if (_server.getSendDateHeader()) _responseFields.put(HttpHeaders.DATE_BUFFER,_request.getTimeStampBuffer(),_request.getTimeStamp()); if (!_host) { _generator.setResponse(HttpStatus.ORDINAL_400_Bad_Request,null); _responseFields.put(HttpHeaders.CONNECTION_BUFFER,HttpHeaderValues.CLOSE_BUFFER); _generator.completeHeader(_responseFields,true); _generator.complete(); return; } if (_expect != UNKNOWN) { if (_expect == HttpHeaderValues.CONTINUE_ORDINAL) { // TODO delay sending 100 response until a read is // attempted. if (((HttpParser)_parser).getHeaderBuffer() == null || ((HttpParser)_parser).getHeaderBuffer().length() < 2) { _generator.setResponse(HttpStatus.ORDINAL_100_Continue,null); _generator.completeHeader(null,true); _generator.complete(); _generator.reset(false); } } else if (_expect == HttpHeaderValues.PROCESSING_ORDINAL) { } else { _generator.sendError(HttpStatus.ORDINAL_417_Expectation_Failed,null,null,true); return; } } break; default: } if (_charset != null) _request.setCharacterEncodingUnchecked(_charset); // Either handle now or wait for first content if (((HttpParser)_parser).getContentLength() <= 0 && !((HttpParser)_parser).isChunking()) handleRequest(); else _delayedHandling = true; } /* ------------------------------------------------------------ */ /* * @see org.mortbay.jetty.HttpParser.EventHandler#content(int, * org.mortbay.io.Buffer) */ public void content(Buffer ref) throws IOException { if (_delayedHandling) { _delayedHandling = false; handleRequest(); } } /* * (non-Javadoc) * * @see org.mortbay.jetty.HttpParser.EventHandler#messageComplete(int) */ public void messageComplete(long contentLength) throws IOException { if (_delayedHandling) { _delayedHandling = false; handleRequest(); } } /* * (non-Javadoc) * * @see * org.mortbay.jetty.HttpParser.EventHandler#startResponse(org.mortbay * .io.Buffer, int, org.mortbay.io.Buffer) */ public void startResponse(Buffer version, int status, Buffer reason) { Log.debug("Bad request!: " + version + " " + status + " " + reason); } } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ public class Output extends AbstractGenerator.Output { Output() { super((AbstractGenerator)HttpConnection.this._generator,_connector.getMaxIdleTime()); } /* ------------------------------------------------------------ */ /* * @see java.io.OutputStream#close() */ public void close() throws IOException { if (_closed) return; if (!isIncluding() && !_generator.isCommitted()) commitResponse(HttpGenerator.LAST); else flushResponse(); super.close(); } /* ------------------------------------------------------------ */ /* * @see java.io.OutputStream#flush() */ public void flush() throws IOException { if (!_generator.isCommitted()) commitResponse(HttpGenerator.MORE); super.flush(); } /* ------------------------------------------------------------ */ /* * @see javax.servlet.ServletOutputStream#print(java.lang.String) */ public void print(String s) throws IOException { if (_closed) throw new IOException("Closed"); PrintWriter writer = getPrintWriter(null); writer.print(s); } /* ------------------------------------------------------------ */ public void sendResponse(Buffer response) throws IOException { ((HttpGenerator)_generator).sendResponse(response); } /* ------------------------------------------------------------ */ public void sendContent(Object content) throws IOException { Resource resource = null; if (_closed) throw new IOException("Closed"); if (_generator.getContentWritten() > 0) throw new IllegalStateException("!empty"); if (content instanceof HttpContent) { HttpContent c = (HttpContent)content; Buffer contentType = c.getContentType(); if (contentType != null && !_responseFields.containsKey(HttpHeaders.CONTENT_TYPE_BUFFER)) { String enc = _response.getSetCharacterEncoding(); if(enc==null) _responseFields.add(HttpHeaders.CONTENT_TYPE_BUFFER, contentType); else { if(contentType instanceof CachedBuffer) { CachedBuffer content_type = ((CachedBuffer)contentType).getAssociate(enc); if(content_type!=null) _responseFields.put(HttpHeaders.CONTENT_TYPE_BUFFER, content_type); else { _responseFields.put(HttpHeaders.CONTENT_TYPE_BUFFER, contentType+";charset="+QuotedStringTokenizer.quote(enc,";= ")); } } else { _responseFields.put(HttpHeaders.CONTENT_TYPE_BUFFER, contentType+";charset="+QuotedStringTokenizer.quote(enc,";= ")); } } } if (c.getContentLength() > 0) _responseFields.putLongField(HttpHeaders.CONTENT_LENGTH_BUFFER,c.getContentLength()); Buffer lm = c.getLastModified(); long lml = c.getResource().lastModified(); if (lm != null) _responseFields.put(HttpHeaders.LAST_MODIFIED_BUFFER,lm,lml); else if (c.getResource() != null) { if (lml != -1) _responseFields.putDateField(HttpHeaders.LAST_MODIFIED_BUFFER,lml); } content = c.getBuffer(); if (content == null) content = c.getInputStream(); } else if (content instanceof Resource) { resource = (Resource)content; _responseFields.putDateField(HttpHeaders.LAST_MODIFIED_BUFFER,resource.lastModified()); content = resource.getInputStream(); } if (content instanceof Buffer) { _generator.addContent((Buffer)content,HttpGenerator.LAST); commitResponse(HttpGenerator.LAST); } else if (content instanceof InputStream) { InputStream in = (InputStream)content; try { int max = _generator.prepareUncheckedAddContent(); Buffer buffer = _generator.getUncheckedBuffer(); int len = buffer.readFrom(in,max); while (len >= 0) { _generator.completeUncheckedAddContent(); _out.flush(); max = _generator.prepareUncheckedAddContent(); buffer = _generator.getUncheckedBuffer(); len = buffer.readFrom(in,max); } _generator.completeUncheckedAddContent(); _out.flush(); } finally { if (resource != null) resource.release(); else in.close(); } } else throw new IllegalArgumentException("unknown content type?"); } } /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ /* ------------------------------------------------------------ */ public class OutputWriter extends AbstractGenerator.OutputWriter { OutputWriter() { super(HttpConnection.this._out); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -