request.d 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. module request;
  2. import collie.codec.http;
  3. import collie.codec.http.server;
  4. import collie.utils.vector;
  5. import std.exception;
  6. import std.datetime;
  7. import std.conv;
  8. import std.string;
  9. abstract class BaseHandler : RequestHandler
  10. {
  11. alias Buffer = Vector!(ubyte);
  12. protected:
  13. final override void onResquest(HTTPMessage headers) nothrow
  14. {
  15. _header = headers;
  16. }
  17. final override void onBody(const ubyte[] data) nothrow
  18. {
  19. collectException(_buffer.put(data));
  20. }
  21. final override void onError(HTTPErrorCode code) nothrow {
  22. _erroCode = code;
  23. collectException({
  24. import collie.utils.memory;
  25. if(_header)gcFree(_header);
  26. gcFree(this);
  27. }());
  28. }
  29. final override void requestComplete() nothrow
  30. {
  31. _erroCode = HTTPErrorCode.REMOTE_CLOSED;
  32. collectException({
  33. import collie.utils.memory;
  34. if(_header)gcFree(_header);
  35. gcFree(this);
  36. }());
  37. }
  38. final @property bool isVaild(){return _erroCode == HTTPErrorCode.NO_ERROR;}
  39. pragma(inline,true)
  40. final string printDate() {
  41. DateTime date = cast(DateTime)Clock.currTime;
  42. return format(
  43. "%.3s, %02d %.3s %d %02d:%02d:%02d GMT", // could be UTC too
  44. to!string(date.dayOfWeek).capitalize,
  45. date.day,
  46. to!string(date.month).capitalize,
  47. date.year,
  48. date.hour,
  49. date.minute,
  50. date.second);
  51. }
  52. protected:
  53. HTTPMessage _header;
  54. Buffer _buffer;
  55. private:
  56. HTTPErrorCode _erroCode = HTTPErrorCode.NO_ERROR;
  57. }