Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "libts.h"
00031 #include <dlfcn.h>
00032 #include "Main.h"
00033 #include "Error.h"
00034 #include "P_EventSystem.h"
00035 #include "StatSystem.h"
00036 #include "P_Cache.h"
00037 #include "ProxyConfig.h"
00038 #include "ReverseProxy.h"
00039 #include "MatcherUtils.h"
00040 #include "Tokenizer.h"
00041 #include "api/ts/remap.h"
00042 #include "RemapPluginInfo.h"
00043 #include "RemapProcessor.h"
00044 #include "UrlRewrite.h"
00045 #include "UrlMapping.h"
00046
00047
00048 #define URL_REWRITE_TIMEOUT (HRTIME_SECOND*60)
00049
00050
00051 static Ptr<ProxyMutex> reconfig_mutex;
00052 UrlRewrite *rewrite_table = NULL;
00053 remap_plugin_info *remap_pi_list;
00054
00055
00056 #define FILE_CHANGED 0
00057 #define REVERSE_CHANGED 1
00058 #define TSNAME_CHANGED 2
00059 #define AC_PORT_CHANGED 3
00060 #define TRANS_CHANGED 4
00061 #define DEFAULT_TO_PAC_CHANGED 5
00062 #define DEFAULT_TO_PAC_PORT_CHANGED 7
00063 #define URL_REMAP_MODE_CHANGED 8
00064 #define HTTP_DEFAULT_REDIRECT_CHANGED 9
00065
00066 int url_remap_mode;
00067
00068
00069
00070
00071
00072 int
00073 init_reverse_proxy()
00074 {
00075 ink_assert(rewrite_table == NULL);
00076 reconfig_mutex = new_ProxyMutex();
00077 rewrite_table = new UrlRewrite();
00078
00079 if (!rewrite_table->is_valid()) {
00080 Warning("Can not load the remap table, exiting out!");
00081
00082
00083 _exit(-1);
00084 }
00085
00086 REC_RegisterConfigUpdateFunc("proxy.config.url_remap.filename", url_rewrite_CB, (void *) FILE_CHANGED);
00087 REC_RegisterConfigUpdateFunc("proxy.config.proxy_name", url_rewrite_CB, (void *) TSNAME_CHANGED);
00088 REC_RegisterConfigUpdateFunc("proxy.config.reverse_proxy.enabled", url_rewrite_CB, (void *) REVERSE_CHANGED);
00089 REC_RegisterConfigUpdateFunc("proxy.config.admin.autoconf_port", url_rewrite_CB, (void *) AC_PORT_CHANGED);
00090 REC_RegisterConfigUpdateFunc("proxy.config.url_remap.default_to_server_pac", url_rewrite_CB, (void *) DEFAULT_TO_PAC_CHANGED);
00091 REC_RegisterConfigUpdateFunc("proxy.config.url_remap.default_to_server_pac_port", url_rewrite_CB, (void *) DEFAULT_TO_PAC_PORT_CHANGED);
00092 REC_RegisterConfigUpdateFunc("proxy.config.url_remap.url_remap_mode", url_rewrite_CB, (void *) URL_REMAP_MODE_CHANGED);
00093 REC_RegisterConfigUpdateFunc("proxy.config.http.referer_default_redirect", url_rewrite_CB, (void *) HTTP_DEFAULT_REDIRECT_CHANGED);
00094 return 0;
00095 }
00096
00097
00098
00099
00100
00101 bool
00102 request_url_remap(HttpTransact::State * , HTTPHdr * ,
00103 char ** , unsigned int )
00104 {
00105 return false;
00106
00107 }
00108
00109
00110
00111
00112
00113 mapping_type
00114 request_url_remap_redirect(HTTPHdr *request_header, URL *redirect_url)
00115 {
00116 return rewrite_table ? rewrite_table->Remap_redirect(request_header, redirect_url) : NONE;
00117 }
00118
00119 bool
00120 response_url_remap(HTTPHdr *response_header)
00121 {
00122 return rewrite_table ? rewrite_table->ReverseMap(response_header) : false;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132 struct UR_UpdateContinuation;
00133 typedef int (UR_UpdateContinuation::*UR_UpdContHandler) (int, void *);
00134 struct UR_UpdateContinuation: public Continuation
00135 {
00136 int file_update_handler(int , void * )
00137 {
00138 reloadUrlRewrite();
00139 delete this;
00140 return EVENT_DONE;
00141 }
00142 UR_UpdateContinuation(ProxyMutex * m)
00143 : Continuation(m)
00144 {
00145 SET_HANDLER((UR_UpdContHandler) & UR_UpdateContinuation::file_update_handler);
00146 }
00147 };
00148
00149
00150
00151
00152
00153
00154
00155 void
00156 reloadUrlRewrite()
00157 {
00158 UrlRewrite *newTable;
00159
00160 Debug("url_rewrite", "remap.config updated, reloading...");
00161 newTable = new UrlRewrite();
00162 if (newTable->is_valid()) {
00163 new_Deleter(rewrite_table, URL_REWRITE_TIMEOUT);
00164 Debug("url_rewrite", "remap.config done reloading!");
00165 ink_atomic_swap(&rewrite_table, newTable);
00166 } else {
00167 static const char* msg = "failed to reload remap.config, not replacing!";
00168 delete newTable;
00169 Debug("url_rewrite", "%s", msg);
00170 Warning("%s", msg);
00171 }
00172 }
00173
00174 int
00175 url_rewrite_CB(const char * , RecDataT , RecData data, void *cookie)
00176 {
00177 int my_token = (int) (long) cookie;
00178
00179 switch (my_token) {
00180 case REVERSE_CHANGED:
00181 rewrite_table->SetReverseFlag(data.rec_int);
00182 break;
00183
00184 case TSNAME_CHANGED:
00185 case DEFAULT_TO_PAC_CHANGED:
00186 case DEFAULT_TO_PAC_PORT_CHANGED:
00187 case FILE_CHANGED:
00188 case HTTP_DEFAULT_REDIRECT_CHANGED:
00189 eventProcessor.schedule_imm(new UR_UpdateContinuation(reconfig_mutex), ET_TASK);
00190 break;
00191
00192 case AC_PORT_CHANGED:
00193
00194 break;
00195
00196 case URL_REMAP_MODE_CHANGED:
00197
00198 break;
00199
00200 default:
00201 ink_assert(0);
00202 break;
00203 }
00204
00205 return 0;
00206 }
00207