選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

165 行
4.8KB

  1. <%
  2. Class App
  3. Private m_Route
  4. Private m_Method
  5. Private m_ServerName
  6. Private m_ServerPort
  7. Private m_PhysicalRoot
  8. Private m_StartedAt
  9. Private m_Services
  10. Private m_Request
  11. Private Sub Class_Initialize()
  12. m_Route = "/"
  13. m_Method = "GET"
  14. m_ServerName = ""
  15. m_ServerPort = ""
  16. m_PhysicalRoot = ""
  17. m_StartedAt = Now()
  18. Set m_Services = Server.CreateObject("Scripting.Dictionary")
  19. m_Services.CompareMode = 1
  20. Set m_Request = Nothing
  21. End Sub
  22. Private Sub Class_Terminate()
  23. Set m_Request = Nothing
  24. Set m_Services = Nothing
  25. End Sub
  26. Public Sub SetRequest(ByRef requestObject)
  27. ' IsObject(Nothing) is True in VBScript, so it can't detect "no object"
  28. ' on its own - it must be paired with an explicit "Is Nothing" check.
  29. If (Not IsObject(requestObject)) Or (requestObject Is Nothing) Then
  30. Err.Raise vbObjectError + 1003, "App.SetRequest", "requestObject must be an object."
  31. End If
  32. Set m_Request = requestObject
  33. End Sub
  34. Public Sub Boot()
  35. EnsureRequest
  36. m_Method = m_Request.ServerVariable("REQUEST_METHOD")
  37. m_ServerName = m_Request.ServerVariable("SERVER_NAME")
  38. m_ServerPort = m_Request.ServerVariable("SERVER_PORT")
  39. m_PhysicalRoot = Server.MapPath("/")
  40. m_Route = ResolveRoute()
  41. End Sub
  42. Public Sub RegisterInstance(ByVal serviceName, ByRef serviceInstance)
  43. If Len(Trim(CStr(serviceName))) = 0 Then
  44. Err.Raise vbObjectError + 1000, "App.RegisterInstance", "serviceName is required."
  45. End If
  46. If m_Services.Exists(CStr(serviceName)) Then
  47. m_Services.Remove CStr(serviceName)
  48. End If
  49. Set m_Services.Item(CStr(serviceName)) = serviceInstance
  50. End Sub
  51. Public Function Resolve(ByVal serviceName)
  52. If Not m_Services.Exists(CStr(serviceName)) Then
  53. Err.Raise vbObjectError + 1001, "App.Resolve", "Service not registered: " & CStr(serviceName)
  54. End If
  55. Set Resolve = m_Services.Item(CStr(serviceName))
  56. End Function
  57. Public Function HasService(ByVal serviceName)
  58. HasService = m_Services.Exists(CStr(serviceName))
  59. End Function
  60. Public Sub InjectInto(ByRef targetObject)
  61. If (Not IsObject(targetObject)) Or (targetObject Is Nothing) Then
  62. Err.Raise vbObjectError + 1002, "App.InjectInto", "targetObject must be an object."
  63. End If
  64. On Error Resume Next
  65. CallByName targetObject, "SetApp", VbMethod, Me
  66. On Error GoTo 0
  67. End Sub
  68. Public Property Get Route()
  69. Route = m_Route
  70. End Property
  71. Public Property Get RequestMethod()
  72. RequestMethod = m_Method
  73. End Property
  74. Public Property Get ServerName()
  75. ServerName = m_ServerName
  76. End Property
  77. Public Property Get ServerPort()
  78. ServerPort = m_ServerPort
  79. End Property
  80. Public Property Get PhysicalRoot()
  81. PhysicalRoot = m_PhysicalRoot
  82. End Property
  83. Public Property Get StartedAt()
  84. StartedAt = m_StartedAt
  85. End Property
  86. Public Property Get HttpRequest()
  87. EnsureRequest
  88. Set HttpRequest = m_Request
  89. End Property
  90. Public Function ServiceNames()
  91. ServiceNames = m_Services.Keys
  92. End Function
  93. Private Function ResolveRoute()
  94. Dim originalUrl
  95. Dim pathInfo
  96. Dim queryIndex
  97. EnsureRequest
  98. ' Public/web.config rewrites every request to Default.asp, so PATH_INFO
  99. ' inside this page is always empty/"/Default.asp" - it never reflects what
  100. ' was actually requested. IIS's URL Rewrite module stores the real request
  101. ' path in HTTP_X_ORIGINAL_URL before rewriting, so prefer that when present.
  102. originalUrl = Trim(CStr(m_Request.ServerVariable("HTTP_X_ORIGINAL_URL")))
  103. If Len(originalUrl) > 0 Then
  104. queryIndex = InStr(originalUrl, "?")
  105. If queryIndex > 0 Then
  106. originalUrl = Left(originalUrl, queryIndex - 1)
  107. End If
  108. If LCase(originalUrl) = "/default.asp" Then
  109. ResolveRoute = "/"
  110. Else
  111. ResolveRoute = originalUrl
  112. End If
  113. Exit Function
  114. End If
  115. pathInfo = Trim(CStr(m_Request.ServerVariable("PATH_INFO")))
  116. If Len(pathInfo) = 0 Then
  117. ResolveRoute = "/"
  118. Exit Function
  119. End If
  120. If LCase(pathInfo) = "/default.asp" Then
  121. ResolveRoute = "/"
  122. Exit Function
  123. End If
  124. ResolveRoute = pathInfo
  125. End Function
  126. Private Sub EnsureRequest()
  127. If m_Request Is Nothing Then
  128. Err.Raise vbObjectError + 1004, "App.EnsureRequest", "No request object has been injected into the app."
  129. End If
  130. End Sub
  131. End Class
  132. %>

Powered by TurnKey Linux.