@@ -1189,28 +1189,7 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
1189
1189
_decode_percents (request -> path );
1190
1190
1191
1191
char * path = request -> path + 3 ;
1192
- const char * path_out = NULL ;
1193
1192
size_t pathlen = strlen (path );
1194
-
1195
- mp_vfs_mount_t * vfs = mp_vfs_lookup_path (path , & path_out );
1196
- if (vfs == MP_VFS_NONE ) {
1197
- _reply_missing (socket , request );
1198
- return false;
1199
- }
1200
- fs_user_mount_t * fs_mount ;
1201
- if (vfs == MP_VFS_ROOT ) {
1202
- fs_mount = filesystem_circuitpy ();
1203
- } else {
1204
- fs_mount = MP_OBJ_TO_PTR (vfs -> obj );
1205
- // Skip non-fat and non-native block file systems.
1206
- if (!filesystem_native_fatfs (fs_mount )) {
1207
- _reply_missing (socket , request );
1208
- return false;
1209
- }
1210
- path += strlen (vfs -> str );
1211
- pathlen = strlen (path );
1212
- }
1213
- FATFS * fs = & fs_mount -> fatfs ;
1214
1193
// Trailing / is a directory.
1215
1194
bool directory = false;
1216
1195
if (path [pathlen - 1 ] == '/' ) {
@@ -1220,18 +1199,24 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
1220
1199
}
1221
1200
directory = true;
1222
1201
}
1202
+
1203
+ // These manipulations work on the full path so do them first.
1204
+
1223
1205
// Delete is almost identical for files and directories so share the
1224
1206
// implementation.
1225
1207
if (strcasecmp (request -> method , "DELETE" ) == 0 ) {
1226
1208
FRESULT result = supervisor_workflow_delete_recursive (path );
1227
- if (result == FR_NO_PATH || result == FR_NO_FILE ) {
1209
+ if (result == FR_WRITE_PROTECTED ) {
1210
+ _reply_conflict (socket , request );
1211
+ } else if (result == FR_NO_PATH || result == FR_NO_FILE ) {
1228
1212
_reply_missing (socket , request );
1229
1213
} else if (result != FR_OK ) {
1230
1214
_reply_server_error (socket , request );
1231
1215
} else {
1232
1216
_reply_no_content (socket , request );
1233
1217
return true;
1234
1218
}
1219
+ return false;
1235
1220
} else if (strcasecmp (request -> method , "MOVE" ) == 0 ) {
1236
1221
_decode_percents (request -> destination );
1237
1222
char * destination = request -> destination + 3 ;
@@ -1253,7 +1238,51 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
1253
1238
_reply_created (socket , request );
1254
1239
return true;
1255
1240
}
1256
- } else if (directory ) {
1241
+ return false;
1242
+ } else if (directory && strcasecmp (request -> method , "PUT" ) == 0 ) {
1243
+ DWORD fattime = 0 ;
1244
+ if (request -> timestamp_ms > 0 ) {
1245
+ truncate_time (request -> timestamp_ms * 1000000 , & fattime );
1246
+ }
1247
+ FRESULT result = supervisor_workflow_mkdir_parents (fattime , path );
1248
+ if (result == FR_WRITE_PROTECTED ) {
1249
+ _reply_conflict (socket , request );
1250
+ } else if (result == FR_EXIST ) {
1251
+ _reply_no_content (socket , request );
1252
+ } else if (result == FR_NO_PATH ) {
1253
+ _reply_missing (socket , request );
1254
+ } else if (result != FR_OK ) {
1255
+ _reply_server_error (socket , request );
1256
+ } else {
1257
+ _reply_created (socket , request );
1258
+ return true;
1259
+ }
1260
+ return false;
1261
+ }
1262
+
1263
+ // These responses don't use helpers because they stream data in and
1264
+ // out. So, share the mount lookup code.
1265
+ const char * path_out = NULL ;
1266
+ mp_vfs_mount_t * vfs = mp_vfs_lookup_path (path , & path_out );
1267
+ if (vfs == MP_VFS_NONE ) {
1268
+ _reply_missing (socket , request );
1269
+ return false;
1270
+ }
1271
+ fs_user_mount_t * fs_mount ;
1272
+ if (vfs == MP_VFS_ROOT ) {
1273
+ fs_mount = filesystem_circuitpy ();
1274
+ } else {
1275
+ fs_mount = MP_OBJ_TO_PTR (vfs -> obj );
1276
+ // Skip non-fat and non-native block file systems.
1277
+ if (!filesystem_native_fatfs (fs_mount )) {
1278
+ _reply_missing (socket , request );
1279
+ return false;
1280
+ }
1281
+ path += strlen (vfs -> str );
1282
+ pathlen = strlen (path );
1283
+ }
1284
+ FATFS * fs = & fs_mount -> fatfs ;
1285
+ if (directory ) {
1257
1286
if (strcasecmp (request -> method , "GET" ) == 0 ) {
1258
1287
FF_DIR dir ;
1259
1288
FRESULT res = f_opendir (fs , & dir , path );
@@ -1274,24 +1303,6 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) {
1274
1303
}
1275
1304
1276
1305
f_closedir (& dir );
1277
- } else if (strcasecmp (request -> method , "PUT" ) == 0 ) {
1278
- DWORD fattime = 0 ;
1279
- if (request -> timestamp_ms > 0 ) {
1280
- truncate_time (request -> timestamp_ms * 1000000 , & fattime );
1281
- }
1282
- FRESULT result = supervisor_workflow_mkdir_parents (fattime , path );
1283
- if (result == FR_WRITE_PROTECTED ) {
1284
- _reply_conflict (socket , request );
1285
- } else if (result == FR_EXIST ) {
1286
- _reply_no_content (socket , request );
1287
- } else if (result == FR_NO_PATH ) {
1288
- _reply_missing (socket , request );
1289
- } else if (result != FR_OK ) {
1290
- _reply_server_error (socket , request );
1291
- } else {
1292
- _reply_created (socket , request );
1293
- return true;
1294
- }
1295
1306
}
1296
1307
} else { // Dealing with a file.
1297
1308
if (strcasecmp (request -> method , "GET" ) == 0 ) {
0 commit comments